1. 时序逻辑设计–计数器
D触发器
D触发器会在时钟上升沿的时候讲输入端D的数据保存到输出端Q,下一个上升沿之前,Q的值不变,下一个上升沿时输出端Q的值取决于此时输入端D的值。
运用D触发器实现计数器
目标:每一次时钟上升沿,输出端Q的值加1
设计一个以1秒频率闪烁的LED灯(亮灭各500ms)
在 vivado创建一个新工程
工程名称及目录
芯片选择
创建设计源文件
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
代码如下:
`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
波形如下:
打开详尽设计图 elaborate design
这一步是进行i/o约束的前提
进行 i/o约束
根据开发板的管脚信息表,进行管脚绑定,即i/o约束
打开上方的layout,选择 i/o planning
Run Implementation
之后输入约束文件名称:
Generate Bitstream 并下载至板内
选择 xc7z010_1,点击 program device
可发现板上得到用户灯在闪烁