FPGA -- 实验二:流水灯

  上次的闪烁灯实验,重新熟悉了FPGA开发的流程,这次实现一个最简单的流水灯

  BJEPM开发板上有4个LED,和黑金里面的教程类似,因此以这个为模板来进行

  基本思路是:(原理参考verilog那些事建模篇)

  设计四个模块,扫描周期一样,但是是在周期内的不同时间段来实现

  

  设计框图:

  

  下面直接上代码了

  led1_module:

 1 /****************************************
 2 *文件名:led1_module.v
 3 *功能:实现第一个流水灯扫描效果
 4 ****************************************/
 5 
 6 module led1_module(
 7     CLK,RST_n,
 8     LED1
 9 );
10 
11 input CLK;
12 input RST_n;
13 output LED1;
14 
15 //************************************
16 //因为扫描周期为1s,所以每个灯亮0.25s
17 //50MHZ的晶振下计数值为12_500_000
18 parameter COUNT_1S = 26'd50_000_000;
19 
20 
21 //************************************
22 reg [25:0]count;
23 
24 always @(posedge CLK or negedge RST_n)
25     if(!RST_n)
26         count <= 26'd0;
27     else if(count == COUNT_1S)
28         count <= 26'd0;
29     else
30         count <= count + 1'b1;
31         
32 //***************************************
33 reg rLED1;
34 
35 always @(posedge CLK or negedge RST_n)
36     if(!RST_n)
37         rLED1 <= 1'd0;
38     else if(count >= 0 && count <= 26'd12_500_000)
39         rLED1 <= 1'd1;
40     else 
41         rLED1 <= 1'd0;
42         
43 assign LED1 = rLED1;
44 
45 endmodule

  led2_module:

 1 /****************************************
 2 *文件名:led2_module.v
 3 *功能:实现第二个流水灯扫描效果
 4 ****************************************/
 5 
 6 module led2_module(
 7     CLK,RST_n,
 8     LED2
 9 );
10 
11 input CLK;
12 input RST_n;
13 output LED2;
14 
15 //************************************
16 //因为扫描周期为1s,所以每个灯亮0.25s
17 //50MHZ的晶振下计数值为12_500_000
18 parameter COUNT_1S = 26'd50_000_000;
19 
20 
21 //************************************
22 reg [25:0]count;
23 
24 always @(posedge CLK or negedge RST_n)
25     if(!RST_n)
26         count <= 26'd0;
27     else if(count == COUNT_1S)
28         count <= 26'd0;
29     else
30         count <= count + 1'b1;
31         
32 //***************************************
33 reg rLED2;
34 
35 always @(posedge CLK or negedge RST_n)
36     if(!RST_n)
37         rLED2 <= 1'd0;
38     else if(count >= 26'd12_500_000 && count <= 26'd25_000_000)
39         rLED2 <= 1'd1;
40     else 
41         rLED2 <= 1'd0;
42         
43 assign LED2 = rLED2;
44 
45 endmodule

  led3_module:

 1 /****************************************
 2 *文件名:led3_module.v
 3 *功能:实现第三个流水灯扫描效果
 4 ****************************************/
 5 
 6 module led3_module(
 7     CLK,RST_n,
 8     LED3
 9 );
10 
11 input CLK;
12 input RST_n;
13 output LED3;
14 
15 //************************************
16 //因为扫描周期为1s,所以每个灯亮0.25s
17 //50MHZ的晶振下计数值为12_500_000
18 parameter COUNT_1S = 26'd50_000_000;
19 
20 
21 //************************************
22 reg [25:0]count;
23 
24 always @(posedge CLK or negedge RST_n)
25     if(!RST_n)
26         count <= 26'd0;
27     else if(count == COUNT_1S)
28         count <= 26'd0;
29     else
30         count <= count + 1'b1;
31         
32 //***************************************
33 reg rLED3;
34 
35 always @(posedge CLK or negedge RST_n)
36     if(!RST_n)
37         rLED3 <= 1'd0;
38     else if(count >= 26'd25_000_000 && count <= 26'd37_500_000)
39         rLED3 <= 1'd1;
40     else
41         rLED3 <= 1'd0;
42         
43 assign LED3 = rLED3;
44 
45 endmodule

  led4_module:

 1 /****************************************
 2 *文件名:led4_module.v
 3 *功能:实现第四个流水灯扫描效果
 4 ****************************************/
 5 
 6 module led4_module(
 7     CLK,RST_n,
 8     LED4
 9 );
10 
11 input CLK;
12 input RST_n;
13 output LED4;
14 
15 //************************************
16 //因为扫描周期为1s,所以每个灯亮0.25s
17 //50MHZ的晶振下计数值为12_500_000
18 parameter COUNT_1S = 26'd50_000_000;
19 
20 
21 //************************************
22 reg [25:0]count;
23 
24 always @(posedge CLK or negedge RST_n)
25     if(!RST_n)
26         count <= 26'd0;
27     else if(count == COUNT_1S)
28         count <= 26'd0;
29     else
30         count <= count + 1'b1;
31         
32 //***************************************
33 reg rLED4;
34 
35 always @(posedge CLK or negedge RST_n)
36     if(!RST_n)
37         rLED4 = 1'd0;
38     else if(count >= 26'd37_500_000 && count <= 26'd50_000_000)
39         rLED4 <= 1'd1;
40     else 
41         rLED4 <= 1'd0;
42         
43 assign LED4 = rLED4;
44 
45 endmodule

  led_module:

 1 /*********************************************
 2 *文件名:led_module.v
 3 *功能:实现四位LED流水灯效果(扫描频率为1s)
 4 *平台:win7 64 quartus ii 64bit
 5 *连接:CLK -- 12    RST_n -- 44
 6         LED1-4     --        21-18    (高电平点亮)
 7 *********************************************/
 8 
 9 module led_module(
10         CLK,RST_n,
11         LED1,LED2,LED3,LED4
12 );
13 
14 input CLK;
15 input RST_n;
16 output LED1;
17 output LED2;
18 output LED3;
19 output LED4;
20 
21 led1_module U1(
22     .CLK(CLK),
23     .RST_n(RST_n),
24     .LED1(LED1)
25 );
26 
27 led2_module U2(
28     .CLK(CLK),
29     .RST_n(RST_n),
30     .LED2(LED2)
31 );
32 
33 led3_module U3(
34     .CLK(CLK),
35     .RST_n(RST_n),
36     .LED3(LED3)
37 );
38 
39 led4_module U4(
40     .CLK(CLK),
41     .RST_n(RST_n),
42     .LED4(LED4)
43 );
44 
45 endmodule

  在软件综合过后,下载到板子里,可以看到最终实现流水灯效果~~~

原文地址:https://www.cnblogs.com/zhq-blog/p/6186797.html