概述
主要讲解了同步清零和异步清零以及如何编写程序及仿真?
//时序逻辑
module counter(
clk,
en,
clr,
cnt_value
);
input clk;//时钟信号
input en;//复位信号
input clr;//清零信号
output [3:0] cnt_value;
reg [3:0] cnt;//计数器
//异步清零
always@ (posedge clk or posedge clr)
if(clr)
cnt <= 4’b0;
else if(en) begin
cnt <= cnt + 1’b1;
end
//同步清零
always@ (posedge clk)
if(clr)
cnt <= 4’b0;
else if(en) begin
cnt <= cnt + 1’b1;
end
assign cnt_value = cnt;
仿真验证:
//仿真 计数器 异步清零
//仿真文件
`timescale 1ns/1ps
`define clk_period 10
module counter_tb;
//激励信号,也称输入信号
reg clk_t;
reg en_t;
reg clr_t;
//输出信号
wire [7:0] cnt_value_t;
//模块实例化
counter_test counter_test1(
.clk(clk_t),
.en(en_t),
.clr(clr_t),
.cnt_value(cnt_value_t[7:4])
);
counter_test counter_test2(
.clk(clk_t),
.en(en_t),
.clr(clr_t),
.cnt_value(cnt_value_t[3:0])
);
initial clk_t = 1;
//时钟信号
always #( `clk_period/2) clk_t = ~clk_t;
initial begin
en_t = 0;
clr_t = 0;
#(` clk_period*20);
clr_t = 1;
#(` clk_period*20);
clr_t = 0;
#(` clk_period*20);
en_t = 1;
#(` clk_period*200);
en_t = 0;
#(` clk_period*50);
clr_t = 1;
#(` clk_period*50);
clr_t = 0;
$stop;//终止仿真
endmodule
实例:
要求:
点亮LED灯;
以20HZ(周期50ms,25ms亮,25ms暗)的频率闪烁。时钟周期是20ns。
实现LED灯翻转,是否需要计数器,计数器的位宽是对少,计数的值是多少。
实现:50ms实现LED灯翻转,即2 500 000个时钟周期之后,进行翻转。所以,需要计数器,统计2 500 000个时钟周期,位宽是:22,计数最大值是2 499 9999.
module counter(clk,rst_n,en,led);
input clk;
input rst_n;
input en; //使能信号
output [3:0]led; //4个led灯
reg [21:0]cnt; //计数器
reg [3:0]led_r;
parameter cnt_max = 22'd2_499_999; //led每个50ms变化一次(20*2499_999 = 50_000_000ns)
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 22'd0;
else if(en)
begin
if(cnt == cnt_max)
cnt <= 22'd0;
else
cnt <= cnt + 1'b1;
end
else
cnt <= 22'd0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
led_r <= 4'b1110; //led_r低电平点亮
else if(cnt == cnt_max)
led_r <= {led_r[0],led_r[3:1]}; //循环右移点亮一位led灯
else
led_r <= led_r; //使LED灯保持原状
assign led = led_r;
endmodule
最后
以上就是热心果汁为你收集整理的FPGA学习笔记(三)——Verilog时序逻辑设计与验证的全部内容,希望文章能够帮你解决FPGA学习笔记(三)——Verilog时序逻辑设计与验证所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复