FPGA开发板学习(2)---- 流水灯及非阻塞的思考

 1 `timescale 1ns / 1ps
 2 //////////////////////////////////////////////////////////////////////////////////
 3 // Company: 
 4 // Engineer: 
 5 // 
 6 // Create Date: 2021/04/14 16:27:21
 7 // Design Name: 
 8 // Module Name: led_part
 9 // Project Name: 
10 // Target Devices: 
11 // Tool Versions: 
12 // Description: 
13 // 
14 // Dependencies: 
15 // 
16 // Revision:
17 // Revision 0.01 - File Created
18 // Additional Comments:
19 // 
20 //////////////////////////////////////////////////////////////////////////////////
21 
22 
23 module led_part(
24     input clk,
25     input rst_n,
26     output reg [15:0]led
27     );
28     reg clk_50hz;
29     reg [19:0]count;
30     always @(posedge clk or negedge rst_n)
31     begin
32         if(!rst_n) begin count<=20'd0; clk_50hz<=0; end
33         else
34             begin
35                 if (count>=20'd999999)
36                     begin count<=20'd0; clk_50hz<=~clk_50hz; end
37                 else
38                     count<=count + 20'd1;
39             end
40     end
41     reg [3:0]led_cnt;
42     reg [3:0]led_times;
43     reg direction;
44     always @(posedge clk_50hz or negedge rst_n)
45     begin
46         if(!rst_n) begin led_cnt<=4'd0; led<=16'd1; led_times<=4'd0; end
47         else
48             begin
49                 if (led_cnt>=4'd9)
50                     begin 
51                     
52                         if(led_times>=4'd15)
53                         begin
54                             led_times=4'd0;
55                             direction=~direction;
56                         end
57                         if(direction == 0)
58                             led={led[14:0],led[15]}; 
59                         else if(direction == 1)
60                             led={led[0],led[15:1]};
61                     led_cnt=4'd0;
62                     led_times=led_times+4'd1;
63                     end
64                 else
65                 led_cnt<=led_cnt +4'd1;
66              end   
67     end
68 endmodule

led_times变量在54,62赋值,这样如果使用非阻塞赋值,对于变量赋值是混乱的,要格外注意

参考准则:

1)时序电路建模时,用非阻塞赋值;
2)锁存器电路建模时,用非阻塞赋值;
3)用always块建立组合逻辑模型时,用阻塞赋值;
4)在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值;
5)在同一个alway块中,不要即用非阻塞又用阻塞赋值;
6)不要在一个以上的always块中为同一个变量赋值;
7)用$strobe系统任务来显示用非阻塞赋值的变量值;
8)在赋值时不要使用#0延迟。


详见:https://blog.csdn.net/weixin_42369496/article/details/92643285

上一篇:采用面向对象思想组装一台计算器


下一篇:[04]Go设计模式:抽象工厂模式(Abstract Factory Pattern)