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),当目的时钟采样这些信号时,采样得到的信号可能不在目的时钟的同一个时钟上升沿跳变