FPGA小白学习日记-基于赛灵思XC7A35T

本文讲述了如何使用Xilinx大学计划EGO1开发板设计一个每秒闪烁的LED灯,通过100MHz时钟计数实现500ms亮灭周期。过程中遇到复位信号同步问题的解决和异步计数器的实际应用,强调了硬件设计中复位信号的正确连接和代码调试的重要性。
摘要由CSDN通过智能技术生成

一、实验目标:设计一个以1s频率闪烁的LED灯(亮灭各500ms)
二、实验用开发板:xilinx大学计划EGO1开发板,板载100Mhz时钟
三、实现思路:板载100Mhz,可知时钟周期为10ns。要想实现亮灭各500ms,可设计一个计数器,可通过计数clk脉冲周期个数来达到计时目的。因此可以算出需要连续计数500ms/10ns=50000000个时钟周期。并使用基本D触发器实现LED亮灭状态的存储。
四、实现过程中的问题:
1、从下图中可以看到高电平持续时间不是500ms整,而是500.000010000ms。
在这里插入图片描述
在这里插入图片描述

由于上述数字太大,下面以模为4的计数器为例,计数应该是0-1、1-2、2-3、3-4,但是实际还多了一个4-0,实际计数到了因此需要N-1,在本文中计数最大值就是50000000-1=49999999.
2、复位信号在代码不同位置的综合问题,如下图,先放正确的

module led_flash(
    input clk,
    input rst,
    output reg led
    );
reg [26:0]cnt;
always@(posedge clk or posedge rst)begin
    if(rst)begin             //复位信号单独列写
        cnt <= 0;
    end
    else if(cnt == 50000000)begin                           
        cnt <= 0;
    end
    else
        cnt <= cnt+1'b1;
end
always@(posedge clk or posedge rst)begin
    if(rst)begin
        led <= 0;
    end
    else if(cnt == 50000000)begin
        led <= ~led;
    end
end
endmodule


综合出的RTL,可以看到复位信号连接到了计数器和D触发器。
下面再放上错误的代码

module led_flash(
    input clk,
    input rst,
    output reg led
    );
reg [26:0]cnt;
always@(posedge clk or posedge rst)begin
    if(cnt == 50000000 || rst)begin      //这里又用软件的思维去写硬件了,想着反正都是计数器清零                      
        cnt <= 0;                        //为了代码精简点,放一起算了。
    end                                  
    else
        cnt <= cnt+1'b1;
end
always@(posedge clk or posedge rst)begin
    if(rst)begin
        led <= 0;
    end
    else if(cnt == 50000000)begin
        led <= ~led;
    end
end
endmodule

在这里插入图片描述
可以看到复位信号连接到一个mux上了,并没有连接到计数器。
调试看来不能只盯着代码看,还要多看看综合后的RTL啊。
说了半天,上面提到的都是异步复位,同步复位的,以后碰到了在写文章吧,今天就到这里。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值