基于FPGA的简易计数器

本文提供了一个Verilog编写的工程模块程序,展示了同步和异步信号在时序逻辑中的应用。模块counter包含了对输入时钟clk、复位信号rst_n和使能信号en的处理,其中rst_n为异步信号,en为同步信号。通过测试仿真程序,演示了不同信号如何影响计数器cnt的值,并提供了仿真波形的链接以供进一步理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 工程模块程序:

module counter(
  input clk,
  input rst_n,
  input en,
  output[3:0] cntValue);
	
  reg[3:0] cnt;
  always@(posedge clk or negedge rst_n)
  begin
    if(!rst_n)
    begin
  	 cnt <= 4'b0000;
    end
    else
    begin
  	 if(en == 1'b1)
  	 begin
  		if(cnt == 4'b1111)
  		begin
  		  cnt <= 4'b0000;
  		end
  		else
  		begin
  		  cnt <= cnt + 4'b0001;
  		end
  	 end
  	 else
  	 begin
  		cnt <= cnt;
  	 end
    end
  end
  
  assign cntValue = cnt;

endmodule

 同步与异步是时序逻辑,指的是与时钟的关系;如果在always敏感信号里写了某一信号,则为异步,否则为同步;如本例中的rst_n信号,无论clk上升沿是否存在,只要rst_n下降沿来临均会触发cnt复位;而en信号仅在clk上升沿来临时才会起作用,所以en信号属于同步信号。通过该程序可以学习了解同步和异步的知识点。

此外,需要注意的时,在always敏感信号列表中写了negedge rst_n,则必须在always块中以!rst_n或rst_n ==0,即低有效的方式表示。

RTL Viewer

 测试仿真程序

`timescale 1ns/1ps
`define clk_period 10

module counter_tb;

  reg clk;
  reg rst_n;
  reg en;
  
  wire[3:0] cntValue;
  
  counter counter_inst(
    .clk(clk),
    .rst_n(rst_n),
    .en(en),
    .cntValue(cntValue));
  
  initial clk = 1'b0;
  always #(`clk_period / 2) clk = ~clk;
  
  initial
  begin
    rst_n = 1'b1;
	 en = 1'b0;
	 #(`clk_period * 20);
	 rst_n = 1'b0;
	 #(`clk_period * 20);
	 rst_n = 1'b1;
	 #(`clk_period * 21);
	 en = 1'b1;
	 #(`clk_period * 200);
	 en = 1'b0;
	 #(`clk_period * 100);
	 rst_n = 1'b0;
	 #(`clk_period * 100);
	 $stop;
  end

endmodule

仿真波形 

 百度网盘工程链接:

链接:https://pan.baidu.com/s/16FlvYALv7_p2zBUne3FPGg 
提取码:gse3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值