上次的闪烁灯实验,重新熟悉了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
在软件综合过后,下载到板子里,可以看到最终实现流水灯效果~~~