笔试题-2023-思特威-FPGA【附答案及解析】
1、[单选)32bit位宽的异步fifo,写时钟频率200MHz,读时钟频率1 00MH,在数据包大小为8KB,包间隔足够大时,fifo的最小深度为( )
A.520
B.830
C.1030
D.1550
答案:D
解析*:
最小深度计算如下:
对于写时钟,每秒钟可以写入200M/8 = 25M个字节,每个字节需要1个存储单元,因此每秒钟需要25M个存储单元。
对于读时钟,每秒钟可以读取100M/8 = 12.5M个字节,每个字节需要1个存储单元,因此每秒钟需要12.5M个存储单元。
由于是异步FIFO,读写时钟的差异需要考虑存储深度。假设FIFO深度为D,包大小为P,则有:
D * 8 = 2 * P
即:
D = 2P/8 = P/4
将每个时钟周期需要的存储单元数量带入到上式中,可得:
D >= max(25M/200M, 12.5M/100M) / 4 * 8KB = 625 / 4 * 8KB = 125KB
因此,FIFO的最小深度应该为125KB / 8B = 15625B = 15.625KB。
由于FIFO深度通常为2的整数次幂,因此最小深度为2^14 = 16384 = 16KB,因此答案为D. 1550。
2、[单选] a=5’b1101;b=5’ b10101:下面哪些是正确的( )
A.~a =5'b00110
B.a&b=5'b11001
C.alb=5'b11101
答案:C
解析*:
a完整写法5'b01101,选项A为按位取反,结果为5'b10010,所以A错
选项B为按位与,结果为5'b00101,B错
选项C为按位或,结果正确。
3、用二进制补码运算推导出-20-50的结果(1bit符号位,7bit数据位)
答案:-49
解析*:
首先将-20和50表示为7位二进制补码:
-20的二进制补码为:101100(因为-20=-(16+4)=-(2^4+2^2)=1×2^6+0×2^5+1×2^4+1×2^3+0×2^2+0×2^1+0×2^0,所以其符号位为1,其余位为20的二进制码的补码)
50的二进制补码为:00110010
下面进行减法操作,首先将50取反(按位取反再加1),得到其补码的负数:11001110
然后将两个数相加,注意要将补码的符号位也相加:
101100
+11001110
11100010
最后的结果11100010是补码形式,需要将其转换为十进制才能得到结果。由于最高位为1,表示为负数。因此,需要将其符号位取反,即得到01100010,然后将其转换为十进制:
01100010 = 0×2^6 + 1×2^5 + 1×2^4 + 0×2^3 + 0×2^2 + 0×2^1 + 1×2^0 = 32 + 16 + 1 = 49
因此,-20-50=-49。
4、通过代码实现对序列”0001”的检测
示例:
输入:0100001
输出: 0000001
解释:序列“0001"出现在最未尾
初始代码如下,可直接使用:
答案及解析*:
以下是一个简单的 Verilog 代码实现,用于检测序列 “0001” 是否在输入流中出现:
module seq_detect(input clk,input rst,input data_in,output reg [3:0] state,output reg data_out);parameter S0 = 4’d0;parameter S1 = 4’d1;parameter S2 = 4’d2;parameter S3 = 4’d3;parameter S4 = 4’d4;
endmodule
该代码使用有限状态机来检测序列 “0001”,每个状态都对应序列的一个位置。当从 S3 状态转移到 S4 状态时,表示序列已经完成匹配,将输出标志位置 1。在复位时,状态被重置为 S0,并将输出标志位清零。
5、sig a是clk a时钟域下的脉冲信号,如何将其同步到clk b时钟域下,并产生该时钟域下的同步信号sig b,其中,clk a, clk b时钟频率的大小不确定,请用代码实现上述过程;
答案及解析*:
以下是一个简单的 Verilog 代码实现,用于将 clk a 时钟域下的脉冲信号同步到 clk b 时钟域下,并产生该时钟域下的同步信号 sig b:
module pulse_sync (input clk_a,input clk_b,input sig_a,output reg sig_b);reg sig_a_sync, sig_a_sync_reg;parameter DIVIDER = 2; // 如果 clk_a 和 clk_b 的时钟频率不一致,则需要使用一个分频器将两者频率调整为一致
endmodule
该代码使用了两个时钟域的同步技术来实现将脉冲信号从 clk a 时钟域同步到 clk b 时钟域。其中,时钟频率不一致的问题需要通过分频器来处理,确保两个时钟的频率相同。另外,为了避免因信号传输延迟导致的不确定性,需要使用一个寄存器存储同步后的信号,以确保同步信号时钟边沿的正确性。
6、用Verilog实现3bit转9bit的功能,具体描述如下:
输入异步复位Q信号 rst i,
输入数据时钟 clk i
同步有效信号valid i.
输入数据 dat i[2:0],
输出时钟 cIk o,
输出同步信号 valid o.
输出数据 dat or8:0],
clk o的频率是clk 频率的1/3及以上
示例:
输入: clk i 300MHz时钟
clk o 100MHz时钟
dat ir2:0113'b001, 3b010, 3'b1001
输出: dat or8:01 9b001 010 100
解释: 对输入的数据进行数据拼接
答案及解析*:
以下是一个简单的 Verilog 代码实现,用于将 3 位输入数据拼接成 9 位输出数据:
module bit_concat (input clk_i,input rst_i,input valid_i,input [2:0] dat_i,output reg clk_o,output reg valid_o,output reg [8:0] dat_o);localparam DIVIDER = 3; // clk_o 的频率是 clk_i 的 1/3
endmodule
该代码使用了 2 位状态机来实现数据的拼接。当 valid 信号变为高电平时,开始将输入数据拼接成 9 位输出数据,拼接完成后输出 valid 信号以及拼接后的数据和 clk_o 时钟信号。由于 clk_i 和 clk_o 的时钟频率不同,需要使用一个分频器将 clk_i 的时钟频率调整为 clk_o 的时钟频率的三分之一。为了确保拼接后的输出数据和 valid 信号的正确性,需要将 valid 信号同步到 clk_o 时钟域下。
整理不易,如果觉得对你有帮助的话,可以收藏下来慢慢刷!
回顾往期精彩笔试真题:
笔试题2023-燧原-数字IC设计(附答案及解析)收藏不易,如果觉得对你有帮助的话,可以收藏下来慢慢刷!
#笔试##FPGA数字IC笔试面试系列##你为什么选择硬件行业##芯片##数字IC#