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