小边想要日更!盲猜明天就会断hh,因为明晚我应该在疯狂看计网。。
文章目录
- 1. 设计输入
- 2. 功能仿真
- 3. 板子调试
- 时序逻辑基本概念:输出还与时钟信号相关
- D触发器 - 也就是有“记忆”特性,能存储电平状态
- 计数器基本概念,基本4位加法器结构图
- 计数值与技术时间之间的关系
1. 设计输入
设计一个以每隔1s闪烁的LED灯(亮灭各500ms)
CK在一般系统中非常稳定50MHz —— 一周期20ns
那~ 就+(500ms/20ns) = 25*10^6次 这要多少位计数器呢?
计数器核心代码 ——
module ledfash (
//端口
Clk,
Reset_n, //复位
Led
);
//端口定义
input Clk;
input Reset_n;
output reg Led;
reg[24:0] counter;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n) begin
counter <= 0;
Led <=0;
end
else if(counter == 24999999) begin
Led <= !Led;
counter <= 0;
end
else
counter <= counter + 1'd1;
endmodule
学习新语法,争做新青年
posedge clk
这是时序逻辑描述的标准模式
-
poseedge
时钟上升沿作为敏感信号 -
negedge
时钟下降沿到来会会工作
<=
是非阻塞赋值,你暂且理解为=,下篇blog详谈- Led 要在 always块中赋值,需要定义为
reg
型,否则会爆红 - 两条语句用
begin-end
括起来,作用相当于{} - 24999999: 0-1,1-2 … 24999999-0
推荐分开写,有利于综合器分析 ——
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter <= 0;
else if(counter == 24999999)
counter <= 0;
else
counter <= counter + 1'd1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
Led <=0;
else if(counter == 24999999)
Led <= !Led;
分析综合~ 嗯嗯,没啥错误
2. 功能仿真
`timescale 1ns/1ns
module led_flash_tb();
//激励信号
reg Clk;
reg Reset_n;
wire Led;
led_flash led_flash_inst(
//连线
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led)
);
initial Clk = 1;
always #10 Clk = !Clk; //每延时10s,翻转
initial begin
Reset_n = 0;
#201;
Reset_n = 1;
#2000000000;
$stop;
end
endmodule
3. 板子调试
管脚约束
ctrl + s → Generate bitstream
Okk啦~