1.时序逻辑设计--计数器

zhanglei 2022年10月13日 394次浏览

1. 时序逻辑设计–计数器

D触发器

image-20221013133630445

D触发器会在时钟上升沿的时候讲输入端D的数据保存到输出端Q,下一个上升沿之前,Q的值不变,下一个上升沿时输出端Q的值取决于此时输入端D的值。

运用D触发器实现计数器

目标:每一次时钟上升沿,输出端Q的值加1

image-20221013134502121

设计一个以1秒频率闪烁的LED灯(亮灭各500ms)

在 vivado创建一个新工程

工程名称及目录

image-20221013135011524

芯片选择

image-20221013135132494

创建设计源文件

image-20221013135240251

image-20221013135323112

led_flash 代码

module led_flash(
    Clk,
    Reset_n,
    Led
);
    input Clk;
    input Reset_n;
    output reg Led
    // 由于500ms各亮灭一次,所以 500ms/20ns=25000000(次)需要25位二进制数表示
    
    reg[24:0] counter;
    //计数器
    always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)begin
            counter <= 0;
            led <= 0;
        end
        else if(counter == 25000000)begin
            led <= !led;
            counter <=0;
        end
        else
            counter <= counter + 1'b1;
endmodule    

创建仿真文件 led_test_tb

image-20221013141340088

代码如下:

`timescale 1ns / 1ps

module Led_flash_tb;

    reg Clk;
    reg Reset_n;
    wire Led;
    
    led_flash DUT(
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Led(Led)
	);
    
    initial Clk = 1;
    always #10 Clk = !Clk;
    
    initial begin
       Reset_n = 0; 
       // 让复位在时钟沿之后一点,方便看波形
       #201
       Reset_n = 1;
       #2000000000;
       $stop
    end
endmodule

Run Simulation

波形如下:

image-20221013175045993

打开详尽设计图 elaborate design

这一步是进行i/o约束的前提

image-20221013175356115

进行 i/o约束

根据开发板的管脚信息表,进行管脚绑定,即i/o约束

image-20221013182233758

打开上方的layout,选择 i/o planning

image-20221013193417338

Run Implementation

image-20221013193525627

之后输入约束文件名称:

image-20221013193632062

Generate Bitstream 并下载至板内

image-20221013193951045

选择 xc7z010_1,点击 program device

image-20221013194341786

可发现板上得到用户灯在闪烁