1 4、设计一个以一秒闪烁的LED灯(亮灭各500ms)
2 //分析,由于这次实验引入了上升沿,这个上升沿是时序逻辑电路,只有当上升沿到来时,才会出现发生改变。
3 //由于ACX720内部是50Mhz晶振,故而周期为20ns,500ms➗20ns=25 000 000(个计数单位),
4 //而只需要从0计数到24 999 999,下面的条件会使用这个,达到500ms后LED反转(0变1,1变0)
5 //在本接中引入了(posedge clk or negedge reset_n),每到上升沿才进行下面的条件语句。
6 源代码
7 module led_flash(
8 clk,
9 reset_n,
10 led
11 );
12 input clk;
13 input reset_n;
14 output reg led;
15 reg [24:0] counter;
16 always@(posedge clk or negedge reset_n) begin
17 if(!reset_n)
18 counter<=0;
19 else if(counter==24999999)
20 counter<=0;
21 else
22 counter<=counter+1'd1;
23 end
24 always@(posedge clk or negedge reset_n) begin
25 if(!reset_n)
26 led<=0;
27 else if(counter==24999999)
28 led=!led;
29 end
30 //always@(posedge clk or negedge reset_n)
31 // if(!reset_n) begin
32 // counter<=0;
33 // led<=0;
34 // end
35 // else if(counter==24999999) begin
36 // led=!led;
37 // counter<=0;
38 // end
39 // else
40 // counter<=counter+1'd1;
41 endmodule
42 闪烁LED灯testbench源代码
43 `timescale 1ns/1ns
44 module led_flash_tb();
45 reg s_clk;
46 reg s_reset_n;
47 wire s_led;
48 led_flash led_flash_inst0(
49 .clk(s_clk),
50 .reset_n(s_reset_n),
51 .led(s_led)
52 );
53 initial s_clk=1;
54 always #10 s_clk=~s_clk;
55 initial begin
56 s_reset_n=0;
57 #201;
58 s_reset_n=1;
59 #2000000000;
60 $stop;
61 end
62 endmodule
63
64
65