达芬奇pro的FPGA学习笔记4--LED闪烁(500ms灯1亮,500ms灯2亮)

这篇博客介绍了如何通过修改Verilog代码,使得LED灯能够以500ms的周期交替闪烁。原始代码中,LED灯的点亮时间存在微小误差。通过调整计数器的阈值,将代码中的计数上限减一,确保了每个LED灯亮500ms。修改后的代码在仿真中达到了预期效果,实现了1秒内两个LED灯各亮500ms的交替闪烁功能。
摘要由CSDN通过智能技术生成

参考正点原子的代码

module led_twinkle(
input sys_clk,
input sys_rst,
output [1:0] led
    );

reg [25:0] cnt = 26'd0;
assign led = (cnt<26'd2500_0000)?2'b01:2'b10;

always @(posedge sys_clk or negedge sys_rst)
begin
    if(!sys_rst)
        cnt <= 26'd0;
    else if(cnt<26'd5000_0000)
        cnt <= cnt +1'b1;
    else 
        cnt <= 26'd0;
end
endmodule

此时的testbench代码如下

`timescale 1ns / 1ps

module testbench();
reg sys_clk = 0;
reg sys_rst = 0;
wire [1:0] led;
always #10 sys_clk = !sys_clk;

initial
begin
    #5
    sys_rst = 1;
end

led_twinkle led_twinkle_tb(
.sys_clk(sys_clk),
.sys_rst(sys_rst),
.led(led)         
);

endmodule

当进行仿真的时候,可以看出实际灯1和灯2的点亮的时间并不为500ms。
在这里插入图片描述
在这里插入图片描述
从上面的图中可以看出,led1和led2点亮的时间是不相同的,led2的多了20ns,也就是一个时钟周期。

要想灯1亮500ms、灯2亮500ms,那么总的时间为1s。
这时候假设时钟周期为20ns,那么总共需要5000_0000个这样的周期。
计数器cnt的取值应该为0-4999_9999,只需要修改一个地方就行
always @(posedge sys_clk or negedge sys_rst)
begin
if(!sys_rst)
cnt <= 26’d0;

else if(cnt<26’d5000_0000-1’d1)
cnt <= cnt +1’b1;
else
cnt <= 26’d0;
end
endmodule

修改后的Verilog代码如下

module led_twinkle(
input sys_clk,
input sys_rst,
output [1:0] led
    );

reg [25:0] cnt = 26'd0;
assign led = (cnt<26'd2500_0000)?2'b01:2'b10;

always @(posedge sys_clk or negedge sys_rst)
begin
    if(!sys_rst)
        cnt <= 26'd0;
    else if(cnt<26'd5000_0000-1'd1)
        cnt <= cnt +1'b1;
    else 
        cnt <= 26'd0;
end
endmodule

这时候在继续进行仿真。
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值