- 小梅哥Xilinx FPGA学习笔记3——时序逻辑电路设计之计数器, 实现led的定时亮灭
- 时序逻辑需要按照时钟行动(一般使用always @(posedge clk),posedge clk告诉始终块在时钟信号的上升沿触发时执行),
- 时序逻辑需要用到寄存器向量 ,比如 reg [7:0] memory; // 声明一个 8 位宽存储器
- 高,低电平复位电路原理及加电容的作用
- Verilog wire 类型表示硬件单元之间的物理连线,寄存器(reg)用来表示存储单元
module led_flash(clk,reset_n,led);
input clk;
input reset_n;//_n代表低电平有效
output reg led;
// assign reset=~reset_n;
reg [24:0] counter;//定义计数器寄存器
//计数器计数进程
always@(posedge clk or negedge reset_n)//posedge上升沿,即以时钟的上升沿为敏感信号,或者复位信号的下降沿
if(!reset_n) // 如果复位信号 (reset_n) 是低电平(即有效)
counter <= 25'b0;//非阻塞赋值
// 25'b0 表示一个 25 位宽的二进制数,其中所有位都被置为逻辑值 0。这个数在二进制中表示为 25 个 0。
// 非阻塞赋值即赋值操作不会立即生效,而是在始终块结束后生效,因此可以用于描述时序逻辑。
else if(counter==25000000-1)//让counter复位置0也需要耗费一个周期,所以需要延时多久翻转,则需要将延时时间除以周期时长再减去1,得到此处的counter数
counter <= 25'b0;
else
counter <= counter+1'b1;
//led输出控制进程
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <= 0;
else if(counter==25000000-1)
led <= !led;//在always里赋值,则必须为reg型
endmodule
- 合写
module led_flash(clk,reset_n,led);
input clk;
input reset_n;//_n代表低电平有效
output reg led;
// assign reset=~reset_n;
reg [24:0] counter;//定义计数器寄存器
always@(posedge clk or negedge reset_n)
if(!reset_n)
begin // 多个执行语句用begin、end括起来
counter <= 0;
led <= 0 ;
end
else if(counter == 25000000)
begin
led <= !led; //在always里赋值,则必须为reg型
counter <= 0;
end
else
begin
counter <= counter+1'd1;
end
endmodule
tb
`timescale 1ns / 1ns //时间刻度 时间的单位/ 1ns精度
module led_flash_tb();
reg clk;
reg reset_n;
wire led;
led_flash led_flash(
.clk(clk),
.reset_n(reset_n),
.led(led)
);
initial clk = 1'b1;
always #10 clk=~clk; //延时半个周期10ns,翻转clk值,模拟实现时钟信号
initial begin
reset_n = 1'b0;
#201;//延迟时间不应为周期的整数倍
reset_n = 1'b1;
#2000000000;//等待两秒,看实际状态
$stop;
end
endmodule
856

被折叠的 条评论
为什么被折叠?



