我是靠谱客的博主 淡然大叔,最近开发中收集的这篇文章主要介绍FPGA(五)---BCD计数器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、BCD码

BCD码就是将十进制中的数,转换为十六进制,都用二进制进行表示。
例如:153 转换为十六进制是99 --> 1001 1001
68 转换为十六进制是45 -->0100 0101

二、代码

模块一:四位计数器

module BCD_counter(cin,clk,rst_n,cout,q);
	input cin,clk,rst_n;
	
	output reg cout;
	output [3:0]q;
	
	reg [3:0]cnt;  //定义计数器,reg类型才能进行计数
	
	always@(posedge clk, 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 + 4'd1;
		end
	else
		cnt <= cnt;

	always@(posedge clk, negedge rst_n)//得到计数器输出
	if(rst_n == 1'b0)
		cout <= 1'b0;
	else if(cin == 1'b1 && cnt == 4'd9)
		cout <= 1'b1;
	else 
		cout <= 1'b0;
	assign q = cnt;
endmodule

模块二:四位计数器的测试

`timescale 1ns/1ps
`define clock_period 20

module BCD_counter_tb;
	
	reg cin;
	reg clk;
	reg rst_n;
	
	wire cout;
	wire [3:0]q;
	
	BCD_counter bcd_counter1(
	.cin(cin),
	.clk(clk),
	.rst_n(rst_n),
	.cout(cout),
	.q(q)
	);
	
	initial clk = 1'b1;
	always #(`clock_period/2) clk = ~ clk;
	
	initial begin
		rst_n = 1'b0;
		cin = 1'b0;
		#(`clock_period*100);
		rst_n = 1'b1;
		repeat(20)begin
			cin = 1'b0;
			#(`clock_period*5);
			cin = ~cin;
			#(`clock_period);
			cin = 1'b0;
		end
		#(`clock_period*20);
		$stop;
	end
	
endmodule

模块三:八位计数器

module BCD_counter_top(cin,cout,rst_n,q,clk);

	input cin;
	input rst_n;
	input clk;
	
	output cout; //此模块中cout没有进行加减,不能用reg
	output [7:0]q;
	
	wire cout1;

	BCD_counter counter1(
	.cin(cin),
	.clk(clk),
	.rst_n(rst_n),
	.cout(cout1),
	.q(q[3:0])
	);
	BCD_counter counter2(
	.cin(cout1),
	.clk(clk),
	.rst_n(rst_n),
	.cout(cout),
	.q(q[7:4])
	);
endmodule

模块四:

`timescale 1ns/1ps
`define clock_period 20
module BCD_counter_top_tb;
	
	reg cin,rst_n,clk;
	
	wire [7:0]q;
	wire cout;
	
	BCD_counter_top counter_top(
	.cin(cin),
	.cout(cout),
	.rst_n(rst_n),
	.q(q),
	.clk(clk)
	);
	
	initial clk = 1'b1;
	always #(`clock_period/2) clk =~clk;
	
	initial begin
		rst_n = 1'b0;
		cin = 1'b0;
		#(`clock_period*20);
		rst_n = ~rst_n;
		#(`clock_period*5);
		repeat(20)begin
			cin = 1'b0;
			#(`clock_period*5);
			cin = ~cin;
			#(`clock_period*5);
			cin = 1'b0;
		end
		#(`clock_period*20);
		$stop;
	end

endmodule

三、出现问题

第一个问题:
在这里插入图片描述
2、上述代码展示的是两个十进制的9进行级联,但是由于每个9是由4bit进行表示的,那么高4位的9实际上不是910,而是916=144,加上低四位的9,其实最大数是十进制的153(十六进制的99)。
当0000_1001 + 1 —> 0001_0000,对于十进制而言:由9变成了16,对于十六进制而言:由09变成了10.
十进制中间跳过了一些数,所以总的计数与十六进制是相同的,最大计数都是99。

最后

以上就是淡然大叔为你收集整理的FPGA(五)---BCD计数器的全部内容,希望文章能够帮你解决FPGA(五)---BCD计数器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部