FSM序列机Verilog

==note:==状态机里面要么所有选择都有赋值,要么最开始赋初值(nstate =cstate),否则会产生组合逻辑环。并且不能使用非阻塞赋值,否则会产生意想不到的错误,一定要规范使用阻塞和非阻塞。

FSM序列机
根据输入信号,检测序列1011;
IDLE:00001
S1:00010(1)
S2:00100(10)
S3:01000(101)
S4:10000(1011)
在这里插入图片描述

`timescale 1ns/1ns

//check 1011
 module FSM_check
 (
    input                           clk                         , 
    input                           rst_n                       , 
    input                           din                         , 
    output                          check_vld                     
 );

 parameter IDLE = 5'b00001;
 parameter S1   = 5'b00010;
 parameter S2   = 5'b00100;
 parameter S3   = 5'b01000;
 parameter S4   = 5'b10000;

reg                           [4:0] c_state                     ;
reg                           [4:0] n_state                     ;

//第一段:状态切换
always @(posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        c_state <= IDLE;
    else
        c_state <= n_state;        
end
//第二段:状态切换
//组合逻辑
always @(*)
begin
   if(rst_n == 1'b0)
      n_state <= IDLE;
   else
   begin
      case(c_state)
        IDLE:
        begin
            if(din==1'b1)
                n_state <= S1;
            else
                n_state <= IDLE;
        end     
        S1:
        begin
            if(din==1'b0)
               n_state <= S2;
            else
               n_state <= S1; 
        end
        S2:
        begin
            if(din==1'b1)
               n_state <= S3;
            else
                n_state <= IDLE;
        end
        S3:
        begin
            if(din==1'b1)
               n_state <= S4;
            else
               n_state <= S2; 
        end
        S4:
        begin
            if(din==1'b1)
               n_state <= S1;
            else
               n_state <= S2; 
        end
        default:
            n_state <= IDLE;
    endcase
   end 
end

//第三段:结果输出
always @(posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        check_vld <= 1'b0;
    else if(n_state==S4)
        check_vld <= 1'b1;
    else
        check_vld <= 1'b0;        
end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
101001序列检测是一种有限状态FSM)设计问题,其中我们需要设计一个verilog代码来检测输入序列是否包含子序列101001。 首先,我们需要定义输入和输出。在这个问题中,输入是一个时钟信号clk和一个输入信号in。输出是一个名为detect的信号,如果输入序列包含子序列101001,则detect为1,否则为0。 接下来,我们需要设计有限状态。在这个问题中,我们可以使用三个状态:初始状态(INIT)、匹配状态(MATCH)和非匹配状态(NOMATCH)。 首先,在INIT状态,我们等待一个时钟周期,以确保输入信号稳定。随后,我们检查输入信号是否为1。如果是1,我们切换到MATCH状态,否则切换到NOMATCH状态。 在MATCH状态,我们检查输入信号是否为0。如果是0,则切换到NOMATCH状态。否则,我们继续在MATCH状态等待下一个时钟周期。 在NOMATCH状态,我们等待输入信号为1,然后切换回MATCH状态。如果输入信号为1,则我们仍然保持在NOMATCH状态。 最后,我们需要编写verilog代码来实现上述设计。下面是一个可能的实现: ```verilog module sequence_detection( input clk, input in, output detect ); reg [1:0] state; reg detect; always @(posedge clk) begin case (state) INIT: begin // 等待一个时钟周期,以确保输入信号稳定 state <= in ? MATCH : NOMATCH; end MATCH: begin // 检查输入信号是否为0 state <= in ? NOMATCH : MATCH; end NOMATCH: begin // 等待输入信号为1 state <= in ? NOMATCH : MATCH; end endcase end always @(state) begin detect = (state == MATCH); end endmodule ``` 上面的代码实现了一个简单的101001序列检测器。我们使用有限状态来跟踪输入信号,并根据特定的模式切换状态。根据当前状态,我们将输出detect设置为1或0,以指示输入序列是否包含子序列101001。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值