返回列表 发帖

[讨论] 这种状态机综合出来是什么结果,大家来看下。

[讨论] 这种状态机综合出来是什么结果,大家来看下。

本帖最后由 kevindas 于 2017-8-13 23:06 编辑

一般状态机的写法是这样的:
  1. module tradition_state_machine(
  2.     input               clk     ,
  3.     input               rst_n   ,
  4.     output reg [3:0]    state
  5. );

  6. reg [3:0] next_state;

  7. always @(posedge clk or negedge rst_n) begin
  8.     if(rst_n == 1'b0)
  9.         state <= 4'b0001;
  10.     else
  11.         state <= next_state;
  12. end

  13. always @(*) begin
  14.     case(state)
  15.     4'b0001: next_state = 4'b0010;
  16.     4'b0010: next_state = 4'b0100;
  17.     4'b0100: next_state = 4'b1000;
  18.     4'b1000: next_state = 4'b0001;
  19.     default: next_state = 4'b0001;
  20.     endcase
  21. end

  22. endmodule
复制代码


如果是这样写呢:
  1. module new_state_machine(
  2.     input               clk     ,
  3.     input               rst_n   ,
  4.     output reg [3:0]    state
  5. );

  6. reg [3:0] next_state;

  7. always @(posedge clk or negedge rst_n) begin
  8.     if(rst_n == 1'b0)
  9.         state <= 4'b0001;
  10.     else
  11.         state <= next_state;
  12. end

  13. always @(*) begin
  14.     case(1'b1)
  15.     state[0]:   next_state = 4'b0010;
  16.     state[1]:   next_state = 4'b0100;
  17.     state[2]:   next_state = 4'b1000;
  18.     state[3]:   next_state = 4'b0001;
  19.     default:    next_state = 4'b0001;
  20.     endcase
  21. end

  22. endmodule
复制代码


这种写法是不是和这样是等价的呢?
  1. module ifelse_state_machine(
  2.     input               clk     ,
  3.     input               rst_n   ,
  4.     output reg [3:0]    state
  5. );

  6. reg [3:0] next_state;

  7. always @(posedge clk or negedge rst_n) begin
  8.     if(rst_n == 1'b0)
  9.         state <= 4'b0001;
  10.     else
  11.         state <= next_state;
  12. end

  13. always @(*) begin
  14.     if(state[0])        next_state = 4'b0010;
  15.     else if(state[1])   next_state = 4'b0100;
  16.     else if(state[2])   next_state = 4'b1000;
  17.     else if(state[3])   next_state = 4'b0001;
  18.     else                next_state = 4'b0001;
  19. end

  20. endmodule
复制代码

回复 1# kevindas

可以用DC试试,你这种one hot编码方式,结果应该一样吧

TOP

case(1)应该是case(1'b1)吧

TOP

我比较倾向第一种写法,这种common代码,别出花样,第一种简单清晰。
海阔天空,漠大无边

TOP

這就是one hot coding,在FPGA design 上非常適合
但是樓主的寫法兩個其實不相等
因為
(status == 4'b0001) != (status[0]  == 1'b1)

TOP

第二种写法是不符合语法的。

TOP

第一种和第二种case对应的state的有效状态数量显然不一样;
第三种 if else 是有优先级的,与case结构有明显区别。

TOP

返回列表

站长推荐 关闭


欢迎访问 TI SLL(信号链)专区

欢迎访问 TI SLL(信号链)专区


查看