Embedded Verilog中N位通用状态机

Embedded Verilog中N位通用状态机,embedded,verilog,Embedded,Verilog,如果我有一个三位的简单状态机,总共有8个状态。Verilog中的代码如下所示: module state_machine( input clk , input reset ); `define s0 3'b 000 `define s1 3'b 001 `define s2 3'b 010 `define s3 3'b 011 `define s4 3'b 100 `define s5 3'b 101 `define s6

如果我有一个三位的简单状态机,总共有8个状态。Verilog中的代码如下所示:

 module state_machine( input clk , input reset );    
 `define s0     3'b 000
 `define s1     3'b 001
 `define s2     3'b 010
 `define s3     3'b 011
 `define s4     3'b 100
 `define s5     3'b 101
 `define s6     3'b 110
 `define s7     3'b 111
 reg [2:0] state;
initial 
state = {$random%3};

 always @(posedge clk) begin 
 if (reset==0)
        state= `s0; 
    else
          case  (state)        
                `s0:   state =`s1 ;                 
                `s1:   state =`s2 ;                 
                `s2:   state =`s3 ;                 
                `s3:   state =`s4 ;                 
                `s4:   state =`s5 ;                 
                `s5:   state =`s6 ;             
                `s6:   state =`s7 ;
                `s7:   state ={$random%3} ;
             default:   state =`s0   
           endcase
 end
endmodule  
但是现在我想为N个比特和2^N个状态创建一个简单的状态机。这意味着现在我们只有3位,所以有2^3=8个状态。对于N位,我们将有2^N位

我怎样才能做到。求你了,我真的需要你的帮助


听起来您应该将其实现为带有加载函数的计数器。当您的加载信号被断言时,您加载您的输入,对于您的情况,该输入可以被分配一个随机值。之后,它作为一个正常的计数器工作。可以使用计数器宽度的参数创建n位计数器


然后,您可以使用逐位&reduce运算符检查计数值何时全部为“1”并准备好翻滚,并使用该运算符触发加载

请注意,每个状态的十进制值都是前一个+1,因此您可以只使用触发器的状态always@posedge时钟。。。使用非阻塞在我看来,你几乎想建立一个计数器,但它不是包装到零,而是包装到一个随机数。是的,先生@Marty。。我想要一个从随机数开始的计数,然后转到每个状态。但是countr可能是n个比特