FPGA实验 - 流水灯测试
·
流水灯设计
- 硬件电路

- 由原理图可见,LED高电平有效。
- 引脚图

设计要求
- 4颗LED依次点亮1s,对于50MHz的系统时钟,一个时钟周期是20ns,则1s则需要50,000,000个时钟周期。
- 如果用计数器累加1次表示一个时钟周期,那么50,000,000个时钟周期需要计数49,999,999(从0开始计数)。
方式一(计数4s)
- 设计思想:有上面的设计要求可知,1s的时间要计数49,999,999,2s计数99,999,999,3s计数149,999,999,4s计数199,999,999,依次循环。
- LED0,LED1,LED2,LED3,初始0000,把上面的计数作为判断条件,依次切换即可。
// first project: led_test
// Date : 2021/12/13
// By : Coucher
// Module function : Running-water lamp
module led_test(
input clk, // system clock 50MHz
input rst_n, // reset, low active
output reg[3:0] led // LED, use for control the LED signal
);
// define the time counter
reg[31:0] cnt;
// cycle counter: from 0 to 4 sec
always@(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
cnt <= 32'd0;
else if(cnt == 32'd199_999_999)
cnt <= 32'd0;
else
cnt <= cnt + 32'd1;
end
// LED control
always@(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
led <= 4'b0000;
else if(cnt == 32'd49_999_999)
led <= 4'b0001;
else if(cnt == 32'd99_999_999)
led <= 4'b0010;
else if(cnt == 32'd149_999_999)
led <= 4'b0100;
else if(cnt == 32'd199_999_999)
led <= 4'b1000;
end
endmodule
仿真
- 程序编写
`timescale 1ns/1ns // define time scale
module led_test_tb();
reg clk;
reg rst_n;
wire [3:0] led;
initial
begin
clk = 1'b0;
rst_n = 1'b0;
#100 rst_n = 1'b1; // rst_n = 1'b1 after 100ns
end
always #10 clk = ~clk; // 50MHz
led_test led_test_inst(
.clk (clk),
.rst_n(rst_n),
.led(led)
);
endmodule
- 仿真波形,可见满足设计要求

绑定引脚

编译下载

上板测试

方式二(位拼运算符)
- 位拼运算符是将多个小的表达式合并成一个大的表达式,用{}来实现多个表达式的连接运算,不仅进行简单数据的拼接,可以用来执行“移位”。
- 由上面硬件电路可知,led高电平点亮,则由如下启发:

module led_test(
input clk, // system clock 50MHz
input rst_n, // reset, low active
output reg[3:0] led // LED, use for control the LED signal
);
//// define the time counter
reg[31:0] cnt;
// 循环计数1s
always@(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
cnt <= 32'd0;
else if(cnt == 32'd49_999_999)
cnt <= 32'd0;
else
cnt <= cnt + 32'd1;
end
// 优化算法,采用拼接运算符
// 采用位拼运算符的方式,根据计数产生1s的计时,1s后“移位”一次即可
always@(posedge clk or negedge rst_n)
begin
if(~rst_n)
led <= 4'b0001;
else if(cnt == 32'd49_999_999)
led <= {led[0],led[3:1]};
end
endmodule
- 注:时钟1s的计数器还是要的,不然系统时钟的频率,下载在开发板上,人眼根本看不出来,只会觉得灯常亮。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)