实验要求
LED,每500ms,状态翻转一次 系统时钟为50M,对应周期是20ns 500ms = 500_000_000ns / 20ns = 25_000_000
代码编写
module Counter(Clk50M, Rst_n, led);//Rst_n表示低电平有效
input Clk50M;//系统时钟:50M
input Rst_n;//全局复位,低电平复位
output reg led;//led输出
reg [24:0]cnt;//定义计数器寄存器
//计数器技术进程
always@(posedge Clk50M or negedge Rst_n)//总在在时钟上升沿或者复位下降沿
if(Rst_n == 1'b0)
cnt <= 25'd0;
else if(cnt == 25'd24_999_999)//从0开始,只要加到24_999_999
cnt <= 25'd0;
else
cnt <= cnt + 1'b1;
//Led输出控制进程
always@(posedge Clk50M or negedge Rst_n)//总在在时钟上升沿或者复位下降沿
if(Rst_n == 1'b0)
led <= 1'b1;
else if(cnt == 25'd24_999_999)
led <= ~led;
else
led <= led;
endmodule
仿真文件编写
`timescale 1ns/1ns
`define clock_period 20 //声明一个宏定义参数
module Counter_tb;
reg clk;
reg rst_n;
wire led;
Counter counter0(
.Clk50M(clk), //这个前面的点一定要加
.Rst_n(rst_n),
.led(led)
);
initial clk = 1;//初始化clk是高电平
//表示时钟信号总是以#10ns翻转
always #(`clock_period/2) clk = ~clk; //(`)这表示调用一个宏定义的参数
initial begin
rst_n = 1'b0;
#(`clock_period * 200);
rst_n = 1'b1;
#2000000000;//延时2000毫秒
$stop;
end
endmodule
ModelSim仿真波形
如果是按照500ms翻转,博主已经试过,得跑四五十分钟才能看到波形,所以我们改成500us
(cnt == 25'd24_999_999)改成(cnt == 25'd24_999)

数字逻辑图
Quarters软件生成的数字逻辑电路
点击RTL Viewer,就可以该软件根据代码生成的数字逻辑图

Alipay
Wechat