笔试题-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 时钟域下。

整理不易,如果觉得对你有帮助的话,可以收藏下来慢慢刷!

回顾往期精彩笔试真题:

数字IC前端笔试常见大题整理(简答+手撕)

笔试题-2023-禾赛-FPGA(附答案及解析)

笔试题-2023-复睿微-数字芯片设计【附解析】

笔试题-2023-锐捷-FPGA(附答案及解析)

笔试题-2023-星宸-数字IC设计(附答案及解析)

笔试题2023-燧原-数字IC设计(附答案及解析)收藏不易,如果觉得对你有帮助的话,可以收藏下来慢慢刷!

#笔试##FPGA数字IC笔试面试系列##你为什么选择硬件行业##芯片##数字IC#
全部评论
这是春招的笔试题吗
点赞 回复 分享
发布于 2023-05-17 21:45 湖北
感谢楼主分享
点赞 回复 分享
发布于 2023-05-17 22:15 安徽
~a是a的按位取反,将b1101取反,得到b0010,即5'b00110 这个不对吧,第二题
点赞 回复 分享
发布于 2023-05-18 00:35 辽宁

相关推荐

不愿透露姓名的神秘牛友
11-05 12:57
已编辑
思朗 处理器 N+8 公积金12 硕士985
点赞 评论 收藏
分享
评论
5
38
分享
牛客网
牛客企业服务