首页 > 其他分享 >23- BCD码

23- BCD码

时间:2023-07-06 22:37:31浏览次数:33  
标签:wire 23 BCD shift 二进制 data reg

1.BCD码

  • 数码管动态显示的data[19:0]使用二进制数表示的多位十进制数,不能直接生成段选和片选信号,需要使用BCD码表示的十进制数
  • BCD码(Binary-Coded Decimal),又称为二-十进制码,使用四位二进制数来表示1位十进制数中的0-9这十个数,是一种二进制的数字编码形式,用二进制编码的十进制代码
  • 分类:有权码和无权码,这里的权字表示权值,有权码四位二进制数中的
  • 有权码:8421码,5421码,2421码
  • 无权码:余三码,余三循环码,格雷码
  • 使用多位数码管表示234,二进制表示就是1110_1010,使用8421码表示0010_0011_0100
  • 使用多位数码管显示234,需要使用动态扫描的方式,要依次显示个位,十位,百位,要求能从传入的数据中得到个位,十位,百位,所以使用BCD码可以直接得到位选信号和段选信号

1.1 二进制数转换为BCD码

  • 实现转换的第一步,就是在输入的二进制码之前补多少个0,补(十进制数位数*4)个0
  • 234 -- 前面补12个0,然后看BCD码每一位,如果小于等于4,就保持不变,进行移位操作(左移);如果大于4,就将补的BCD码进行加3
  • 直到二进制数为0,补充的BCD码位就是对应的二进制数的BCD码,十进制数-->二进制数-->BCD码
  • 移位次数:输入多少位二进制数,就会移位多少次

2.BCD码转换模块

2.1 模块框图

添加BCD码转换模块

  • 输入时钟和复位信号
  • 输入十进制数的二进制编码
  • 输出六路BCD码4bit,输出的6路BCD码分别用个位,十位,百位,千位,万位,十万位表示

    系统框图需要进行修改

2.2 波形图

  • 二进制码向BCD码的转换是通过判断运算加移位操作实现的,移位次数是与二进制数的位数相关的,需要移位计数器对于判断运算和移位次数进行计数,移位次数是20次,所以位宽为5bit
  • 需要一个中间变量存储中间的数据,data_shift[43:0],(二进制数位数+BCD码位数)
  • 判断运算在前,移位操作在后,需要一个标志信号区分这两个操作(shift_flag),但是这两个操作是在一个时钟周期内完成的,每次移位操作都是在判断计算之后进行的

2.3 RTL

module bcd_8421(
	input	wire			sys_clk,
	input	wire			sys_rst_n,
	input	wire	[19:0]	data,
	
	output	reg	[3:0]	unit	,
	output	reg	[3:0]	ten		,
	output	reg	[3:0]	hun		,
	output	reg	[3:0]	thou	,
	output	reg	[3:0]	t_thou	,
	output	reg	[3:0]	h_hun	,
	
);

	reg	[4:0]	cnt_shift;
	reg	[43:0]	data_shift;
	reg			shift_flag;
	
	
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_clk == 1'b1)
			cnt_shift <= 5'd0;
		else if((cnt_shift == 5'd21)&&(shift_flag == 1'b1))
			cnt_shift <= 5'd0;
		else if(shift_flag == 1'b1)
			cnt_shift <= cnt_shift + 1'b1;
		else	
			cnt_shift <= cnt_shift;
			
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_clk == 1'b1)
			data_shift <= 44'b0;
		else if(cnt_shift == 5'd0)
			data_shift <= {24'b0,data};
		else if((shift_flag == 1'b0) && (cnt_shift <= 20))
			begin
				data_shift[23:20] <= (data_shift[23:20] > 4) ? (data_shift[23:20] + 2'd3) : data_shift[23:20];
			    data_shift[27:24] <= (data_shift[27:24] > 4) ? (data_shift[27:24] + 2'd3) : data_shift[27:24];
			    data_shift[31:28] <= (data_shift[31:28] > 4) ? (data_shift[31:28] + 2'd3) : data_shift[31:28];
			    data_shift[35:32] <= (data_shift[35:32] > 4) ? (data_shift[35:32] + 2'd3) : data_shift[35:32];
			    data_shift[39:36] <= (data_shift[39:36] > 4) ? (data_shift[39:36] + 2'd3) : data_shift[39:36];
			    data_shift[43:40] <= (data_shift[43:40] > 4) ? (data_shift[43:40] + 2'd3) : data_shift[43:40];
			end
		else if((shift_flag == 1'b1)&&(cnt_shift <= 20))
			data_shift <= data_shift << 1;
		else	
			data_shift <= data_shift;
			
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_clk == 1'b1)
			shift_flag <= 1'b0;
		else 
			shift_flag <= ~shift_flag;
	
	// 输出信号
	always@(posedge sys_clk or negedge sys_rst_n)
		if(sys_clk == 1'b1)
			begin
				unit	<= 4'b0;
				ten		<= 4'b0;
				hun		<= 4'b0;
				thou	<= 4'b0;
				t_thou	<= 4'b0;
				h_hun	<= 4'b0;
			end
		else if(data_shift == 5'd21)
			begin
				unit	<= data_shift[23:20];
				ten		<= data_shift[27:24];
                hun		<= data_shift[31:28];
                thou	<= data_shift[35:32];
                t_thou	<= data_shift[39:36];
				h_hun	<= data_shift[43:40];
			end
	
endmodule

2.4 Testbench


`timescale 1ns/1ns
module tb_bcd_8421();
	reg			sys_clk		;
	reg			sys_rst_n	;
	reg	[19:0]	data		;
	
	wire [3:0]	unit		;
	wire [3:0]	ten			;
	wire [3:0]	hun			;
	wire [3:0]	thou		;
	wire [3:0]	t_thou		;
	wire [3:0]	h_hun		;
	
	initial begin
		sys_clk = 1'b1;
		sys_rst_n <= 1'b0;
		data <= 20'd0;
		#30
		sys_rst_n <= 1'b1;
		data <= 20'd123_456;
		#3000;
		data <= 20'd654_321;
		#3000;
		data <= 20'd987_654;
		#2000;
		data <= 20'd999_999;
	end
	
	always #10 sys_clk = ~sys_clk;
	
	
	bcd_8421 bcd_8421_inst(
	.sys_clk	(sys_clk	)	,
	.sys_rst_n	(sys_rst_n	)	,
	.data		(data		)	,
	.unit		(unit		)	,
	.ten		(ten		)	,
	.hun		(hun		)	,
	.thou		(thou		)	,
	.t_thou		(t_thou		)	,
	.h_hun		(h_hun		)	,
	
);
	
	

endmodule

2.5 仿真

标签:wire,23,BCD,shift,二进制,data,reg
From: https://www.cnblogs.com/Icer-newer/p/17530555.html

相关文章

  • 2023-07-06:RabbitMQ中的AMQP是什么?
    2023-07-06:RabbitMQ中的AMQP是什么?答案2023-07-06:AMQPAMQP(AdvancedMessageQueuingProtocol)是一个应用层协议的开放标准,旨在设计面向消息的中间件。基于AMQP协议的客户端和消息中间件可以自由地传递消息,不受客户端、中间件产品或开发语言的限制。其目标是实现一种被广泛应用......
  • P8182 「EZEC-11」雪的魔法 / NOIP 模拟赛 20230706 D 思考--zhengjun
    引用:这是一道非常棒的思维题,可以说没有用到任何高深的知识点,却极大地考验了做题人的思维能力和创造性。本题分为两步。根据线性规划对偶或贪心,转化题意。对\(m\)根号分治,然后分别进行分治。\(m\le\sqrt{n}\)分治比较好想,\(m>\sqrt{n}\)的根号分治比较难想。这......
  • QOJ 5500. Bars / NOIP 模拟赛 20230706 B 进阶版--zhengjun
    本题转化为梯形面积就已经不是很好想了(赛时切掉,开心!)进阶为静态区间查询。使用不删除莫队+凸包合并凸包合并就是把散块和整块的凸包合并注意这里两个凸包的横坐标值域是无交的于是可以使用二分套二分解决此问题代码咕着,感觉非常难写......
  • 2023年度计划
    2023年度计划暑假计划语文:所有初中语文必背内容及注释 会背会默坚持练习《万唯》阅读题尝试练习行楷字体阅读《红星照耀中国》《昆虫记》《雾都孤儿》数学:初中数学内容学完(借助《一本涂书》《万唯中考试题研究》),北京卷120分,河南卷115分以上高中数学《必修一》学习部......
  • 更实、更新、更深,三大趋势看懂2023国剧上半场
    延续了重质而非重量的思路,在2022年优秀国产剧频出之后,2023年H1优质剧呈现出了井喷的状态。爱奇艺更是作为剧集市场的风向标,贡献了多部爆款。年初《狂飙》以人气口碑双丰收开启了新年档,最近《长风渡》又掀起暑期档的追剧热潮。国产电视剧市场俨然已经进入到新的阶段。根据艺恩数据......
  • 230706 // 换根 DP 复习
    菌:园什是我笋子元首:我是你打野我:元首耳朵得治G.求树的重心http://222.180.160.110:1024/contest/3744/problem/7我们知道,重心的定义是,将其切除后,每个连通块的大小不超过\(\dfracn2\)。连通块分为其子树和整棵树减去该结点引导的子树,所以我们记录size,在每次搜索结束后......
  • 2023.7.6拷逝
    T1原题链接对于区间\([l,r]\),答案是\(max(cntr,cntl)-x\)(其中\(cntl,cntr\)分别表示区间内左括号和右括号的数量,\(x\)表示匹配的括号数量)。首先考虑\(max(cntr,cntl)\)。该柿子可以转化成\((cntl+cntr+|cntr-cntl|)/2\)。前面的\(cntl+cntr\)非常好算,就是\(\sum......
  • [总结]2023-7-6A组模拟赛
    [总结]2023-7-6A组模拟赛P1心路历程看完题之后发现:唉,好像简单了一点。然后就开始想T1。一开始以为是DP,发现不好转移。不知道为什么脑子里面一直在想二维偏序,之后就往数据结构方面想。我发现:一个点,绝对不可能从后面走回来。类似于这样:之后就想到:如果是这样,那么到一个点路程......
  • 活动开启 | 以梦筑码 · 不负韶华 开发者故事征集令,讲出你的故事,有机会参加HDC.Togeth
     HarmonyOS面世以来,经历了3大版本迭代,系统能力逐步完善,生态加速繁荣。一路前行,是开发者们点亮漫天星光。点滴贡献,聚沙成塔,开发者们正用代码改变世界。是梦想,激励我们一路前行。在黎明到来前,有人在迷雾中启程,有人在坎坷中奔跑,有人在未知中探索,有人在困境中坚持,有人在挫折里涅......
  • 2023-07-06 Matlab中符号和句柄之间的转换.md
    2023-07-06Matlab中符号和句柄之间的转换Matlab符号函数函数句柄在Matlab中我们通常使用diff函数求导,其中如果f是符号函数,diff也返回符号函数,那么符号函数和句柄之间如何转换呢?下面给出一些例子:f1=@(x)sin(x);%函数句柄 symsx f2=sin(x);%符号 f3(x)=sin(x);%符......