仅对英特尔可见 — GUID: mwh1409959612125
Ixiasoft
1.6.4.2.1. Verilog-2001状态机编码示例
以下模块verilog_fsm是典型的Verilog HDL状态机实现的示例。 此状态机有五个状态。
异步复位将变量state设置为state_0。in_1与in_2的和是state_1和state_2中的状态机的一个输出。(in_1 – in_2)的差也用于state_1和state_2中。临时变量tmp_out_0和tmp_out_1存储in_1与in_2的和及差。在状态机的各种状态下使用这些临时变量可确保互斥状态之间的适当资源共享。
Verilog-2001状态机
module verilog_fsm (clk, reset, in_1, in_2, out); input clk, reset; input [3:0] in_1, in_2; output [4:0] out; parameter state_0 = 3'b000; parameter state_1 = 3'b001; parameter state_2 = 3'b010; parameter state_3 = 3'b011; parameter state_4 = 3'b100; reg [4:0] tmp_out_0, tmp_out_1, tmp_out_2; reg [2:0] state, next_state; always @ (posedge clk or posedge reset) begin if (reset) state <= state_0; else state <= next_state; end always @ (*) begin tmp_out_0 = in_1 + in_2; tmp_out_1 = in_1 - in_2; case (state) state_0: begin tmp_out_2 = in_1 + 5'b00001; next_state = state_1; end state_1: begin if (in_1 < in_2) begin next_state = state_2; tmp_out_2 = tmp_out_0; end else begin next_state = state_3; tmp_out_2 = tmp_out_1; end end state_2: begin tmp_out_2 = tmp_out_0 - 5'b00001; next_state = state_3; end state_3: begin tmp_out_2 = tmp_out_1 + 5'b00001; next_state = state_0; end state_4:begin tmp_out_2 = in_2 + 5'b00001; next_state = state_0; end default:begin tmp_out_2 = 5'b00000; next_state = state_0; end endcase end assign out = tmp_out_2; endmodule
通过使用‘define代替parameter数据类型可以实现此状态机的等效实现,如下所示:
在此情况下,您可以对state和next_state分配`state_x,而不是state_x,例如:
‘define state_0 3'b000 ‘define state_1 3'b001 ‘define state_2 3'b010 ‘define state_3 3'b011 ‘define state_4 3'b100
next_state <= ‘state_3;
注: 虽然Intel支持‘define构造语句,但也请使用parameter数据类型,因为它在整个综合过程中会保留状态名称。