0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用同步fifo实现对输入序列的检测

我快闭嘴 来源:达尔闻说 作者:达尔闻说 2022-09-14 09:46 次阅读

今天继续为大家解析联发科数字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_inreq_in_ack都为高时,说明本模块有能力接收data_in的数据;

3)在data_in的数据中找到特殊字符32hA1B9_0000,特殊字符前的数据全部丢弃,特殊字符后的资料全部收下来;

4)当sync_fifo为非空的时候,将数据读出放到data_out上,并用data_out_vld指示数据的有效性。(15分)

解析:本题目主要考察了利用同步fifo实现对输入序列的检测

本题是一道关于同步fifo应用的题目,遇到这种类型的题目首先要根据题目中的要求逐条分析,然后依次在草稿纸上画出大致的模块框图、波形图,再编写RTL代码。

首先根据Interface signals需求1携带的信息,绘制出的模块框图如下所示:

15e0afda-335d-11ed-ba43-dac502259ad0.png

然后根据需求2改进模块框图如下:

15eb57dc-335d-11ed-ba43-dac502259ad0.png

然后绘制波形图如下所示:

160e4c88-335d-11ed-ba43-dac502259ad0.png

filter_data_store模块的HDL代码如下所示:

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

01modulefilter_data_store(

02inputwireclk_ck,

03inputwirerst_b,

04inputwirereq_in,

05inputwire[31:0]data_in,

06

07outputregreq_in_ack,

08outputwire[31:0]data_out,

09outputregdata_out_vld

10);

11

12regdata_start;

13regdata_start_reg;

14wire[31:0]dout;

15wirefull;

16wireempty;

17

18always@(posedgeclk_ck ornegedgerst_b)

19if(!rst_b)

20req_in_ack <=1'b0;

21elseif(full ==1'b0)

22req_in_ack <=1'b1;

23elseif(empty ==1'b1)

24req_in_ack <=1'b0;

25

26always@(posedgeclk_ck ornegedgerst_b)

27if(!rst_b)

28data_start <=1'b0;

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

30data_start <=1'b1;

31elseif(req_in ==1'b0)

32data_start <=1'b0;

33

34always@(posedgeclk_ck ornegedgerst_b)

35if(!rst_b)

36data_start_reg <=1'b0;

37else

38data_start_reg <=data_start;

39

40//-------sync_fifo_inst-------

41sync_fifo sync_fifo_inst(

42.clk_ck(clk_ck),//input clk_ck

43.rst_b (rst_b),//inputrst_b

44.wr_en (data_start),//inputwr_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_ck ornegedgerst_b)

56if(!rst_b)

57data_out_vld <=1'b0;

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

59data_out_vld <=1'b0;

60elseif(data_start_reg ==1'b1)

61data_out_vld <=1'b1;

62

63endmodule

//----------------还需要一个同步fifo模块,如果有时间建议自己用逻辑手写一个同步fifo。同步fifo模块的HDL代码如下所示://----------------01modulesync_fifo(02inputwireclk_ck,03inputwirerst_b,04inputwirewr_en,05inputwire[31:0]din,06inputwirerd_en,0708outputwire[31:0]dout,09outputwirefull,10outputwireempty11);1213reg[4:0]wr_cnt;14reg[4:0]rd_cnt;15reg[31:0]mem [15:0];16reg[31:0]dout_r;1718wire[3:0]wr_p;19wire[3:0]rd_p;2021assignwr_p =wr_cnt[3:0];22assignrd_p =rd_cnt[3:0];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;2627always@(posedgeclk_ck ornegedgerst_b)28if(!rst_b)29begin30wr_cnt <=5'd0;31rd_cnt <=5'd0;32end33else34begin35if(!full &&wr_en)36begin37 mem[wr_p]<=din;38 wr_cnt <=wr_cnt +1'b1;39end40if(!empty &&rd_en)41begin42dout_r <=mem[rd_p];43rd_cnt <=rd_cnt +1'b1;44end45end4647endmodule//------------------Testbench如下所示:

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

01moduletb_filter_data_store();0203regclk_ck;04regrst_b;05regreq_in;06reg[31:0]data_in;0708wirereq_in_ack;09wire[31:0]data_out;10wiredata_out_vld;1112//初始化系统时钟、全局复位13initialbegin14clk_ck =1'b1;15rst_b <=1'b0;16req_in <=1'b0;17data_in <=32'h0000_0000;18#2019rst_b <=1'b1;20@(posedgeclk_ck)21req_in <=1'b1;22data_in <=32'h0000_0001;23@(posedgeclk_ck)24data_in <=32'h0000_0002;25@(posedgeclk_ck)26data_in <=32'h0000_0003;27@(posedgeclk_ck)28data_in <=32'h0000_0004;29@(posedgeclk_ck)30data_in <=32'h0000_0005;31@(posedgeclk_ck)32data_in <=32'hA1B9_0000;33@(posedgeclk_ck)34data_in <=32'h0000_0006;35@(posedgeclk_ck)36data_in <=32'h0000_0007;37@(posedgeclk_ck)38data_in <=32'h0000_0008;39@(posedgeclk_ck)40data_in <=32'h0000_0009;41@(posedgeclk_ck)42req_in <=1'b0;43data_in <=32'h0000_0000;44req_in <=1'b0;45#100046$finish;47end4849always#10clk_ck =~clk_ck;5051//------filter_data_store_inst-------52filter_data_store filter_data_store_isnt(53.clk_ck(clk_ck),//inputclk_ck54.rst_b(rst_b),//inputrst_b55.req_in(req_in),//inputreq_in56.data_in(data_in),//input [31:0] data_in5758.req_in_ack(req_in_ack ),//output req_in_ack 59.data_out (data_out ),//output [31:0] data_out 60.data_out_vld(data_out_vld)//output data_out_vld 61);6263endmodule//----------------QuestaSim仿真出的波形如下所示:

162a4dac-335d-11ed-ba43-dac502259ad0.png

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • fifo
    +关注

    关注

    3

    文章

    369

    浏览量

    43037
  • Verilog
    +关注

    关注

    28

    文章

    1324

    浏览量

    109250
  • HDL
    HDL
    +关注

    关注

    8

    文章

    322

    浏览量

    47101

原文标题:求职攻略| 一题解决同步FIFO设计难题

文章出处:【微信号:达尔闻说,微信公众号:达尔闻说】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    同步FIFO设计详解及代码分享

    FIFO (先入先出, First In First Out )存储器,在 FPGA 和数字 IC 设计中非常常用。 根据接入的时钟信号,可以分为同步 FIFO 和异步 FIFO
    发表于 06-27 10:24 1286次阅读
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>设计详解及代码分享

    握手型接口的同步FIFO实现

    按照正常的思路,在前文完成前向时序优化和后向时序优化后,后面紧跟的应该是双向时序优化策略了,不过不急,需要先实现一下握手型同步FIFO
    的头像 发表于 12-04 14:03 284次阅读
    握手型接口的<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b><b class='flag-5'>实现</b>

    如何利用FPGA实现准单输入调变序列生成器的设计?

    本文针对一种产生准单输入跳变测试序列的低功耗测试生成器的缺点提出了改进设计方案,并且利用EDA技术在FPGA芯片上进行了设计实现
    发表于 04-29 06:13

    如何利用FIFO实现DSP间双向并行异步通讯?

    FIFO芯片是什么?如何利用FIFO实现DSP间双向并行异步通讯?
    发表于 06-02 06:08

    基于VHDL和FPGA的非对称同步FIFO设计实现

    本文采用VHDL描述语言,充分利用Xilinx公司Spartan II FPGA的系统资源,设计实现了一种非对称同步FIFO,它不仅提供数据缓冲,而且能进行数据总线宽度的转换。
    发表于 01-13 11:33 1770次阅读

    利用串_并m_序列产生随机脉位序列

    利用串_并m_序列产生随机脉位序列,下来看看
    发表于 12-16 22:23 12次下载

    利用VHDL语言和格雷码对地址进行编码的异步FIFO的设计

    FIFO (先进先出队列)是一种在电子系统得到广泛应用的器件,通常用于数据的缓存和用于容纳异步信号的频率或相位的差异。FIFO实现通常是利用双口RAM和读写地址产生模块来
    的头像 发表于 08-02 08:10 1895次阅读
    <b class='flag-5'>利用</b>VHDL语言和格雷码对地址进行编码的异步<b class='flag-5'>FIFO</b>的设计

    同步FIFO之Verilog实现

    FIFO的分类根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO
    的头像 发表于 11-01 09:57 1334次阅读

    异步FIFO之Verilog代码实现案例

    同步FIFO的意思是说FIFO的读写时钟是同一个时钟,不同于异步FIFO,异步FIFO的读写时钟是完全异步的。
    发表于 11-01 09:58 1210次阅读

    一个简单的RTL同步FIFO设计

    FIFO 是FPGA设计中最有用的模块之一。FIFO 在模块之间提供简单的握手和同步机制,是设计人员将数据从一个模块传输到另一个模块的常用选择。
    发表于 06-14 08:59 242次阅读

    基于寄存器的同步FIFO

      FIFO 是FPGA设计中最有用的模块之一。FIFO 在模块之间提供简单的握手和同步机制,是设计人员将数据从一个模块传输到另一个模块的常用选择。 在这篇文章中,展示了一个简单的 RTL
    的头像 发表于 06-14 09:02 482次阅读

    FPGA学习-序列检测

    点击上方 蓝字 关注我们 一、前言 在数字电路中,序列检测器(Sequence Detector)是指一种特殊类型的电路,用于寻找输入信号中一定模式的子序列。该模式可以是任意模式,包括
    的头像 发表于 08-29 10:20 574次阅读
    FPGA学习-<b class='flag-5'>序列</b><b class='flag-5'>检测</b>器

    同步FIFO设计分析

    模块虽小但是要有新意,首先写一个同步FIFO,这是一个烂大街的入门级项目,但是我肯定不会写的那么简单
    的头像 发表于 09-11 17:11 358次阅读
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>设计分析

    同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO各在什么情况下应用

    简单的一种,其特点是输入和输出都与时钟信号同步,当时钟到来时,数据总是处于稳定状态,因此容易实现数据的传输和存储。 而异步FIFO则是在波形的上升沿和下降沿上进行处理,在
    的头像 发表于 10-18 15:23 983次阅读

    利用AD7616灵活的可编程序列器和突发模式实现同步采样

    电子发烧友网站提供《利用AD7616灵活的可编程序列器和突发模式实现同步采样.pdf》资料免费下载
    发表于 11-24 14:53 0次下载
    <b class='flag-5'>利用</b>AD7616灵活的可编程<b class='flag-5'>序列</b>器和突发模式<b class='flag-5'>实现</b>准<b class='flag-5'>同步</b>采样