FPGA 11 基础 8421BCD码

在这里插入图片描述

FPGA 11 基础 8421BCD码

在这里插入图片描述

主要功能: 每次在时钟上升沿到来期间,单cin 为高电平时,模块实现计数,并且输出端 :q[3:0] 实时输出8421BCD 码,且当计数到10以后,输出端产生进位信号Cout.

实现(设计)流程:内部设计一个计数器,对其进行循环计数。对计数的值使用case 语句来输出对应的BCD 码值(注:这里是8421BCD 码,和正常的二进制计数是一致的,所以不需要设计独立的 case: 语句来进行编码)。当计数到了10以后,产生进位信号。

实验目的 : 了解什么是BCD码 : 用4位二进制数来表示1位十进制数中的0~9这10个数码

​ 常用的BCD 码有: 8421、5421、2421、余3码(注: 余3码是8421 BCD码的每个码组加3(0011)形成)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YT5tSTvo-1627395414941)(img/blog_img/fpga/image-20210720114342919.png)]

BCD_Counter.v文件


module BCD_Counter( 
	Clk ,
	Cin ,
	Rst_n ,
	Cout ,
	q
);

	input Clk ;
	input Cin ;
	input Rst_n ;
	
	output Cout ;
	output [3:0]q ;
	
	reg [3:0]cnt ;
	
	//always block 
	always@(posedge Clk or negedge Rst_n)
	if(Rst_n== 1'b0)
		cnt <= 0 ;
	else if(Cin == 1'b1)
	  begin
		if(cnt == 4'd9)
			cnt <= 0 ;
		else
			cnt <= cnt + 1'b1 ;
		end
	else
		cnt <= cnt ;

	/*	
	//always block
	always@(posedge Clk or negedge Rst_n)
	if(Rst_n== 1'b0)
		Cout <= 0 ;
	else if(cnt == 4'd8 && Cin == 1'b1)
		Cout <= 1'b1 ;
	else
		Cout <= 1'b0 ;
	*/
	//assign Cout = (cnt == 4'd9 && Cin == 1'b1);
	
	assign Cout = (cnt == 4'd9);
	assign q = cnt ;

	
endmodule

BCD_Counter_tb.v 文件

`timescale 1ns/1ns
`define clock_period 20
module BCD_Counter_tb;
	reg Clk ;
	reg Cin ;
	reg Rst_n ;
	
	wire Cout ;
	wire [3:0]q ;

	BCD_Counter BCD_Counter0( 
		.Clk(Clk) ,
		.Cin(Cin) ,
		.Rst_n(Rst_n) ,
		.Cout(Cout) ,
		.q(q)
	);

	initial Clk = 0 ;
	always #(`clock_period/2) Clk = ~Clk ;
	
	initial begin
		Rst_n = 1'b0 ;
		Cin	= 1'b0 ;
		#(`clock_period *20);
		Rst_n = 1'b1 ;
		
		repeat(30) begin
		#(`clock_period * 5); 		Cin	= 1'b1 ;
		#(`clock_period * 1); 		Cin	= 1'b0 ;	
		end
		
		#(`clock_period * 200);
		$stop ;
		
		end

endmodule


BCD_Counter_top.v 文件

module BCD_Counter_top(
	Clk ,
	Cin ,
	Rst_n ,
	Cout ,
	q

);

	input Clk ;
	input Cin ;
	input Rst_n ;
	
	output  Cout ;
	output [11:0]q ;

	wire cout0 ;
	wire cout1 ;
	
	//wire {3:0}q0,q1,q2;
	//assign q ={q2,q1,q0} ; //位拼接操作
	
	
	BCD_Counter BCD_Counter0( 
		.Clk(Clk) ,
		.Cin(Cin) ,
		.Rst_n(Rst_n) ,
		.Cout(cout0) ,
		.q(q[3:0])
	);

	BCD_Counter BCD_Counter1( 
		.Clk(Clk) ,
		.Cin(cout0) ,
		.Rst_n(Rst_n) ,
		.Cout(cout1) ,
		.q(q[7:4])
	);

	BCD_Counter BCD_Counter2( 
		.Clk(Clk) ,
		.Cin(cout1) ,
		.Rst_n(Rst_n) ,
		.Cout(Cout) ,
		.q(q[11:8])
	);

	
	
endmodule



BCD_Counter_top_tb.v 文件

`timescale 1ns/1ns
`define clock_period 20
module BCD_Counter_top_tb;
	reg Clk ;
	reg Cin ;
	reg Rst_n ;
	
	wire Cout ;
	wire [11:0]q ;

	BCD_Counter_top BCD_Counter_top_0( 
		.Clk(Clk) ,
		.Cin(Cin) ,
		.Rst_n(Rst_n) ,
		.Cout(Cout) ,
		.q(q)
	);

	initial Clk = 0 ;
	always #(`clock_period/2) Clk = ~Clk ;
	
	initial begin
		Rst_n = 1'b0 ;
		Cin	= 1'b0 ;
		#(`clock_period *20);
		Rst_n = 1'b1 ;
		/*
		repeat(4300) begin
		#(`clock_period * 1); 		Cin	= 1'b1 ;
		#(`clock_period * 1); 		Cin	= 1'b0 ;	
		end
		*/
		#(`clock_period * 200);
		Cin	= 1'b1 ;
		#(`clock_period * 3200);
		$stop ;
		
		end

endmodule




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值