Verilog刷题笔记57

题目:

Exams/2014 q3bfsm

Given the state-assigned table shown below, implement the finite-state machine. Reset should reset the FSM to state 000.

解题:

c 复制代码
module top_module (
    input clk,
    input reset,   // Synchronous reset
    input x,
    output z
);

    parameter s0=3'd000,s1=3'd001,s2=3'd010,s3=3'd011,s4=3'd100;
    reg [2:0]state,next_state;
    always@(posedge clk)begin
        if(reset)
            state=s0;
        else
            state=next_state;
    end
    always@(*)begin
        case(state)
            s0:next_state=x?s1:s0;
            s1:next_state=x?s4:s1;
            s2:next_state=x?s1:s2;
            s3:next_state=x?s2:s1;
            s4:next_state=x?s4:s3;
        endcase
    end
    always@(posedge clk)begin
        if(reset)
            z=0;
        else begin
            case(next_state)
                s0:z=0;
                s1:z=0;
                s2:z=0;
                s3:z=1;
                s4:z=1;
                default:z=0;
            endcase
        end
    end

endmodule

结果正确:

注意点:

我一开始编写的代码如下:

c 复制代码
module top_module (
    input clk,
    input reset,   // Synchronous reset
    input x,
    output z
);

    parameter s0=3'd000,s1=3'd001,s2=3'd010,s3=3'd011,s4=3'd100;
    reg [2:0]state,next_state;
    always@(posedge clk)begin
        if(reset)
            state=s0;
        else
            state=next_state;
    end
    always@(*)begin
        case(state)
            s0:next_state=x?s1:s0;
            s1:next_state=x?s4:s1;
            s2:next_state=x?s1:s2;
            s3:next_state=x?s2:s1;
            s4:next_state=x?s4:s3;
        endcase
    end
   assign z=next_state==s3|next_state==s4;

endmodule

但是这种跑出来的结果错误。

原因分析:

z 的生成方式:

1、第一段代码:z 是在一个 always 块中根据 next_state 的值来决定的。这个 always 块在时钟上升沿触发,使用了同步逻辑来更新 z 的值。

2、第二段代码:z 是通过一个组合逻辑 assign 语句直接从 next_state 的值计算得到的。这种方法是异步的,不依赖于时钟信号。

同步与异步逻辑:

1、第一段代码:z 是通过时钟同步的方式进行更新的,因此它是同步信号。这个设计确保了 z 的更新与时钟边沿对齐,并且和 state 的更新在同一时钟周期内完成。

2、第二段代码:z 是组合逻辑,直接依赖 next_state 的值进行计算。这个设计意味着 z 的值会随 next_state 的改变而立即改变,而不需要等待时钟边沿。

总结

第一段代码中的 z 是同步更新的,而第二段代码中的 z 是组合逻辑生成的。

如果 z 需要在时钟周期内同步更新,第一段代码更为合适。如果 z 可以即时响应 next_state 的变化,第二段代码则更为简洁和高效。

相关推荐
羊群智妍21 小时前
2026 AI搜索优化实战:GEO优化全流程
笔记
雨浓YN21 小时前
WPF MVVM 模式(无调库)项目创建笔记
笔记·wpf
Stella Blog21 小时前
狂神Java基础学习笔记Day03
java·笔记·学习
希言自然也1 天前
赛灵思KU系列FPGA的EFUSE/BBRAM加密操作
fpga开发
夜瞬1 天前
NLP学习笔记02:文本表示方法——从词袋模型到 BERT
笔记·学习·自然语言处理
xuhaoyu_cpp_java1 天前
MySql学习(二)
经验分享·笔记·学习·mysql
浅念-1 天前
从LeetCode入门位运算:常见技巧与实战题目全解析
数据结构·数据库·c++·笔记·算法·leetcode·牛客
talen_hx2961 天前
《零基础入门Spark》学习笔记 Day 16
笔记·学习·spark
Terasic友晶科技1 天前
答疑解惑 | DE25-Nano开发板Uboot阶段与FPGA外设交互失败
fpga开发·led·uboot·de25-nano·terasic
kobesdu1 天前
【ROS2实战笔记-3】RViz2图形底层与调试暗坑
笔记·机器人·ros·rviz