在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2266|回复: 6

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

[复制链接]
发表于 2017-8-11 22:43:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 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



复制代码
发表于 2017-8-12 07:39:34 | 显示全部楼层
回复 1# kevindas

可以用DC试试,你这种one hot编码方式,结果应该一样吧
发表于 2017-8-12 22:53:17 | 显示全部楼层
case(1)应该是case(1'b1)吧
发表于 2017-8-14 10:36:56 | 显示全部楼层
我比较倾向第一种写法,这种common代码,别出花样,第一种简单清晰。
发表于 2017-8-14 17:31:03 | 显示全部楼层
這就是one hot coding,在FPGA design 上非常適合
但是樓主的寫法兩個其實不相等
因為
(status == 4'b0001) != (status[0]  == 1'b1)
发表于 2017-8-15 11:21:45 | 显示全部楼层
第二种写法是不符合语法的。
发表于 2017-8-15 15:22:44 | 显示全部楼层
第一种和第二种case对应的state的有效状态数量显然不一样;
第三种 if else 是有优先级的,与case结构有明显区别。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 19:30 , Processed in 0.027874 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表