4位宽10进制计数器的实现

计数器是FPGA设计中最常用的一种时序逻辑,根据计数器的计数值我们可以精确计算出FPGA内部各种信号之间的时间关系,每个信号何时拉高、何时拉低、拉低需要多久、拉高需要多久,都可以比较精准的控制具体需要计数的时间。计数器一般是从0开始计数,计数到我们需要的值或者计数满溢出后清零,并可以进行不断的循环,3位数的十进制计数器可最大计数到999,4位数的最大可以计数到9999;3位数的二进制计数器最大可以计数到111(7),4位数的最大可以计数到1111(15),等等。

counter10.v

`timescale 1ns/1ns
module counter10(clk,rst_n,cnt,cout);
input clk;//input clock
input rst_n;//reset ,lowVoltage effect
output[3:0]cnt;//output counter
output cout;//overflow

reg[3:0] cnt_temp;
	
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		cnt_temp<=4'b0;
	end
	else if(cnt_temp==4'd9)begin
		cnt_temp<=4'b0000;
	end
	else begin
		cnt_temp<=cnt_temp+1'b1;		
	end
end

assign cout=(cnt_temp==4'd9);//ou cycle times
assign cnt = cnt_temp;//ou real time couter

endmodule

tb_counter10.v

`timescale 1ns/1ns
//parameter CYCLE = 10
module tb_counter();
parameter CYCLE = 10;
reg clk,rst_n;
//reg [3:0]cnt_temp;
//wire [3:0]cnt_temp;
wire cout;
wire [3:0] cnt;	
counter10 U0(
		.clk(clk),
		.rst_n(rst_n),
		.cout(cout),
		.cnt(cnt));
initial begin
	rst_n=1;
	rst_n = 0;
	#(20*CYCLE);
	rst_n=1;

end

//generate clk
initial begin
	clk = 0;
	forever begin
		#(CYCLE/2);
		clk = 1;
		#(CYCLE/2);
		clk = 0;
	end
end


initial begin
	#(200*CYCLE);
	$display("sim end!!!");
	$finish;
end

endmodule

wave:

cout信号输出周期位,cnt实时的计数器(0~9)。

Schematic:

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值