分享

电路

 昵称48777181 2019-06-18
我来填一点
1.模拟电路设计 基础知识(笔试时候容易遇到的题目) 1.最基本的如三极管曲线特性(太低极了点) 2.基本放大电路,种类,优缺点,特别是广泛采用差分结构的原因 3.反馈之类,如:负反馈的优点(带宽变大) 4.频率响应,如:怎么才算是稳定的,如何改变频响曲线的几个方法 5.锁相环电路组成,振荡器(比如用D触发器如何搭) 6.A/D电路组成,工作原理 如果公司做高频电子的,可能还要RF知识,调频,鉴频鉴相之类,不一一列举 太底层的MOS管物理特性感觉一般不大会作为笔试面试题,因为全是微电子物理,公 式推导太罗索,除非面试出题的是个老学究 ic设计的话需要熟悉的软件adence, Synopsys, Advant,UNIX当然也要大概会操作 实际工作所需要的一些技术知识(面试容易问到) 如电路的低功耗,稳定,高速如何做到,调运放,布版图注意的地方等等,一般会针 对简历上你所写做过的东西具体问,肯定会问得很细(所以别把什么都写上,精通之类的 词也别用太多了),这个东西各个人就不一样了,不好说什么了。 2.数字电路设计 当然必问Verilog/VHDL,如设计计数器 逻辑方面数字电路的卡诺图化简,时序(同步异步差异),触发器有几种(区别,优 点),全加器等等 比如:设计一个自动售货机系统,卖soda水的,只能投进三种硬币,要正确的找回钱数 1.画出fsm(有限状态机) 2.用verilog编程,语法要符合fpga设计的要求 系统方面:如果简历上还说做过cpu之类,就会问到诸如cpu如何 工作,流水线之类 的问题 3.单片机、DSP、FPGA、嵌入式方面(从没碰过,就大概知道几个名字胡扯几句,欢迎拍 砖,也欢迎牛人帮忙补充) 如单片机中断几个/类型,编中断程序注意什么问题 DSP的结构(冯.诺伊曼结构吗?) 嵌入式处理器类型(如ARM),操作系统种类(Vxworks,ucos,winCE,linux),操作系统方 面偏CS方向了,在CS篇里面讲了 4.信号系统基础 拉氏变换与Z变换公式等类似东西,随便翻翻书把 如.h(n)=-a*h(n-1) b*δ(n) a.求h(n)的z变换 b.问该系统是否为稳定系统 c.写出F IR数字滤波器的差分方程 以往各种笔试题举例 利用4选1实现F(x,y,z)=xz yz' 用mos管搭出一个二输入与非门。 用传输门和倒向器搭一个边沿触发器 用运算放大器组成一个10倍的放大器 微波电路的匹配电阻。 名词解释,无聊的外文缩写罢了,比如PCI、ECC、DDR、interrupt、pipeline IRQ,BIOS,USB,VHDL,VLSI VCO(压控振荡器) RAM (动态随机存储器),FIR IIR DFT(离散 傅立叶变换) 或者是中文的,比如 a量化误差 b.直方图 c.白平衡 共同的注意点1.一般情况下,面试官主要根据你的简历提问,所以一定要对自己负责,把简历上的东 西搞明白;2.个别招聘针对性特别强,就招目前他们确的方向的人,这种情况下,就要投其所好, 尽量介绍其所关心的东西。 3.其实技术面试并不难,但是由于很多东西都忘掉了,才觉得有些难。所以最好在面试 前把该看的书看看。 4.虽然说技术面试是实力的较量与体现,但是不可否认,由于不用面试官/公司所专领域 及爱好不同,也有面试也有很大的偶然性,需要冷静对待。不能因为被拒,就否认自己 或责骂公司。 5.面试时要take it easy,对越是自己钟情的公司越要这样。 1. 集成电路设计前端流程及工具。 2。FPGA和ASIC的概念,他们的区别 3。LATCH和DFF的概念和区别 4。用DFF实现二分频。 5。用VERILOG或VHDL写一段代码,实现消除一个glitch 6。给一个表达式f=xxxx xxxx xxxxx xxxx用最少数量的与非门实现(实际上就是化简) 7。用VERILOG或VHDL写一段代码,实现10进制计数器。 8。给出一个门级的图,又给了各个门的传输延时,问关键路径是什么,还问给出输入,使得输出依赖于关键路径。 9。A,B,C,D,E进行投票,多数服从少数,输出是F(也就是如果A,B,C,D,E中1的个数比0多,那么F输出为1,否则F为0),用与非门实现,输入数目没有限1. 可参考各EDA厂商的开发工具 2. FPGA与ASIC的可参阅各种EDA相关书籍。 3. LATC是H锁存器,DFF是触发器,其电路形式完全不同。 4. always @(posedge clk) if (reset) begin sel <= 1; clk1 <= 1; clk2 <= 1; end else begin sel <= ~sel; if (sel) clk1 <= ~clk1; else clk2 <= ~clk2; end 5. glitch主要发生在组合逻辑电路输出,可以加DFF输出稳定信号 6,7,8,9: 。。。制。 2. 负数与正数相乘的问题 3. 1010(-6)*0010(2) 用补码相乘时应该进行相应的符号扩展,比如上面是4bit相乘,结果应该为8bit。这样符号扩展后分别为11111010和00000010,然后再用这两个数直接相乘,结果为111110100,取其低8位11110100,作为-6*2的结果。这也是个补码形式,再判断一下高位恢复为原码,得到结果。 以前讨论过相关问题,可以翻出来看看 检测信号的上升沿LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY sync IS PORT(clk: IN STD_LOGIC; rst: IN STD_LOGIC; sync_in: IN STD_LOGIC; sync_out: OUT STD_LOGIC); END sync; ARCHITECTURE arch OF sync IS SIGNAL sync_int1, sync_int2: STD_LOGIC; BEGIN --------------------------------------------------------- PROCESS(clk, rst, sync_in) BEGIN IF rst='0' THEN sync_out<='0'; ELSIF rising_edge(clk) THEN sync_int1<=sync_in; sync_int2<=sync_int1; IF (sync_int1='1' AND sync_int2='0') THEN sync_out<='1'; ELSE sync_out<='0'; END IF; END IF; END PROCESS; END arch; 并入串出?  library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity piso is port( datain :in std_logic_vector(39 downto 0); clk : in std_logic; nLoad:in std_logic; data_out: out std_logic); end piso; architecture Behavioral of piso is signal q: std_logic_vector(39 downto 0); begin process (nLoad,clk) begin if nLoad= '0' then q<=datain; elsif clk'event and clk='1' then q(1)<=q(0); for i in 1 to 39 loop q(i)<=q(i-1); end loop; end if; end process; process (nLoad,clk) begin if nLoad='0' then data_out<='0'; elsif clk'event and clk='1' then data_out <=q(39); end if; end process; end Behavioral; 把所有的39改成15就可以了 有一些基本概念我可能还不太清楚,说错的地方,请大家批评指教。 我要设计的是is-95cdma系统的48阶fir滤波器。 输入串行数据(每个clk输入1位) 输入数据宽度为1位,系数h[0]=-0.025288315(十进制)=111111_1111100111(16位二进制,_为小数点位置,_前面是符号扩展),-h[0]=+0.025288315(十进制)000000_0000011001(16位二进制)。其他系数略。 我用的是映射的方法,即不用乘法,只对应由查找表查出的结果,输入1时,映射为+1,查表输出h[0],输入0时,映射为-1,查表输出-h[0]。再送入加法器求48个系数的和。 系数宽度16位,输出宽度22位(防溢出) datain=1 ,dataout=16116a(十六进制)=0101100001000101101010(22位二进制) 这是48个正系数的和(这里的正系数不一定全是正数,而只是标准,所以把它看作“正数”) datain=0 ,dataout=19ee96(十六进制)=0110011110111010010110(22位二进制) 这是48个负系数的和。 这个结果我对照十进制的数运算结果验证了一下,是对的,但是只能取22位的后16位来计算,因为高位的都是加法的进位溢出。 我主要由两个问题: 1)这种映射法,恕我愚钝,根本没明白(我也是看的论文,但没有明白其真正含义),因为它和普通的比如m位输入和n位的系数相乘得到m+n位的结果,思路完全不一样。这个1,0映射为+1,-1,和普通的输入(m位二进制数代表一个x(n))有何关系?我的到16116a,19ee96这些结果还要累加吗? (此问题可能比较愚蠢,欢迎扔鸡蛋) 2)我运算的是有符号数,那溢出的这些多出的位怎么处理?因为下一步这些数据还要送到下一个模块处理。保留的话,多出的哪些位显然没用。扔掉的话,行吗? 学了FOR LOOP的用法以后,有点想法 那么在此基础上怎么实现并口的输出呢? 如: Q(0)<=DIN; FOR I IN 1 DOWNTO 7 LOOP Q(I)<=Q(I-1); END LOOP; OP<=Q; OP 定义为STD_LOGIC_vector(7 downto 0) 我总感觉每次触发输出的都是在Q(7)口,而且该值就是DIN在8个周期前的值 那么要是想实现DIN 8个连续数据的同时输出,应该怎么做? 感觉每次触发输出的都是在Q(7)口 这句话不是很明白。 反正这样的转换很快的,只要有触发,马上可以完成分析如下: q(0)->q(1),然后q(1)->q(2),然后q(2)->q(3)........q(6)->q(7) 实际上只是延迟了几个周期,也就是q(7)<=din, 并没有实现串行向并行的转换 不大理解用这个for loop语句如何实现串并转换的 望告知把 Q(0)<=DIN; FOR I IN 1 DOWNTO 7 LOOP Q(I)<=Q(I-1); END LOOP; 放在进程里面就可以。同志,做cpld/fpga设计的时候需要记住一点,verilog是硬件设计而不是软件编程,所以,做好不要使用for循环这样的语句,太浪费资源了! 思考的时候要学会使用DFF这应该是个移位寄存的电路,也是DIN 8个连续数据的同时输出,只不过是移位1次,就并处一次。其实隔8个周期看一下输出,就是你要的结果了。 真要串入8位,并出1次,要一个计数器或状态机也行啊去构建自己想要的电路! 这是我写的,5分频的,改变计数器,可以是别的奇数分频 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity div3 is Port ( clk : in std_logic; rst : in std_logic; clk3: out std_logic); end div3; architecture Behavioral of div3 is signal c0 : std_logic; signal c1 : std_logic; signal cnt : std_logic_vector(2 downto 0); begin cnt_gen:process(clk,rst) begin if rst ='1' then cnt <= "100"; c0 <= '0'; c1 <= '0'; elsif clk'event and clk='1' then if cnt /= 4 then cnt <= cnt 1; elsif cnt=4 then cnt <= (others=>'0'); end if; if cnt=4 then c0 <= '1'; elsif cnt=2 then c0 <= '0'; end if; end if; end process; process(clk,rst) begin if rst ='1' then c1 <= '0'; elsif clk'event and clk='0' then if cnt=4 then c1 <='1'; elsif cnt=2 then c1 <= '0'; end if; end if; end process; clk3 <= c0 and c1; end Behavioral; c0,c1一个在时钟的上升沿变化,一个在下降沿变化,所以两个会有半个周期的差,and以后就可以得到想要得分频了。你可以仿真波形看看 两个时钟,一个为64K的时钟,一个为2.048M时钟,怎样检测64K时钟的上升沿?既检测到64K的时钟的上升沿就产生一个控制信号。怎样做?做出来你也能进UT....... 这跟检测信号的变化有什么区别吗? 设64K时钟为信号,速率X2=128K 采样时钟128K*4=512K(有2.048M更好了) 加1状态机就可以了! 如果要求产生的控制信号与64K时钟上升沿对齐的话,就有点麻烦了! -- There is rising edge of clk64k detected when Ctrl signal is high. library IEEE; use IEEE.std_logic_1164.all; entity det is port( rst: in std_logic; clk64k: in std_logic; clk2m: in std_logic; ctrl: out std_logic); end det; architecture behv of det is signal clk64k_q1: std_logic; signal clk64k_q2: std_logic; begin process(rst,clk2m) begin if(rst='0') then clk64k_q1<= '0'; clk64k_q2<= '0'; elsif(clk2m'event and clk2m='1') then clk64k_q1<= clk64k; clk64k_q2<= clk64k_q1; end if; end process; ctrl<= '1' when clk64k_q1='1' and clk64k_q2='0' else '0'; end behv; 2.048MHz/64K=32 其实就是检测64KHz信号上升沿位于上述32象限的哪个,当然也就是可以用状态机(2MHz)实现; 当然也不是需要32个register才能实现的,因为在32次检测过程中只有16个连续的0或1,那么也只需2个register保存状态就可以了。 既然能检测到64KHz信号的变化,那么剩下的事情就不难了,无非就是对该状态信号作一定处理,如要2M脉宽,上面便是,如要与64K上升沿同步,那就将2M脉宽同64K信号作些处理。建议用状态机FSM来实现,这是由于一旦检测到符号要求的信号,那么剩下的处理就会比较简单,都是利用该信号作进一步的处理--至少前面的FSM将这个变化(我认为变化比边沿合适)是确定的。---扯远了! 呵呵,刚在别的版块发了个关于按键去抖动的帖子是VHDL的可以参考下 signal a0,a1; process(clk) begin if(clk'event and clk='1') then a1<=a0; a0<=key; ---key 为按键信号 end if; end process; process(a0,a1) begin keyout<=key and a0 and (not a1); --keyout即为所要得到的单脉冲 end process; ****************************************************************** 分频技术几点 ****************************************************************** 10.1分频 9次10分频和1次11分频 因为 (9×10+1×11)/(9+1)=10.1 ****************************************************************** 实例:用于实现N-0.5分频 ****************************************************************** begin -------异或门 clk <= inclk xor divide2; --------inclk(输入时钟) -------模N减法计数器 process(clk) if (clk'event and clk='1') then if (count="0000") then count <= present-1; --------outclk(输出时钟) ,present 预置分频值,即N值 outclk <= '1'; else count <= count-1; outclk <= '0'; end if; end if ; end process; ------2分频器 process(outclk) begin if (outclk'event and outclk='1') then divide2 <= not divide2; end if; end process; ****************************************************************** 3分频实例: ****************************************************************** LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY div3 IS PORT ( clk_in :in std_logic; clk_out :out std_logic); END div3; ARCHITECTURE behav OF div3 IS SIGNAL clk1,clk2:std_logic_vector(1 DOWNTO 0); BEGIN PROCESS1:PROCESS(clk_in) BEGIN IF clk_in'event AND clk_in='1' THEN CASE clk1 is WHEN "00" => clk1 <= "01"; WHEN "01" => clk1 <= "11"; WHEN "11" => clk1 <= "00"; WHEN OTHERS => clk1 <= "00"; END CASE; END IF; END PROCESS PROCESS1; PROCESS2:PROCESS(clk_in) BEGIN IF clk_in'event AND clk_in='0' THEN CASE clk2 IS WHEN "00" => clk2 <= "01"; WHEN "01" => clk2 <= "11"; WHEN "11" => clk2 <= "00"; WHEN OTHERS => clk2 <= "00"; END CASE; END IF; END PROCESS PROCESS2; clk_out <= '1' WHEN(clk1 AND clk2)=0 ELSE '0'; END behav 1。集成电路设计前端流程及工具。 2。FPGA和ASIC的概念,他们的区别 3。LATCH和DFF的概念和区别 4。用DFF实现二分频。 5。用VERILOG或VHDL写一段代码,实现消除一个glitch 6。给一个表达式f=xxxx xxxx xxxxx xxxx用最少数量的与非门实现(实际上就是化简) 7。用VERILOG或VHDL写一段代码,实现10进制计数器。 8。给出一个门级的图,又给了各个门的传输延时,问关键路径是什么,还问给出输入,使得输出依赖于关键路径。 9。A,B,C,D,E进行投票,多数服从少数,输出是F(也就是如果A,B,C,D,E中1的个数比0多,那么F输出为1,否则F为0),用与非门实现,输入数目没有限制 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多