FPGA笔试面试题目记录

1 logic utilization

  • 题目:Rank the following operations from lowest utilization to highest. Assume that all variables are 32-bit integers,that the operations are implemented using LUTs ony and that the synthesiser will produce an optimal digital circuit.
    1.X = Y * 3
    2.X = Y * 8
    3.X = Y + 2
    4.X = Y + 32
  • 解析
    1.X = Y * 3
    在这里插入图片描述
    在这里插入图片描述

2.X = Y * 8
综合后的电路通过在低位补3个0来实现乘8。
在这里插入图片描述
在这里插入图片描述

3.X = Y + 2
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
4.X = Y + 32
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对比3、4,他们的不同在于加数。当x与2相加时,2的二进制形式为:2’b10,x的最低位可保持不变,其余位参与运算。当x与32相加时,32的二进制形式为:2’b10_0000,x的低5位可保持不变,其余位参与运算。

  • 答案:2431

2 MUX

  • 题目:
    ①当输入位宽为1bit时,用几个六输入查找表可以实现一个四选一数据选择器?
    ②当输入位宽为4bits时,用几个六输入查找表可以实现一个四选一数据选择器?
    ③用几个四选一数据选择器可以实现一个十选一数据选择器?并画出电路图。
    ④当输入位宽为1bit时,用几个六输入查找表可以实现一个十选一数据选择器?
  • 解析:
    ①当输入位宽为1bit时,用几个六输入查找表可以实现一个四选一数据选择器?
`timescale 1ns / 1ps

module mux_4_1_1b(
    input       din0,
    input       din1,
    input       din2,
    input       din3,
    input [1:0] sel ,
    output reg  dout
);

always@(*)
    case(sel)
        2'b00:dout = din0;
        2'b01:dout = din1;
        2'b10:dout = din2;
        2'b11:dout = din3;
        default:dout = din0;
    endcase

endmodule

在这里插入图片描述
在这里插入图片描述
由上图可以看到,一个LUT6可以实现一个4-1MUX。其中LUT6的I3和I4连接sel信号,其余4个输入连接din0~din1。
②当输入位宽为4bits时,用几个六输入查找表可以实现一个四选一数据选择器?

`timescale 1ns / 1ps

module mux_4_1(
    input [3:0] din0,
    input [3:0] din1,
    input [3:0] din2,
    input [3:0] din3,
    input [1:0] sel ,
    output reg [3:0] dout
);

always@(*)
    case(sel)
        2'b00:dout = din0;
        2'b01:dout = din1;
        2'b10:dout = din2;
        2'b11:dout = din3;
        default:dout = din0;
    endcase

endmodule

在这里插入图片描述
当输入数据的位宽是4bits时,使用4个LUT6即可实现4-1MUX,其中4个LUT6的输出分别对应输出的低位至高位。
③用几个四选一数据选择器可以实现一个十选一数据选择器?并画出电路图。

`timescale 1ns / 1ps


module mux_10_1(
    input  [3:0] din0,
    input  [3:0] din1,
    input  [3:0] din2,
    input  [3:0] din3,
    input  [3:0] din4,
    input  [3:0] din5,
    input  [3:0] din6,   
    input  [3:0] din7,
    input  [3:0] din8,
    input  [3:0] din9,
    input  [3:0] sel ,
    output [3:0] dout
);

wire [3:0] u0_dout;
wire [3:0] u1_dout;

mux_4_1 u0_mux_4_1(
    .din0(din0    ),
    .din1(din1    ),
    .din2(din2    ),
    .din3(din3    ),
    .sel (sel[1:0]),
    .dout(u0_dout )
);

mux_4_1 u1_mux_4_1(
    .din0(din4    ),
    .din1(din5    ),
    .din2(din6    ),
    .din3(din7    ),
    .sel (sel[1:0]),
    .dout(u1_dout )
);

mux_4_1 u2_mux_4_1(
    .din0(din8    ),
    .din1(din9    ),
    .din2(u0_dout ),
    .din3(u1_dout ),
    .sel (sel[3:2]),
    .dout(dout    )
);

endmodule

在这里插入图片描述
④当输入位宽为1bit时,用几个六输入查找表可以实现一个十选一数据选择器?

`timescale 1ns / 1ps

module mux_10_1_1b_v1(
    input   din0,
    input   din1,
    input   din2,
    input   din3,
    input   din4,
    input   din5,
    input   din6,   
    input   din7,
    input   din8,
    input   din9,
    input  [3:0] sel ,
    output  reg dout
);

always@(*)
    casex(sel)
        4'b0000:dout = din0;
        4'b0001:dout = din1;
        4'b0010:dout = din2;
        4'b0011:dout = din3;
        4'b0100:dout = din4;
        4'b0101:dout = din5;
        4'b0110:dout = din6;
        4'b0111:dout = din7;
        4'b10xx:dout = din8;
        4'b11xx:dout = din9;
        default:dout = din0;
    endcase

endmodule

在这里插入图片描述
以上代码对应的电路使用3个LUT6实现了一个10-1MUX,下面对比另一种10-1MUX的实现方式,并分析两种实现方式所使用的资源不同之处。

`timescale 1ns / 1ps

module mux_10_1_1b(
    input   din0,
    input   din1,
    input   din2,
    input   din3,
    input   din4,
    input   din5,
    input   din6,   
    input   din7,
    input   din8,
    input   din9,
    input  [3:0] sel ,
    output  reg dout
);

always@(*)
    case(sel)
        4'd0:dout = din0;
        4'd1:dout = din1;
        4'd2:dout = din2;
        4'd3:dout = din3;
        4'd4:dout = din4;
        4'd5:dout = din5;
        4'd6:dout = din6;
        4'd7:dout = din7;
        4'd8:dout = din8;
        4'd9:dout = din9;
        default:dout = din0;
    endcase

endmodule

在这里插入图片描述
观察发现,第二种实现方式相比第一种实现方式多使用了一个LUT5,这是因为case语句的不同。在第一种实现方式中,sel = 4’b10xx时选中din8,而在第二种实现方式中,只有当sel = 4’b1000时,dout才等于din8。

3 data selector(主观题)

  • 题目:该模块有四路32 bits输入,每一路输入有对应的输入有效信号。有一路32 bits输出,一路输出有效信号,以及一路dout_id指示现在的输出是哪一路。请实现该模块,可以用组合逻辑可以用时序逻辑,不能额外增加其他信号,进一步考虑如何实现更公平的输出。
    在这里插入图片描述
  • 答案:该题是主观题,没有标准答案,有才华的朋友们可以在评论区分享自己的思路~
    我的第一个思路是直接使用组合逻辑电路来实现,谁有效输出谁:
`timescale 1ns / 1ps

module data_select(
    input      [31:0] din0    ,
    input      [31:0] din1    ,
    input      [31:0] din2    ,
    input      [31:0] din3    ,
    input             din0_vld,
    input             din1_vld,
    input             din2_vld,
    input             din3_vld,
    output reg [31:0] dout    
    output reg        dout_vld,
    output reg [1:0]  dout_id
);


always @(*) begin
    if (din0_vld) begin
        dout = din0;
        dout_vld = 1;
        dout_id = 2'd0;
    end else if (din1_vld) begin
        dout = din1;
        dout_vld = 1;
        dout_id = 2'd1;
    end else if (din2_vld) begin
        dout = din2;
        dout_vld = 1;
        dout_id = 2'd2;
    end else if (din3_vld) begin
        dout = din3;
        dout_vld = 1;
        dout_id = 2'd3;
    end else begin
        dout = 0; 
        dout_vld = 0; 
        dout_id = 2'd0;
    end
end

endmodule

在这里插入图片描述
这样实现对应的电路是由2-1MUX组成的电路,这样实现有两个问题,第一个问题是四个输入有固定的优先级,不够“公平”,第二个问题是高优先级的输入会打断低优先级的输入。
因此,我想到了用一个寄存器来保存上次选择的输出,然后根据该寄存器的值选定不同的输入优先级。这样可以相对公平一些,但实现起来还是有很多细节需要考虑。这只是一个思路,我还没想好如何实现。

4 FIFO

  • 题目
    题目1:100个数据100个cycle写,写后休息100个cycle,2个数据2个cycle读,读后休息2个cycle,计算一下需要的FIFO深度
    题目2:有一个 FIFO 设计,输入时钟 100 MHz,输出时钟 80 MHz,输入数据模式是固定的,其中 1000 个时钟中有 800 个时钟传输连续数据,另外 200 个空闲,请问为了避免 FIFO 下溢/上溢,最小深度是多少
  • 解答
    题目1解答:考虑连续写入负载最大的情况,在连续写入的100个cycle内,共写了100个数据,每4个cycle读出2个数据,共读出了100/4 * 2 = 50个数据,所以需要的FIFO深度为100 - 50 = 50。
    题目2解答:输入模式固定,不考虑背靠背,计算在写入负载最大的情况共读出了多少个数据,在连续写入的800个时钟内共读出了800 * 80/100 = 640个数据,因此FIFO深度最小为:800 - 640 = 160。
  • 总结
    计算在连续写入负载最高的情况下(是否有背靠背),写数据个数与读数据个数之差

5 verilog中哪些语法可综合

以下选项中,不可综合的语法是(B)
A.for
B.force
C.task
D.generate

6 运算符

在verilog语言中,A=2‘b0x,B=2’b10,则表达式A&&B的结果为()

  • 答案:x

7 跨时钟域

多bit信号跨时钟同步常用的方式有()
A.乒乓buffer
B.打三拍
C.异步fifo
D.DMUX

  • 答案:A、C、D
  • 解答:对于B选项,多比特信号跨时钟域一般不采用打拍的方法,因为在源时钟域同一个上升沿变化的多位信号跳变可能有先有后(clock skew),当目的时钟采样这些信号时,采样得到的信号可能不在目的时钟的同一个时钟上升沿跳变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值