打造IC人才
科技生态圈
发布时间:2022-10-17
来源:IC修真院
今天继续为大家解析联发科技数字IC设计岗的笔试题。
16、【简答题】请用Verilog写出以下逻辑
Interface signals如下:
input clk_ck;
input rst_b(async reset);
input req_in;
output req_in_ack;
input [31:0] data_in;
output data_out_vld;
output [31:0] data_out;
模块功能需求如下:
1)模块名为:filter_data_store
2)当req_in和req_in_ack都为高时,说明本模块有能力接收data_in的数据;
3)在data_in的数据中找到特殊字符32’hA1B9_0000,特殊字符前的数据全部丢弃,特殊字符后的资料全部收下来;
4)当sync_fifo为非空的时候,将数据读出放到data_out上,并用data_out_vld指示数据的有效性。(15分)
解析:本题目主要考察了利用同步fifo实现对输入序列的检测
本题是一道关于同步fifo应用的题目,遇到这种类型的题目首先要根据题目中的要求逐条分析,然后依次在草稿纸上画出大致的模块框图、波形图,再编写RTL代码。
首先根据Interface signals需求1携带的信息,绘制出的模块框图如下所示:
然后根据需求2改进模块框图如下:
然后绘制波形图如下所示:
filter_data_store模块的HDL代码如下所示:
//------------------
01 module filter_data_store(
02 inputwire clk_ck ,
03 inputwire rst_b ,
04 inputwire req_in ,
05 inputwire[31:0]data_in ,
06
07 outputreg req_in_ack ,
08 outputwire[31:0]data_out ,
09 outputreg data_out_vld
10 );
11
12 reg data_start;
13 reg data_start_reg;
14 wire [31:0] dout;
15 wire full;
16 wire empty;
17
18 always@(posedge clk_ck or negedge rst_b)
19 if(!rst_b)
20 req_in_ack <= 1'b0;
21 else if(full == 1'b0)
22 req_in_ack <= 1'b1;
23 else if(empty == 1'b1)
24 req_in_ack <= 1'b0;
25
26 always@(posedge clk_ck or negedge rst_b)
27 if(!rst_b)
28 data_start <= 1'b0;
29 else if(req_in ==1'b1 && req_in_ack == 1'b1 && data_in == 32'hA1B9_0000)
30 data_start <= 1'b1;
31 else if(req_in == 1'b0)
32 data_start <= 1'b0;
33
34 always@(posedge clk_ck or negedge rst_b)
35 if(!rst_b)
36 data_start_reg <= 1'b0;
37 else
38 data_start_reg <= data_start;
39
40 //-------sync_fifo_inst-------
41 sync_fifo sync_fifo_inst(
42 .clk_ck(clk_ck), //input clk_ck
43 .rst_b (rst_b), //input rst_b
44 .wr_en (data_start), //input wr_en
45 .din (data_in), //input [31:0] din
46 .rd_en (~empty), //input rd_en
47
48 .dout (dout), //output [31:0] dout
49 .full (full), //output full
50 .empty (empty) //output empty
51 );
52
53 assign data_out = dout;
54
55 always@(posedge clk_ck or negedge rst_b)
56 if(!rst_b)
57 data_out_vld <= 1'b0;
58 else if(data_start == 1'b0 && data_start_reg == 1'b1)
59 data_out_vld <= 1'b0;
60 else if(data_start_reg == 1'b1)
61 data_out_vld <= 1'b1;
62
63 endmodule
还需要一个同步fifo模块,如果有时间建议自己用逻辑手写一个同步fifo。同步fifo模块的HDL代码如下所示:
//------------------
用QuestaSim仿真出的波形如下所示:
相关推荐:
下一篇:2022年ic设计工程师秋招复盘
推荐阅读
2023-01-04
2023-04-20
2023-03-07
2022-11-02
2022-12-27