# 【深度教学2】手把手带你学会用EP4CE6F17C8实现FPGA流水灯

63 篇文章 3 订阅

LED的引脚分配见下表。

### 二、实验代码

module led4_shift (
input    clk,            //板载50HMz系统时钟
input rst_n,             //复位按键
output reg[3:0] led      //4个LED
);

reg [27:0] timer;            //定义时钟计数器

//4秒循环计数
always@(posedge clk or negedge rst_n)    //敏感信号为时钟上沿或复位下沿
begin
if (rst_n == 1'b0)                     //低电平复位
timer <= 28'd0;                        //复位时时钟计数器清零
else if (timer == 28'd199_999_999)     //时钟计数器到达4秒时
timer <= 28'd0;                    //时钟计数器清零
else
timer <= timer + 28'd1;            //时钟计数器加1，即来一次时钟脉冲加一次
end

//LED控制
always@(posedge clk or negedge rst_n)    //敏感信号为时钟上沿或复位下沿
begin
if (rst_n == 1'b0)                    //低电平复位时LED全灭
led <= 4'b0000;
else if (timer == 28'd49_999_999)     //时钟到1秒时，LED0点亮
led <= 4'b0001;
else if (timer == 28'd99_999_999)     //时钟到2秒时，LED1点亮
led <= 4'b0010;
else if (timer == 28'd149_999_999)    //时钟到3秒时，LED2点亮
led <= 4'b0100;
else if (timer == 28'd199_999_999)    //时钟到4秒时，LED3点亮
led <= 4'b1000;
end
endmodule

module led4_shift (
input    clk,            //板载50HMz系统时钟
input rst_n,             //复位按键
output reg[3:0] led      //4个LED
);

reg [25:0] timer;            //定义时钟计数器
reg [2:0] sec;               //定义秒计数器

//4秒循环计数
always@(posedge clk or negedge rst_n)    //敏感信号为时钟上沿或复位下沿
begin
if (rst_n == 1'b0)                      //低电平复位
begin
timer <= 26'd0;                     //复位时时钟计数器及秒计数器清零
sec <= 3'd0;
end
else if (timer == 26'd49_999_999)      //时钟计数器到达1秒时
begin
timer <= 26'd0;                     //时钟计数器清零
sec <= sec + 3'd1;                  //秒计数器加1
end
else if(sec == 3'd4)                   //秒计数器加到4时恢复零
sec <= 3'd0;
else
timer <= timer + 26'd1;             //时钟计数器加1，即来一次时钟脉冲加一次
end

//LED控制
always@(posedge clk or negedge rst_n)    //敏感信号为时钟上沿或复位下沿
begin
if (rst_n == 1'b0)                      //低电平复位时LED全灭
led <= 4'b0000;
else if (sec == 3'd1)                   //时钟到1秒时，LED0点亮
led <= 4'b0001;
else if (sec == 3'd2)                   //时钟到2秒时，LED1点亮
led <= 4'b0010;
else if (sec == 3'd3)                   //时钟到3秒时，LED2点亮
led <= 4'b0100;
else if (sec == 3'd4)                   //时钟到4秒时，LED3点亮
led <= 4'b1000;
end
endmodule

### 三、代码说明

1、always语句为过程语句，用于引导顺序语句，设计模块中的任何顺序语句都必须放在过程语句结构中。在@之后的括号中，列出所有输入敏感信号。在always语句中申明的变量必须为reg类型，不能使用wire类型。
begin与end之间为顺序块语句，仅限于用在always引导的过程语句结构中（assign中不能使用块语句）。
2、“<=”属于非阻塞赋值符号（“=”属于阻塞型赋值），只能用于顺序语句中，不能在assign引导的并行语句中。即assign中只能使用“=”赋值，而always中可以两种（"="和"<="）都使用，但在同一过程中对同一变量赋值，两种不允许混用。而且，在许多情况下，不同的赋值符号将导致不同的电路结构和逻辑功能的综合结果。注意，对同一个变量的赋值不能出现在两个以上的always语句中。
3、条件判断if语句必须放在由always引导的顺序结构中。数字常量要指明位宽及使用的进制方式，如4'b0001，4表示位宽为4，b表示使用二进制，后面的数字要符合位宽。
4、同一结果可以有多种程序设计形式，以消耗逻辑器件最少为佳。

### 四、实验步骤

FPGA开发的详细步骤请参见“基于EP4CE6F17C8的FPGA开发流程（以半加器为例）”一文，本例只对一同之处进行说明。

• 0
点赞
• 2
收藏
觉得还不错? 一键收藏
• 3
评论
01-04 1万+
02-25 3312
03-25 603
05-18 5554
12-19 1811
07-29 1071
03-14 1331
10-15 5044
04-15 4228
11-21 3527

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。