面试宝典:FPGA必出笔试题

本文转载自:OpenFPGA

1、用状态机实现10010码的探测,如x=1001001000 z=0000100100(输出)

考察状态机(类似的题目很多,需要全理解)
Verilog 
module check(rst_i,clk_i,data_i,data_o);    input  rst_i,clk_i;    input  data_i;    output data_o;    reg[3:0] current_state,next_state;    parameter[3:0]        idle="0000",        state1="0001",        state2="0010",        state3="0100",        state4="1000";         always@(posedge clk_i or negedge rst_i)if (!rst_i)             current_state<=idle;< span="">         else             current_state<=next_state;always@(current_state,data_i)case(current_state)idle :    if (data_i==1)next_state=state1;else next_state=idle;
state1: if (data_i==0)next_state=state2;else next_state=idle;state2: if (data_i==0)next_state=state3;else next_state=idle;state3:    if (data_i==1)next_state=state4;else next_state=idle;state4:    if (data_i==0)next_state=idle;else next_state=idle;endcaseassign data_o= (current_state==state4);endmodule


VHDL

library    ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;

entity check is          port(    rst_i :in  std_logic;    clk_i :in  std_logic;data_i:in  std_logic;data_o:out std_logic);end entity;

--}} End of automatically maintained section

architecture behave of check is



   type state is (state_a,state_b,state_c,state_d,state_e);       signal current_state:state;    signal next_state:state;begin

   --type state is (state_a,state_b,state_c,state_d);


   process(rst_i,clk_i)beginif rst_i='1' then            data_o<='0';< span="">            current_state<=state_a;< span="">elsif rising_edge(clk_i)    then            current_state<=next_state;< span="">end if;end process;    

   process(current_state,data_i)begincase  current_state is when state_a => if data_i='1' then                               next_state<=state_b;< span="">else                               next_state<=state_a;< span="">end if;   when state_b =>    if data_i='0' then                               next_state<=state_c;< span="">else                               next_state<=state_a;< span="">end if; when state_c =>    if data_i='0' then                               next_state<=state_d;< span="">else                               next_state<=state_a;< span="">end if;
when state_d =>    if data_i='1' then                               next_state<=state_e;< span="">else                               next_state<=state_a;< span="">end if; when state_e =>    if data_i='0' then                               next_state<=state_a;      else                               next_state<=state_a;< span="">end if;   when others =>    null;end case;     end;
   data_o <='1' when current_state = state_e else '0';    
end;


2、169.6825 写出十六进制表示
A9.AEB85    0.6825×16取整、再用小数部分取整

3、 用D触发器实现2倍分频的逻辑电路?
Verilog描述:

module divide2( clk , clk_o, reset);    input     clk , reset;    output   clk_o;    wire in; reg out ;    always @ ( posedge clk or posedge reset)if ( reset)out <= 0;elseout <= in;assign in = ~out;assign clk_o = out;      endmodule

4、  试用VHDL或VERILOG、ABLE描述8位D触发器逻辑。

module dff8(clk , reset, d, q);input        clk;input        reset;input  [7:0] d;output [7:0] q;reg   [7:0] q;always @ (posedge clk or posedge reset)if(reset)q <= 0;elseq <= d;endmodule

5、 给了reg的setup,hold时间,求中间组合逻辑的delay范围。
Delay < period - setup - hold


6、 写异步D触发器的verilog module

module dff8(clk , reset, d, q);input        clk;input        reset;input   d;output  q;reg q;always @ (posedge clk or posedge reset)if(reset)q <= 0;elseq <= d;endmodule

7、 画状态机,接受1,2,5分钱的卖报机,每份报纸5分钱


  画出可能存在的状态。(后面有答案)


8、

8.png


记左寄存器为R1,右为R2
R1反馈回到自身需要的时间为7(=1+ 5*1+T_setup)
R2反馈加到自身需要的时间为6(=1+2*1+2+T_setup)
显然,最小周期不能小于7,即T>=7。(否则,R1不能正确采样到其反馈值)
所以答案分别是:
1)1+5*1+2+1=9
2)1+5*1+2+1- T_skew = 8
3)1+5*1+2+1-T_skew = 5,但因为T>=7,所以Tmin=7
4)记T_skew = t2 - t1,
则正偏时,T_skew必须小于R1到R2的最小延时(不包括Tsetup),即T_skew<6(=1+3*1+2),以保证,r2采样到正确的值
负偏差时,T- (T_skew的绝对值)必须大于或等于R1到R2的最大延时9,即(T_skew的绝对值)<=t-9
综合一下,就是(9-T) ≤ T_skew < 6
系统时钟周期 Tclk>=Tco+T logic delay max+T2setup-Tskew      


考虑当时钟歪斜为正的时候
正偏时,不但要考虑T>=Tco+Tlogic+Tsu-Tskew(且只需在T<9的情况下考虑),还要考虑(tco+tlogic)min>Tskew+Thold(但这里Thold没给出就当作是零),否则会有数据冲突,使得R2不能正确采样前一周期从R1传来的值,所以就是Tskew<(tco+tlogic)min=6
所以正偏时,9-T≤  Tskew<6
负偏时,根据T>=Tco+Tlogic+Tsu-Tskew,就可以得到9-T≤  Tskew。
而不等式(Tco+Tlogic)min >Tskew+Thold,因Thold已经当作零,Tskew为负值,恒成立。
所以负偏时9-T≤  Tskew<=0
将两种请况综合就是9-T≤  Tskew<6< span="">


9、 时钟周期为T,触发器D1的寄存器到输出时间最大为T1max,最小为T1min。组合逻辑电路最大延迟为T2max,最小为T2min。问,触发器D2的建立时间T3和保持时间应满足什么条件。(华为)


Tsu< T-T1max-T2max;Tth<t1min+t2min< span=""></t1min+t2min<>


10、说说静态、动态时序模拟的优缺点。(威盛VIA 2003.11.06 上海笔试试题)


静态时序分析是采用穷尽分析方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。它不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计,因此静态时序分析已经越来越多地被用到数字集成电路设计的验证中。
动态时序模拟就是通常的仿真,因为不可能产生完备的测试向量,覆盖门级网表中的每一条路径。因此在动态时序分析中,无法暴露一些路径上可能存在的时序问题;


11、 用一个二选一mux和一个inv实现异或。(飞利浦-大唐笔试)

input a,b;output c;assign c=a?(~b):(b);

12、 A,B,C,D,E进行投票,多数服从少数,输出是F(也就是如果A,B,C,D,E中1的个数比0多,那么F输出为1,否则F为0),用与非门实现,输入数目没有限制。


先画出卡诺图来化简,化成与或形式,再两次取反便可。


13、 latch与register的区别,为什么现在多用register.行为级描述中latch如何产生的。


latch是电平触发,register是边沿触发,register在同一时钟边沿触发下动作,符合同步电路的设计思想,而latch则属于异步电路设计,往往会导致时序分析困难,不适当的应用latch则会大量浪费芯片资源。


14、 写异步D触发器的verilog module。(扬智电子笔试)

module dff8(clk , reset, d, q);input        clk;input        reset;input  [7:0] d;output [7:0] q;reg   [7:0] q;always @ (posedge clk or posedge reset)if(reset)q <= 0;elseq <= d;endmodule

15、 用D触发器实现2倍分频的Verilog描述? (汉王笔试)

module divide2( clk , clk_o, reset);   input     clk , reset;   output   clk_o;   wire in;reg out ;   always @ ( posedge clk or posedge reset)if ( reset)out <= 0;elseout <= in;assign in = ~out;assign clk_o = out;     endmodule

16、 饮料10分钱,硬币有5分、10分两种,投币一次或者两次,累计大于或者等于10分时,饮料弹出,有多余的硬币,也会弹出,由此可知,可以分为两个状态,一个是0分,一个是5分。累计的币值等于10分,则弹出饮料,找零0分;累计的币值为15分,则弹出饮料,找零5分。

状态转移图:

状态转移图.png


代码设计:

代码设计1.png

代码设计2.png

17、 用verilog/vhdl写一个fifo控制器(包括空,满,半满信号)。(飞利浦-大唐笔试)

FIFO 是先入先出存储器的缩写,FIFO 控制器在数字系统中被大量使用,可以作为数据缓存

使用。时钟同步的FIFO 控制器接口如下图所示,主要接口信号定义如下:

RST_N:异步复位信号,当RST_N 为低电平时,FULL 输出‘0’,EMPTY 信号输出‘1’

电平,FIFO 指针指向0,FIFO 被清空;

CLK:时钟信号,输出信号与CLK 信号同步;

DATAIN:数据输入信号,8 位总线;

RD:读有效信号,高电平有效,当RD 位高时,在时钟信号CLK 的上升沿,DATAOUT 输

出一个8 位的有效数据;

WR:写有效信号,当WR 为高电平时,在CLK 的上升沿,从DATAIN 信号向存储器写入

一个8 位的有效数据;

DATAOUT:数据输出信号,8 位总线,在CLK 的上升沿,当RD 为高电平时,从FIFO 中

输出一个8 位的数据;

FULL:存储器写满标志信号,高电平时表示存储器中的数据已经写满;

EMPTY:存储器读空标志信号,高电平时表示存储器中的数据已经被读空了。

要求:用Verilog 写一个8x16 的FIFO,完成先入先出的功能,并且在FIFO读空时输出EMPTY

有效信号,读指针RP 不再移动;FIFO 写满时输出FULL 有效信号,并且即使WR 有效也

不再向存储单元中写入数据(写指针WP 不再移动)。

存储单元使用一个二维数组来建模。注意存储单元的地址在读或者写到最高地址时要能回到最低值。

module fifo_mem(data,clk,rstN,wrN,rdN,empty,full);inout [7:0] data;input clk,rstN,wrN,rdN;output empty,full;reg [4:0]  _cntr,rd_cntr;wire [3:0] add;ram16X8 ram(.data(data),.addr(addr),.wrN(wrN),.oe(wrN));always @(posedge clk or negedge rstN)if(!rstN) wr_cntr<=0;else if (!wrN) wr_cntr<=wr_cntr+1;always @ (posedge clk or negedge rstN) if(!rstN) rd_cntr<=0; else if(!rdN) rd_cntr<=rd_cntr+1;assign addr=wrN?rd_cntr [3:0]: wr_cntr [3:0];assign empty=(wr_cntr [3:0] == rd_cntr [3:0])&&!(wr_cntr[4]^rd_cntr[4]);assign full=(wr_cntr [3:0] ==rd_cntr [3:0])&&(wr_cntr[4]^rd_cntr[4]);endmodule


18、 用你熟悉的设计方式设计一个可预置初值的7进制循环计数器,15进制的呢?

module counter7(clk,rst,load,data,cout);

input clk,rst,load;

input [2:0] data;

output reg [2:0] cout;

always@(posedge clk)

begin

if(!rst)

cout<=3’d0;

else if(load)

cout<=data;else if(cout>=3’d6)  cout<=3’d0;else  cout<=cout+3’d1;endendmodule


最新文章

最新文章