verilog实现1101序列检测

这篇具有很好参考价值的文章主要介绍了verilog实现1101序列检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习状态机,这是数电部分非常重要的基础知识,现在利用Verilog来实现,并用modelsim进行仿真。
序列检测并非完全等价于状态机,而是状态机重要应用之一。本次实验进行序列检测1101,当这个序列出现时,输出高电位,其他状态都为0。
常见的序列检测有循环检测和非循环检测两种,循环检测就是上一个序列结尾可以作为下一个序列的开端,例如110110111001101,在第一个1101到来后会输出1,同时结尾1也可以作为下一个1101序列的开端,因此整个序列可以产生3个高电位;而如果是非循环检测,每一个序列不能重复使用,上个1101出现后,这4位信号被“丢弃”,只有下一个完整的1101出现才再次出现高电位输出,则对于这整个序列来说只输出2个高电位。
这对于状态机编码来说会产生一定的差别,对于循环编码而言,可以画出以下状态机图
1101序列检测器,Verilog学习,fpga开发
状态d出现后,下一位输入如果是1,则继续可以作为下一个1101序列的开端,因此可以回到b状态。
而对于非循环编码来说,其状态机图可以如下所示

1101序列检测器,Verilog学习,fpga开发
这里引入了新的状态e,为了使电路可以正常循环往复,虽然名为“非循环检测”,还是要把e状态的下一个状态与a状态链接起来。
对于状态机的画法是数电时序逻辑知识的基础部分,如果不清楚应当重新回到数电部分进行理解,这里强调一句,我们一般假定第一个状态是被检测状态首位的非状态。例如我们这里要检测1101,即我们总是假定,此处的a状态是“输入为0的一个状态”,因此才有状态图中状态a当下一位输入为1时进入下一个新状态,而如果输入仍为0则保持原状态。
下面进行Verilog编码,首先是核心代码

module state_machine (
    input        sys_clk,
    input        sys_rst_n,
    input        din,
    output  reg  dout
);

    // 非循环检测状态赋值
    // localparam a = 3'b000;
    // localparam b = 3'b001;
    // localparam c = 3'b010;
    // localparam d = 3'b011;
    // localparam e = 3'b100;

    //循环检测状态赋值
    localparam a = 2'b00;
    localparam b = 2'b01;
    localparam c = 2'b10;
    localparam d = 2'b11;

    reg  [2:0]     current_state;
    reg  [2:0]     next_state;

    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n) begin
            current_state <= a;
        end else begin
            current_state <= next_state;
        end
    end

    //1101序列检测器
    always @(*) begin
        case (current_state)
            a:if(din==1'b1) begin
                next_state = b;
            end else begin
                next_state = a;
            end 
            b:if(din==1'b1) begin
                next_state = c;
            end else begin
                next_state = a;
            end
            c:if(din==1'b0) begin
                next_state = d;
            end else begin
                next_state = c;
            end
            d:if(din==1'b1) begin
                next_state = b;
            end else begin
                next_state = a;
            end
            //如果是非循环检测则需要引入以下代码
            // e:if(din==1'b1) begin
            //     next_state = b;
            // end else begin
            //     next_state = a;
            // end
            default: next_state = a;
        endcase
    end

    always@* begin
        if(current_state==d && next_state==b) begin
            dout <= 1;
        end else begin
            dout <= 0;
        end
    end
endmodule

下面是编写testbench代码

`timescale 1ns/1ps

module tb_state_machine();

reg   sys_clk;
reg   sys_rst_n;

reg   din;

wire   dout;

parameter  PERIOD = 20;  

// parameter  DIN_LIST = 21'b10111011011010010020;

reg [20:0] din_list;
integer i;



always begin
    sys_clk = 1'b0;
    #(PERIOD/2) sys_clk = 1'b1;
    #(PERIOD/2);
end


initial begin
    sys_rst_n <= 1'b0;
    // din_list <= DIN_LIST;
    #20
    sys_rst_n <= 1'b1;
    din <= 1'b0;
    // for (i = 0; i < 21 ;i=i+1 ) begin
    //     #PERIOD
    //     din <= din_list[i];
    // end
    #20    //注意,此处每一个间隔时间必须与PERIOD时间相同,否则无法正常识别
    din <= 1'b1;
    #20
    din <= 1'b0;
    #20
    din <= 1'b1;
    #20
    din <= 1'b1;
    #20
    din <= 1'b1;
    #20
    din <= 1'b0;
    #20
    din <= 1'b1;
    #20
    din <= 1'b1;
    #20
    din <= 1'b0;
    #20
    din <= 1'b1;
    #20
    din <= 1'b1;
    #20
    din <= 1'b0;
    #20
    din <= 1'b1;
    #20
    din <= 1'b0;
end

// always 
//     #(PERIOD/2) sys_clk = ~sys_clk;

// always@(posedge sys_clk or negedge sys_rst_n) begin
//  #20
//  din_list = {din_list[19:0],din[20]};

state_machine u_state_machine (
    .sys_clk    (sys_clk),
    .sys_rst_n  (sys_rst_n),
    .din        (din),
    .dout       (dout)
);

endmodule

我这里编写的testbench比较繁琐,其中注释部分标出了另一种用for循环产生一批序列的方法。注意,我已经在代码中用注释标出,序列产生的时间间隔必须与时钟周期相等,否则状态机无法正常识别!
用modelsim进行仿真,结果如下
1101序列检测器,Verilog学习,fpga开发
这是循环检测结果,可见,对于序列010111011011010成功识别到了三次,产生三次高电位。修改代码就可以实现非循环检测,这里不再赘述。文章来源地址https://www.toymoban.com/news/detail-755574.html

到了这里,关于verilog实现1101序列检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

    目录 一、前言 二、状态机法和寄存器法 2.1状态机法 2.11 使用状态机检测“1001” 2.12 verilog代码 2.13 testbench 2.14仿真结果 2.2移位寄存器法 2.21 使用移位寄存器法检测1001 2.22 verilog代码 2.23 testbench 2.24仿真结果 三、重叠检测与非重叠检测(检测序列1001) 3.1重叠检测 3.11 重叠检测

    2024年02月04日
    浏览(32)
  • 【数字IC手撕代码】Verilog模三检测器(判断输入序列能否被三整除)|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区 联合力荐 !近500篇 数字IC精品文章收录 ! 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 本系列旨在提

    2024年02月16日
    浏览(27)
  • verilog实现1101序列检测

    学习状态机,这是数电部分非常重要的基础知识,现在利用Verilog来实现,并用modelsim进行仿真。 序列检测并非完全等价于状态机,而是状态机重要应用之一。本次实验进行序列检测1101,当这个序列出现时,输出高电位,其他状态都为0。 常见的序列检测有循环检测和非循环检

    2024年02月05日
    浏览(26)
  • Verilog设计“111”检测器与“01110”检测器并测试所有情况

    使用Quartus+modelsim完成本次设计 分析 分析题目,得到其有限状态机为下图: 代码实现 Testbench 结果 Modelsim结果如下图所示,分析可知实现了题目要求。 逻辑综合出来的电路如下图所示:即只有S3状态才会输出OUT=1。 其中的state的状态机如下图所示(RLT viewer中所示),可见其与

    2024年02月08日
    浏览(47)
  • 实验四 用集成移位寄存器实现序列检测器

    一、实验要求 用移位寄存器和与非门设计一个 1101 序列检测器。电路连续不停地工作,对 串行输入的序列进行检测,当连续检测 4 个码元符合检测码 1101 时,检测器输出 为 1 ,指示灯亮,其他情况下输出为 0 ,指示灯灭。 二、实验设备 1 . Mini-FPGA 开发板( Cyclone IV 系列

    2024年02月03日
    浏览(30)
  • 1001序列检测器

    multisim仿真文件:1001序列检测器(mealy机)-单片机文档类资源-CSDN下载 modelsim仿真文件:1001序列检测器modelsim仿真和测试文件-单片机文档类资源-CSDN下载 实验报告:1001序列检测器实验报告-单片机文档类资源-CSDN下载 电 子 科 技 大 学 课程设计名称:           1001 序列检

    2024年02月06日
    浏览(35)
  • 简单的状态机设计——序列检测器

    1.序列检测器 序列检测器是时序数字电路中非常常见的设计之一。它的逻辑功能是将一个指定的序列从数字码流中识别出来。 2.例1:\\\"10010\\\"序列检测器 对串行输入的数据进行检测,检测“10010”。设X为数字码流输入,Z为检出标记输出,高电平表示“发现指定序列”,低电平表

    2024年02月11日
    浏览(29)
  • 【 FPGA 】序列检测器 11010 (mealy状态机,moore状态机)

            状态机是硬件电路设计的常用的描述工具,也是电路设计的重要思想。很早之前我就知道mealy状态机和moore状态机,但是对两者的差别不是非常的清楚,最近在学习系列检测器的设计时对这两种状态机和一段式、三段式状态机有了更深刻的了解,在这里分享自己的见解

    2024年02月05日
    浏览(30)
  • 用jk触发器设计一个011序列检测器的设计分析过程

       心得体会:经过此次设计,加深了对时序逻辑电路的理解,当要求对一个连续的一串信号进行输入输出处理时可以用到有记忆存储、反馈功能的jk触发器或者d触发器。

    2024年02月04日
    浏览(37)
  • 【opencv】传统目标检测:Haar检测器实现人脸检测

    传统目标分类器主要包括Viola Jones Detector、HOG Detector、DPM Detector,本文主要介绍VJ检测器,在VJ检测器基础上发展出了Haar检测器,Haar检测器也是更为全面、使用更为广泛的检测器。 Viola Jones Detector是作为人脸检测器被Viola和Jones提出来的,后来Rainer Lienhart和Jochen Maydt将这个检测

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包