首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

求职攻略|一题解决同步FIFO设计难题

今天继续为大家解析联发科技数字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代码如下所示:

//------------------

01modulefilter_data_store(

02inputwireclk_ck,

03inputwirerst_b,

04inputwirereq_in,

05inputwire[31:]data_in,

06

07outputregreq_in_ack,

08outputwire[31:]data_out,

09outputregdata_out_vld

10);

11

12regdata_start;

13regdata_start_reg;

14wire[31:]dout;

15wirefull;

16wireempty;

17

18always@(posedgeclk_ckornegedgerst_b)

19if(!rst_b)

20 req_in_ack1'b0;

21elseif(full==1'b0)

22 req_in_ack1'b1;

23elseif(empty==1'b1)

24 req_in_ack1'b0;

25

26always@(posedgeclk_ckornegedgerst_b)

27if(!rst_b)

28 data_start1'b0;

29elseif(req_in==1'b1&&req_in_ack==1'b1&&data_in==32'hA1B9_0000)

30 data_start1'b1;

31elseif(req_in==1'b0)

32 data_start1'b0;

33

34always@(posedgeclk_ckornegedgerst_b)

35if(!rst_b)

36 data_start_reg1'b0;

37else

38 data_start_regdata_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),//inputrst_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

53assigndata_out=dout;

54

55always@(posedgeclk_ckornegedgerst_b)

56if(!rst_b)

57 data_out_vld1'b0;

58elseif(data_start==1'b0&&data_start_reg==1'b1)

59 data_out_vld1'b0;

60elseif(data_start_reg==1'b1)

61 data_out_vld1'b1;

62

63endmodule

//----------------

还需要一个同步fifo模块,如果有时间建议自己用逻辑手写一个同步fifo。同步fifo模块的HDL代码如下所示:

//----------------

01modulesync_fifo(

02 inputwireclk_ck,

03inputwirerst_b,

04inputwirewr_en,

05inputwire[31:]din,

06inputwirerd_en,

07

08outputwire[31:]dout,

09outputwirefull,

10outputwireempty

11);

12

13reg[4:]wr_cnt;

14reg[4:]rd_cnt;

15reg[31:]mem[15:];

16reg[31:]dout_r;

17

18wire[3:]wr_p;

19wire[3:]rd_p;

20

21assignwr_p =wr_cnt[3:];

22assignrd_p =rd_cnt[3:];

23assigndout =dout_r;

24assignfull=(wr_cnt[4]!=rd_cnt[4]&&wr_p==rd_p)?1'b1:1'b0;

25assignempty=(wr_cnt==rd_cnt)?1'b1:1'b0;

26

27always@(posedgeclk_ckornegedgerst_b)

28if(!rst_b)

29begin

30       wr_cnt5'd0;

31       rd_cnt5'd0;

32end

33else

34begin

35if(!full&&wr_en)

36begin

37           mem[wr_p]din;

38           wr_cnt wr_cnt+1'b1;

39end

40if(!empty&&rd_en)

41begin

42         dout_rmem[rd_p];

43         rd_cntrd_cnt+1'b1;

44end

45end

46

47endmodule

//------------------

Testbench如下所示:

//------------------

01moduletb_filter_data_store();

02

03regclk_ck;

04regrst_b;

05regreq_in;

06reg[31:]data_in;

07

08wirereq_in_ack;

09wire[31:]data_out;

10wiredata_out_vld;

11

12 //初始化系统时钟、全局复位

13initialbegin

14 clk_ck =1'b1;

15 rst_b 1'b0;

16 req_in 1'b0;

17 data_in32'h0000_0000;

18#20

19 rst_b 1'b1;

20@(posedgeclk_ck)

21 req_in 1'b1;

22 data_in32'h0000_0001;

23@(posedgeclk_ck)

24 data_in32'h0000_0002;

25@(posedgeclk_ck)

26 data_in32'h0000_0003;

27@(posedgeclk_ck)

28 data_in32'h0000_0004;

29@(posedgeclk_ck)

30 data_in32'h0000_0005;

31@(posedgeclk_ck)

32 data_in32'hA1B9_0000;

33@(posedgeclk_ck)

34 data_in32'h0000_0006;

35@(posedgeclk_ck)

36 data_in32'h0000_0007;

37@(posedgeclk_ck)

38 data_in32'h0000_0008;

39@(posedgeclk_ck)

40 data_in32'h0000_0009;

41@(posedgeclk_ck)

42 req_in 1'b0;

43 data_in32'h0000_0000;

44 req_in 1'b0;

45#1000

46 $finish;

47end

48

49always#10 clk_ck=~clk_ck;

50

51//------filter_data_store_inst-------

52 filter_data_store filter_data_store_isnt(

53.clk_ck(clk_ck),//input clk_ck

54.rst_b(rst_b),//input rst_b

55.req_in(req_in),//input req_in

56.data_in(data_in),//input  [31:0]data_in

57

58.req_in_ack(req_in_ack ),//outputreq_in_ack

59.data_out (data_out ),//output [31:0] data_out

60.data_out_vld(data_out_vld)//outputdata_out_vld

61);

62

63endmodule

用QuestaSim仿真出的波形如下所示:

大华FPGA岗位

大疆FPGA逻辑岗

硬件岗位解析

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20221012A00U0R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券