这种状态机综合出来是什么结果,大家来看下。
时间:10-02
整理:3721RD
点击:
一般状态机的写法是这样的:
- module tradition_state_machine(
- input clk ,
- input rst_n ,
- output reg [3:0] state
- );
- reg [3:0] next_state;
- always @(posedge clk or negedge rst_n) begin
- if(rst_n == 1'b0)
- state <= 4'b0001;
- else
- state <= next_state;
- end
- always @(*) begin
- case(state)
- 4'b0001: next_state = 4'b0010;
- 4'b0010: next_state = 4'b0100;
- 4'b0100: next_state = 4'b1000;
- 4'b1000: next_state = 4'b0001;
- default: next_state = 4'b0001;
- endcase
- end
- endmodule
如果是这样写呢:
- module new_state_machine(
- input clk ,
- input rst_n ,
- output reg [3:0] state
- );
- reg [3:0] next_state;
- always @(posedge clk or negedge rst_n) begin
- if(rst_n == 1'b0)
- state <= 4'b0001;
- else
- state <= next_state;
- end
- always @(*) begin
- case(1'b1)
- state[0]: next_state = 4'b0010;
- state[1]: next_state = 4'b0100;
- state[2]: next_state = 4'b1000;
- state[3]: next_state = 4'b0001;
- default: next_state = 4'b0001;
- endcase
- end
- endmodule
这种写法是不是和这样是等价的呢?
- module ifelse_state_machine(
- input clk ,
- input rst_n ,
- output reg [3:0] state
- );
- reg [3:0] next_state;
- always @(posedge clk or negedge rst_n) begin
- if(rst_n == 1'b0)
- state <= 4'b0001;
- else
- state <= next_state;
- end
- always @(*) begin
- if(state[0]) next_state = 4'b0010;
- else if(state[1]) next_state = 4'b0100;
- else if(state[2]) next_state = 4'b1000;
- else if(state[3]) next_state = 4'b0001;
- else next_state = 4'b0001;
- end
- endmodule
可以用DC试试,你这种one hot编码方式,结果应该一样吧
case(1)应该是case(1'b1)吧
我比较倾向第一种写法,这种common代码,别出花样,第一种简单清晰。
這就是one hot coding,在FPGA design 上非常適合
但是樓主的寫法兩個其實不相等
因為
(status == 4'b0001) != (status[0] == 1'b1)
第二种写法是不符合语法的。
第一种和第二种case对应的state的有效状态数量显然不一样;
第三种 if else 是有优先级的,与case结构有明显区别。
