OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5591|回复: 1

[新手问题]正反循环流水灯(纯新手)

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-5-12
在线时间
2 小时
发表于 2019-7-3 22:25:46 | 显示全部楼层 |阅读模式
1金钱
星期二刚买的板子,开始跟视频学习.
才学到第一课流水灯,学完后自己想改一下,改成可以正反循环流水的.
但是怎么都不对,第一次从右到左流完就结束了.

请各位指点迷津啊. 代码如下

  1. module verilog_test (
  2.     input               clk,
  3.     input               rst_n,
  4.     output  reg[3:0]    led
  5. );

  6. // to set up a counter for every 0.2 s
  7. // 1 second / 50MHz = 0.2 / xHz  => x = 10MHz
  8. // to hold 10_000_000, it needs 24 bits.

  9. reg     [23:0]  counter;      
  10. reg     [1:0]   led_status;     //to judge the led status
  11. reg     direction_flag;         //dicide which direction the led flow

  12. parameter CNT_200MS = 24'd10_000_000;


  13. //generate signal with 10MHz (0.2s)
  14. always [url=home.php?mod=space&uid=95564]@[/url] (posedge clk or negedge rst_n) begin
  15.     if(!rst_n)
  16.         counter <= 24'd0;
  17.     else begin
  18.         if(counter < CNT_200MS)
  19.             counter <= counter + 1'b1;
  20.         else
  21.             counter <= 24'd0;
  22.     end
  23.       
  24. end

  25. //  +/- flow_led
  26. always @ (posedge clk or negedge rst_n) begin
  27.     if(!rst_n) begin
  28.         // initialize
  29.         led_status <= 2'b00;
  30.         direction_flag <= 1'b1;
  31.         led <= 4'b0001;
  32.     end
  33.     // every 200ms trigger
  34.     else if (counter == CNT_200MS) begin
  35.         // status + 1
  36.         led_status <= led_status + 1'b1;
  37.         // judge status to decide direction
  38.         if (led_status == 2'b11)
  39.             direction_flag <= ~direction_flag;
  40.         else
  41.             direction_flag <= direction_flag;
  42.         // flow according direction
  43.         if (direction_flag)
  44.             led = led << 1;
  45.         else
  46.             led = led >> 1;              
  47.     end
  48.     else
  49.         led <= led;
  50. end

  51. endmodule
复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-5-12
在线时间
2 小时
 楼主| 发表于 2019-7-3 22:55:35 | 显示全部楼层
本帖最后由 snakeqx 于 2019-7-3 22:58 编辑

我好像明白了. 根据视频介绍:

因为<=的赋值是并发的,而且整个一个always里面都是并发的,所以先全部算右值,再赋值左边.
于是我"错过"了切换的机会, 而下次触发的时候1已经移出范围,导致LED里的值全是0,而且因为没有1了,后面怎么移也不会有1.
我改了一下代码,至少运行正常了.

还请各位能指点一下是不是这样的.

  1. module verilog_test (
  2.     input               clk,
  3.     input               rst_n,
  4.     output  reg[3:0]    led
  5. );

  6. // to set up a counter for every 0.2 s
  7. // 1 second / 50MHz = 0.2 / xHz  =? x = 10MHz
  8. // to hold 10_000_000, it needs 24 bit.

  9. reg     [23:0]  counter;        
  10. reg     [1:0]   led_status;     //to judge the led status
  11. reg     direction_flag;         //dicide which direction the led flow

  12. parameter CNT_200MS = 24'd10_000_000 -1'b1;


  13. //generate signal with 10MHz (0.2s)
  14. always @ (posedge clk or negedge rst_n) begin
  15.     if(!rst_n)
  16.         counter <= 24'd0;
  17.     else begin
  18.         if(counter < CNT_200MS)
  19.             counter <= counter + 1'b1;
  20.         else
  21.             counter <= 24'd0;
  22.     end
  23.         
  24. end

  25. //  +/- flow_led
  26. always @ (posedge clk or negedge rst_n) begin
  27.     if(!rst_n) begin
  28.         // initialize
  29.         led_status <= 2'b01; //////////////////////这里从1开始
  30.         direction_flag <= 1'b1;
  31.         led <= 4'b0001;
  32.     end
  33.     // every 200ms trigger
  34.     else if (counter == CNT_200MS) begin
  35.         // status + 1
  36.         led_status <= led_status + 1'b1;
  37.         // judge status to decide direction
  38.         if (led_status == 2'b11) begin
  39.             direction_flag <= ~direction_flag;
  40.             led_status <= 2'b01; /////////////////////////只用3位,所以这里回复1
  41.         end
  42.         else
  43.             direction_flag <= direction_flag;
  44.         // flow according direction
  45.         if (direction_flag)
  46.             led = led << 1;
  47.         else
  48.             led = led >> 1;               
  49.     end
  50.     else
  51.         led <= led;
  52. end

  53. endmodule
复制代码





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表