首页 > 代码库 > bcd转二进制
bcd转二进制
BCD码用于显示,但是计算器内部计算用的是二进制码,所以有的时候要对其进行转换。
最简单的BCD转二进制的方法是什么呢?
我们知道BCD码每4位表示一个10进制数,我们现在假设num_reg是一个16位的BCD码,也就是4位的十进制数。那么num_reg[15:12]表示这个数的最高位,他的权值是1000,这个应该可以理解吧。同样的道理,num_reg[11:8]的权为100,num_reg[7:4]的权为10,num_reg[3:0]的权为1。
所以bin = num_reg[15:12] *1000 + num_reg[11:8]*100+num_reg[7:0]*10+num_reg[3:0]。
这种方法虽然能够实现转码,但是占用的FPGA内部资源太大,我们知道fpga内部资源是很宝贵的,所以我们这里着重介绍一下另一种通过移位来达到目的的算法。
二进制码左移一位等于未左移的二进制码乘2,例如二进制码101001,转成十进制等于41,左移一位得到1010010,成了82。也就是说二进制码左移一位加上左移3位,等于二进制码乘10.
设计框图:
module bcd2bin( input wire sclk, input wire rst_n, input wire [3:0]gew, input wire [3:0]shiw, input wire [3:0]baiw, output wire [9:0]binary); reg [9:0] bwvalue1; reg [9:0] bwvalue2; reg [9:0] bwvalue3; reg [9:0] shiwvalue1; reg [9:0] shiwvalue2; reg [9:0] gewvalue; always@(posedge sclk or negedge rst_n) if(!rst_n) begin bwvalue1 <=0; bwvalue2 <=0; bwvalue3 <=0; shiwvalue1 <=0; shiwvalue2 <=0; gewvalue <=0; end else begin //100=(64+32+4)=(2^6+2^5+2^2); 10=(8+2)=(2^3+2^1); bwvalue1 <=baiw<<6; bwvalue2 <=baiw<<5; bwvalue3 <=baiw<<2; shiwvalue1<=shiw<<3; shiwvalue2<=shiw<<1; gewvalue <=gew ; end assign binary=bwvalue1+bwvalue2+bwvalue3+shiwvalue1+shiwvalue2+gewvalue;endmodule
TB文件:
`timescale 1ns/1psmodule bcd2bin_tb;reg sclk;reg rst_n;reg [3:0]gew;reg [3:0]shiw;reg [3:0]baiw;wire [9:0]binary;initial begin sclk=0; rst_n=0; baiw=4‘d0; shiw=4‘d0; gew=4‘d0; #1000 rst_n=1; #100 baiw=4‘d1; shiw=4‘d2; gew=4‘d0; #100 baiw=4‘d3; shiw=4‘d2; gew=4‘d9; #100 baiw=4‘d4; shiw=4‘d2; gew=4‘d9;end always #10 sclk =~sclk; bcd2bin U1( .sclk (sclk) , .rst_n (rst_n) , .gew (gew) , .shiw (shiw) , .baiw (baiw) , .binary (binary) );endmodule
modelsim仿真:
可以看出转换后的bin码是对的,所以达到了设计目标、
bcd转二进制
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。