HDL Fsm onehot

1.原题复现

https://hdlbits.01xz.net/wiki/Fsm_onehot
在这里插入图片描述

2.代码

刚开始采用的是独热码形式的程序来进行测试,结果发现不行:
在这里插入图片描述
经过仿真提示之后,才发现测试原来并非以一位的独热码形式来进行的,因此我们应该寻找另一种办法
在这里插入图片描述
经过在网上寻找之后,才发现题目的是意思是,并非每次输入当中,只有一位为高电平,也有可能是两位的独热码或者其他一些自由的输入,因此,采用参数定义独热码形式是不可行的。同时,也不能采用case语句,因为输入情况千变万化,无法列写完全。
因此,提出的方法是 按照state[i]上的每一个位来进行逐个判断next_state[i]的发生的条件。 因此 得出以下更正代码:

module top_module(
    input in,
    input [9:0] state,
    output [9:0] next_state,
    output out1,
    output out2);
   parameter S0=10'b00_0000_0001;
   parameter S1=10'b00_0000_0010;
   parameter S2=10'b00_0000_0100;
   parameter S3=10'b00_0000_1000;
   parameter S4=10'b00_0001_0000;
   parameter S5=10'b00_0010_0000;
   parameter S6=10'b00_0100_0000;
   parameter S7=10'b00_1000_0000;
   parameter S8=10'b01_0000_0000;
   parameter S9=10'b10_0000_0000;
    always@(*)begin
        next_state[0] = state[0]&(~in)|state[1]&(~in)|state[2]&(~in)|state[3]&(~in)|state[4]&(~in)|state[7]&(~in)|state[8]&(~in)|state[9]&(~in);
        next_state[1] = state[0]&(in)|state[8]&(in)|state[9]&(in);
        next_state[2] = state[1]&(in);
        next_state[3] = state[2]&(in);
        next_state[4] = state[3]&(in);
        next_state[5] = state[4]&(in);
        next_state[6] = state[5]&(in);
        next_state[7] = state[6]&(in)|state[7]&(in);
        next_state[8] = state[5]&(~in);
        next_state[9] = state[6]&(~in);
    end
    
    assign out1 =    (state[8] == 1)|(state[9] == 1);
    assign out2 =    (state[7] == 1)|(state[9] == 1);
endmodule
总结:经过在CSDN查询别人写的代码之后,才发现,原来不止自己一个人刚开始使用的第一种思路,或者说,更普遍是思路都是第一种。只是HDL里面测试输入并非使用的是独热码而已,不必深究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值