欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FPGA7 3BCD计数器级联

程序员文章站 2022-06-08 22:57:01
...

电路

FPGA7 3BCD计数器级联

三个BCD计数器,进行级联
第一个计数器计满十次,第二个计数器计一次。
第二个计数器计一次,第三个计数器计一次。
10的三次方=1000 也就是说,即使是当cin一直为有效电平的时候,时钟上沿也要到来1000次
最后面的Cout 才会输出1
这期间 q[11,0] 的值会一直变化 由0~999 都是bcd码

底层计数器

module  BCD_counter (Clk,Cin,Rst_n,Cout,q);
 		input Clk; 
 		input Cin; //进位输入 与普通计数器一样 这个为高电平时
 				   //计数器的值才会+1
 		input Rst_n; 

 		output  Cout;  
 					
 		output [3:0]q; //计数值输出


		reg [3:0]cnt; //凡是在always中赋值的都应该是reg类型
					  //定义一个计数器

	//计数过程
    aaa@qq.com(posedge Clk or negedge Rst_n)
    if (Rst_n == 1'b0)
    	cnt <= 4'd0;  
    else if (Cin == 1'b1) begin 
		if (cnt == 4'd9)
			cnt <= 4'd0;
	    else 
	    	cnt <= cnt + 1'b1;
    end
    else
    	cnt <= cnt ;   //可写可不写


    //产生进位输出信号
    assign  Cout = (Cin == 1'b1 && cnt == 4'd9) ;
    //当计数器计数值为9 并且 cin为1时, Cout=1
    
    
    assign q = cnt; //把cnt的值传给q 实时输出到外部
 endmodule

计数器拼接 (记得设置为顶层模块)

module BCD_counter_top(Clk,Cin,Rst_n,Cout,q);
	
	    input Clk; 
 		input Cin; 		   
 		input Rst_n; 

 		output  Cout; 
 		output [11:0]q; //3个计数器级联

		wire cout0;
		wire cout1;
		wire [3:0]q0;
		wire [3:0]q1;
		wire [3:0]q2;
		
    assign q = {q2,q1,q0}; //花括号进行位拼接

	BCD_counter C0(
					.Clk(Clk),//共用
				 	.Cin(Cin),
				 	.Rst_n(Rst_n),
				 	
				 	.Cout(cout0),//共用
				 	.q(q0)
				 	);


	BCD_counter C1(
					.Clk(Clk),//共用
				 	.Cin(cout0),
				 	.Rst_n(Rst_n),//共用
				 	
				 	.Cout(cout1),
				 	.q(q1)
				 	);
				 	
	BCD_counter C2(
					.Clk(Clk),//共用
				 	.Cin(cout1),
				 	.Rst_n(Rst_n),//共用
				 	
				 	.Cout(Cout),
				 	.q(q2)
				 	);
endmodule 

testbench

`timescale 1ns/1ns

module BCD_counter_top_tb;

	reg clk1;
	reg cin1;
	reg rst_n1;
	
	wire cout1;
	wire [11:0]q1;
	
	BCD_counter_top u0(
					.Clk(clk1),
				 	.Cin(cin1),
				 	.Rst_n(rst_n1),
				 	
				 	.Cout(cout1),
				 	.q(q1)
				 	);

initial clk1 = 1'b1;

always#(20/2) 
		clk1 = ~ clk1;
		
initial begin
	rst_n1 = 1'b0;
	cin1 = 1'b0;
	#(20*200);
	rst_n1 = 1'b1;
	#(20*20);


    
    cin1 = 1'b1;
    

   #(20*2000);//延时2000的时钟周期 大于999 保证能看到
$stop;

  end
			
endmodule

前仿真

q的值从 0到999 共改变1000次,计数共完成1000次 。
FPGA7 3BCD计数器级联
FPGA7 3BCD计数器级联

后仿真

FPGA7 3BCD计数器级联

相关标签: 细啃FPGA