1 //跑马灯(三种不同的写法)源代码
2 module led_run_p(
3 clk,
4 reset_n,
5 led
6 );
7 input clk;
8 input reset_n;
9 // output reg [7:0] led;//前面两次跑马灯写法所用的语句
10 output wire [7:0] led;//这次借用了3,8译码器,故而将led当作了输出,所以用了wire
11 reg [24:0] counter;
12 parameter MCNT=25'b24999;//为了方便观看仿真波形,将时间调为500us.
13 //parameter MCNT=25'b24999999;//这个就是下载到开发板的源代码,这个代码的时间是500ms,仿真时间比较长,图像观测不出来。
14 always@(posedge clk or negedge reset_n)
15 if(!reset_n)
16 counter<=0;
17 else if(counter==MCNT)
18 counter<=0;
19 else
20 counter<= counter+1'd1;
21 //这里介绍第三种,导入其他模块(利3—8译码器的跑马灯)的跑马灯。
22 reg [2:0] counter2;
23 always @(posedge clk or negedge reset_n)
24 if(!reset_n)
25 counter2<=0;
26 else if(counter==MCNT)
27 counter2<=counter2+1'b1;
28 decoder_3_8 decoder_3_8_inst0(
29 .a(counter2[2]),
30 .b(counter2[1]),
31 .c(counter2[0]),
32 .out(led)
33 );
34
35
36
37
38 // initial led<=8'b0000_0001;
39 // always @(posedge clk or negedge reset_n)begin
40 // if(!reset_n)
41 // led<=8'b0000_0001;
42 // else if(counter==24999)
43 ////这是改进过的跑马灯,利用了{}的拼接技术。
44 // led<={led[6:0],led[7]};
45
46
47
48 //这是原来的7位数码管跑马灯,
49 // if(led==8'b1000_0000)
50 // led<=8'b0000_0001;
51 // else
52 // led<=led<<1;
53 //跑马灯testbench仿真代码
54 `timescale 1ns/1ns
55 module led_run_p_tb();
56 reg clk;
57 reg reset_n;
58 wire [7:0] led;
59 led_run_p led_run_p_inst0(
60 .clk(clk),
61 .reset_n(reset_n),
62 .led(led)
63 );
64
65 initial clk=1;
66 always #10 clk=~clk;
67
68 initial begin
69 reset_n=0;
70 #201;
71 reset_n=1;
72 #4000000;
73 $stop;
74 end
75
76 endmodule
77