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  

 

posted on 2023-02-10 15:41  无情的造轮子  阅读(250)  评论(0编辑  收藏  举报