1 时序逻辑设计之计数器
-
时序逻辑基本概念(相较于之前的三八译码器组合逻辑电路)
-
计数器基本概念,基本的4位加法器结构图
-
设计一个以1秒钟频率闪烁的LED灯(亮灭各500ms)
-
计数值与计数时间的关系
组合逻辑电路:(二选一多路器,38译码器),只要输入变了,输出就会变,只与输入信号有关。
时序逻辑电路:与时序信号有关。
当CK的上升沿(由0变成1)到来的时候,这时候D端口的值,才会送到Q端口的值。
这时候D触发器就会有存储特性,只有在ck上升沿的时候才能改变Q的输出。
计数器:
2 实验代码
2.1 系统设计
// 驱动LED灯 500ms/20ns 因为一个周期是 20ns(50MHz)
// 要计数 25000000, 要计算选择多少位的计数器,需要有25位
module led_flash(
Clk,
Reset_n, // _n 为低电平有效
Led
);
input Clk;
input Reset_n;
output reg Led;
// 需要有一个计数器
reg [24:0] counter;
// <= 非阻塞赋值的意思
// 计数器核心逻辑, 在always块中赋值必须是reg型
always@(posedge Clk or negedeg Reset_n)
if(!Reset_n) begin
counter <= 0;
Led <= 0;
end
else if(counter == 25000000 - 1) begin
Led <= !Led;
counter <= 0;
end
else
counter <= counter + 1'd1;
// 推荐分开写
endmodule
2.2 功能仿真
时序电路写testbench
`timescale 1ns/1ns
module led_flash_tb;
reg Clk;
reg Reset_n;
wire Led;
led_flash led_flash(
.Clk(Clk),
.Reset_n(Reset_n), // _n 为低电平有效
.Led(Led)
);
initial Clk = 1;
always#10 Clk = !clk; // 按位取反 和 什么取反
initial begin
Reset_n = 0;
#201;
Reset_n = 1;
#2000000000;
$stop
end
endmoudle