登录站点

用户名

密码

FPGA笔试问题整理归纳(四)

已有 1302 次阅读  2009-09-28 08:45   标签笔试  FPGA  归纳 

独立晶振
一个10m一个15m 10m15m的传输数据问怎么实现 我说小数分频成10m内部时钟,再采样 求正解
数据量少用握手信号,数据量多用FIFO,如果有很高的时钟资源可以考虑用高时钟采样,但是不是很好的方法,分频成5M是肯定不行的,分成相同频率也是异步信号
 1.setup
holdup时间,区别.
      2.
多时域设计中,如何处理信号跨时域
      3.latch
register的区别,为什么现在多用register.行为级描述中latch如何产生的
      4.BLOCKING NONBLOCKING
赋值的区别
      5.MOORE
MEELEY状态机的特征
      6.IC
设计中同步复位与 异步复位的区别
      7.
实现NJohnson Counter,N=
   8.
FSM实现101101的序列检测模块
2.
多时域设计中,如何处理信号跨时域:
  
情况比较多,如果简单回答的话就是:跨时域的信号要经过同步器同步,防止亚稳态传播。例如:时钟域1中的一个信号,要送到时钟域2,那么在这个信号送到时钟域2之前,要先经过时钟域2的同步器同步后,才能进入时钟域2。这个同步器就是两级d触发器,其时钟为时钟域2的时钟。这样做是怕时钟域1中的这个信号,可能不满足时钟域2中触发器的建立保持时间,而产生亚稳态,因为它们之间没有必然关系,是异步的。这样做只能防止亚稳态传播,但不能保证采进来的数据的正确性。所以通常只同步很少位数的信号。比如控制信号,或地址。当同步的是地址时,一般该地址应采用格雷码,因为格雷码每次只变一位,相当于每次只有一个同步器在起作用,这样可以降低出错概率,象异步FIFO的设计中,比较读写地址的大小时,就是用这种方法。
  
如果两个时钟域之间传送大量的数据,可以用异步FIFO来解决问题。

6.IC设计中同步复位与 异步复位的区别
  
如果光说概念的话:同步复位在时钟沿采复位信号,完成复位动作。
 
异步复位不管时钟,只要复位信号满足条件,就完成复位动作。
  
象芯片的上电复位就是异步复位,因为这时时钟振荡器不一定起振了,可能还没有时钟脉冲。异步复位很容易受到复位端信号毛刺的影响,比如复位端信号由组合逻辑组成,那组合逻辑输出产生的冒险,就会使触发器错误的复位。


4.BLOCKING NONBLOCKING
赋值的区别
  
这个问题可参考的资料很多,讲的都很透彻,可以找一下。基本用法就是常说的"组合逻辑用BLOCKING,时序逻辑用NONBLOCKING"

3.latchregister的区别,为什么现在多用register.行为级描述中latch如何产生的
     
区别不多说。为什么避免使用latch,因为设计中用latch会使设计后期的静态时序分析变的困难(必须用的地方当然另当别论)。
     
行为级描述中latch产生的原因:多由于构造组合逻辑电路时,使用ifcase语句,没有把所有的条件给足,导致没有提到的条件,其输出未知。或者是每个条件分支中,没有给出所有输出的值,这就会产生latch。所以构造组合逻辑电路时,其always语句中的敏感信号必须包括所有的输入端,每个条件分支必须把所有的输出端的值都给出来。
1.setup
holdup时间,区别.
建立时间:触发器在时钟沿来到前,其数据输入端的数据必须保持不变的时间
保持时间:触发器在时钟沿来到后,其数据输入端的数据必须保持不变的时间
1.
模拟电路设计
  
基础知识(笔试时候容易遇到的题目)
   1.
最基本的如三极管曲线特性(太低极了点)
   2.
基本放大电路,种类,优缺点,特别是广泛采用差分结构的原因
   3.
反馈之类,如:负反馈的优点(带宽变大)
   4.
频率响应,如:怎么才算是稳定的,如何改变频响曲线的几个方法
   5.
锁相环电路组成,振荡器(比如用D触发器如何搭)
   6.A/D
电路组成,工作原理
  
如果公司做高频电子的,可能还要RF知识,调频,鉴频鉴相之类,不一一列举
  
太底层的MOS管物理特性感觉一般不大会作为笔试面试题,因为全是微电子物理,公
式推导太罗索,除非面试出题的是个老学究  
   ic
设计的话需要熟悉的软件adence, Synopsys, AdvantUNIX当然也要大概会操作
  
实际工作所需要的一些技术知识(面试容易问到)
  
如电路的低功耗,稳定,高速如何做到,调运放,布版图注意的地方等等,一般会针
对简历上你所写做过的东西具体问,肯定会问得很细(所以别把什么都写上,精通之类的
词也别用太多了),这个东西各个人就不一样了,不好说什么了。
2.
数字电路设计
  
当然必问Verilog/VHDL,如设计计数器
  
逻辑方面数字电路的卡诺图化简,时序(同步异步差异),触发器有几种(区别,优
点),全加器等等
比如:设计一个自动售货机系统,卖soda水的,只能投进三种硬币,要正确的找回钱数
       1.
画出fsm(有限状态机)
       2.
verilog编程,语法要符合fpga设计的要求
  
系统方面:如果简历上还说做过cpu之类,就会问到诸如cpu如何 工作,流水线之类
的问题
3.
单片机、DSPFPGA、嵌入式方面(从没碰过,就大概知道几个名字胡扯几句,欢迎拍
砖,也欢迎牛人帮忙补充)
如单片机中断几个/类型,编中断程序注意什么问题
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数字滤波器的差分方程
以往各种笔试题举例
利用41实现F(x,y,z)=xz+yz'
mos管搭出一个二输入与非门。 用传输门和倒向器搭一个边沿触发器
用运算放大器组成一个10倍的放大器
微波电路的匹配电阻。
名词解释,无聊的外文缩写罢了,比如PCIECCDDRinterruptpipeline
IRQ,BIOS,USB,VHDL,VLSI VCO(
压控振荡器) RAM (动态随机存储器)FIR IIR DFT(离散
傅立叶变换)
或者是中文的,比如 a量化误差  b.直方图  c.白平衡


共同的注意点1.一般情况下,面试官主要根据你的简历提问,所以一定要对自己负责,把简历上的东
西搞明白;2.个别招聘针对性特别强,就招目前他们确的方向的人,这种情况下,就要投其所好,
尽量介绍其所关心的东西。
3.
其实技术面试并不难,但是由于很多东西都忘掉了,才觉得有些难。所以最好在面试
前把该看的书看看。
4.
虽然说技术面试是实力的较量与体现,但是不可否认,由于不用面试官/公司所专领域
及爱好不同,也有面试也有很大的偶然性,需要冷静对待。不能因为被拒,就否认自己
或责骂公司。
5.
面试时要take it easy,对越是自己钟情的公司越要这样。
集成电路设计前端流程及工具。
2
FPGAASIC的概念,他们的区别
3
LATCHDFF的概念和区别
4
。用DFF实现二分频。
5
。用VERILOGVHDL写一段代码,实现消除一个glitch
6
。给一个表达式f=xxxx+xxxx+xxxxx+xxxx用最少数量的与非门实现(实际上就是化简)
7
。用VERILOGVHDL写一段代码,实现10进制计数器。
8
。给出一个门级的图,又给了各个门的传输延时,问关键路径是什么,还问给出输入,使得输出依赖于关键路径。
9
A,B,C,D,E进行投票,多数服从少数,输出是F(也就是如果A,B,C,D,E1的个数比0多,那么F输出为1,否则F0),用与非门实现,输入数目没有限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
789:。。。制。
负数与正数相乘的问题
1010
-6*00102
用补码相乘时应该进行相应的符号扩展,比如上面是4bit相乘,结果应该为8bit。这样符号扩展后分别为1111101000000010,然后再用这两个数直接相乘,结果为111110100,取其低811110100,作为-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就可以了
有一些基本概念我可能还不太清楚,说错的地方,请大家批评指教。
我要设计的是is95cdma系统的48fir滤波器。
输入串行数据(每个clk输入1位)
输入数据宽度为1位,系数h[0]=-0.025288315(十进制)=111111_111110011116位二进制,_为小数点位置,_前面是符号扩展),-h[0]=0.025288315(十进制)000000_000001100116位二进制)。其他系数略。
我用的是映射的方法,即不用乘法,只对应由查找表查出的结果,输入1时,映射为+1,查表输出h[0],输入0时,映射为-1,查表输出-h[0]。再送入加法器求48个系数的和。
系数宽度16位,输出宽度22位(防溢出)
datain=1 ,dataout=16116a
(十六进制)=010110000100010110101022位二进制)
这是48个正系数的和(这里的正系数不一定全是正数,而只是标准,所以把它看作"正数"
datain=0 ,dataout=19ee96
(十六进制)=011001111011101001011022位二进制)
这是48个负系数的和。
这个结果我对照十进制的数运算结果验证了一下,是对的,但是只能取22位的后16位来计算,因为高位的都是加法的进位溢出。
我主要由两个问题:
1)
这种映射法,恕我愚钝,根本没明白(我也是看的论文,但没有明白其真正含义),因为它和普通的比如m位输入和n位的系数相乘得到mn位的结果,思路完全不一样。这个10映射为+1,-1,和普通的输入(m位二进制数代表一个xn))有何关系?我的到16116a19ee96这些结果还要累加吗?
(此问题可能比较愚蠢,欢迎扔鸡蛋)
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),而且该值就是DIN8个周期前的值
那么要是想实现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次,要一个计数器或状态机也行啊去构建自己想要的电路!

 

上一篇: AD/DA的分类与主要技术指标 下一篇: FPGA笔试问题整理归纳(五)

分享 举报