[吾题有解] HDLBits : Fsm onehot

本文讲述了如何处理状态机设计中的非独热码输入,强调了对输入每一位进行独立判断的重要性,并给出了一个使用VerilogHDL编写的示例模块,确保次态的正确性和单一状态的正确输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相比于之前设计的状态机题目给出输入、要求我们自己写出状态变化、状态逻辑判断与输出,本题直接将现态本身作为输入,要求我们给出次态和输出。

搞清楚输入输出之后,鉴于独热码的特征,我们可以对输入/输出的每一位进行单独判断,其实如果从功能实现上出发也不是必须如此,只是题目中对输入有特殊说明。

The testbench will test with non-one hot inputs to make sure you’re not trying to do something more complicated.

也就是说,Testbench会给出非独热码的输入(比如10’b10_0001_0010)此时如果我们对输入作判断后,

  • 直接将移位后的state赋值给next_state(如S1的state在“正常的”独热码情况下可以在输入为1时通过S0的state左移1位得到)
  • 由于条件不满足直接跳转到default状态(S0)

均会导致错误的次态出现。所以应当对next_state的每一位单独判断,在输入in指定的情况下,根据输入现态的每一位确定是否会跳转到这个状态(也就是次态的这个位是否置1)。这样对于次态的每一位,都是由现态正确跳转而来,即使由于现态以非独热码的形式输入导致次态输出整体上并非独热码形式,但是对于单独的1位次态来说,结果都是正确的(每一位次态都认为其余次态的位均应为0,相当于把多个独热码叠加起来了

给出Verilog HDL供大家参考:

module top_module(
    input in,
    input [9:0] state,
    output [9:0] next_state,
    output out1,
    output out2);
    
    assign next_state[0] = ~in & (state[0] | state[1] | state[2] |state[3] |state[4] | state[7] |state[8] |state[9]);
    assign next_state[1] =  in & (state[0] | state[8] | state[9]);
    assign next_state[2] =  in & state[1];
    assign next_state[3] =  in & state[2];
    assign next_state[4] =  in & state[3];
    assign next_state[5] =  in & state[4];
    assign next_state[6] =  in & state[5];
    assign next_state[7] =  in & (state[6] | state[7]);
    assign next_state[8] = ~in & state[5];
    assign next_state[9] = ~in & state[6];
    
    assign out1 = (state[8] == 1'b1) || (state[9] == 1'b1);
    assign out2 = (state[7] == 1'b1) || (state[9] == 1'b1);
endmodule
### 关于HDLBits平台上的Verilog学习资源 对于希望在线上通过实践来掌握Verilog硬件描述语言的学习者而言,HDLBits提供了一个理想的环境[^3]。该平台不仅包含了丰富的练习目,而且覆盖了从基础到高级的各种概念和技术要点。 #### 练习目的范围 HDLBits中的问集涵盖了多个方面,包括但不限于基本语法、算术运算、条件语句以及更复杂的主比如状态机的设计等。这些问被精心设计成逐步引导用户深入理Verilog的功能特性及其应用领域。 #### 学习路径建议 为了有效地利用这个平台进行自学,可以从简单的位操作和布尔表达式开始尝试决一些入门级挑战[^1]。随着技能的增长,可以逐渐过渡到处理更加复杂的情况,例如编写测试平台(TB)[^2]或是实现有限状态机(FSM)。 #### 示例代码片段展示如何创建一个简单的组合逻辑电路 下面是一个非常基础的例子,展示了怎样定义两个输入信号`a`和`b`并计算它们之间的按位与(`&`)的结果: ```verilog // synthesis verilog_input_version verilog_2001 module top_module( input a, input b, output wire out_assign, output reg out_alwaysblock ); assign out_assign = a & b; always @(*) begin out_alwaysblock = a & b; end endmodule ``` 此模块实现了两种不同的方式来进行相同的逻辑运算——一种是直接赋值给wire类型的输出端口;另一种则是使用always块更新reg类型的寄存器变量[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝莲花正开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值