verilog实现任意位二进制转换BCD.docx
- 文档编号:14704138
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:8
- 大小:101.61KB
verilog实现任意位二进制转换BCD.docx
《verilog实现任意位二进制转换BCD.docx》由会员分享,可在线阅读,更多相关《verilog实现任意位二进制转换BCD.docx(8页珍藏版)》请在冰点文库上搜索。
verilog实现任意位二进制转换BCD
verilog实现任意位二进制转换BCD
一直感觉这是个很简单的问题,直到突然自己连BCD都不太清楚的时候,才发现这没有看起来那么简单,这里介绍里任意位二进制转为BCD的verilog代码,这个转换方法也可以用在C上面,此为原创,转载请注明,谢谢。
基础知识:
BCD:
BCD码又称为8421码,
意义:
之所以有时候需要将binary转换为BCD,一般是用在本科的实验中,为了将binary显示在数码管中,当然还有很多应用,只是目前我还没有用到。
转换算法:
左移加3法
移位加3法的具体原理,在网上感觉也没有人能够说的清楚,以后找到书籍再说吧。
下面解释下左移加三算法。
这里以8bit二进制数FF做例子。
该算法的操作为上图。
下面对上图的操作进行详细的解释:
由于8bit的二进制最大为FF,转换为十进制为255。
所以需要使用三个BCD码来表示所有的8bit二进制数。
上图的hundreds表示百位的BCD,tens表示十位的BCD,Units表示个位的BCD。
算法的操作为一直将binary数据左移,移出的数据按顺序存在hundreds,tens,Units。
例如上面的shift1,shift2,shift3操作后,Units变为了0111,至于为何在shift3后进行add3操作,是因为在算法中每一次左移,都要对hundreds,tens和Units进行判断,如果hundreds,tens和Units里面的值大于或等于5,就将hundreds,tens和Units自加3.所以shift3后,Units里面为0111,表示为7,此时不能左移,而是对Units加三操作,所以Units的值从0111变为了1010.值得注意的是,只要hundreds,tens和Units中任意一个的值大于或等于5(0101),就要先进行一次自加三的操作,然后才能继续左移,后面的操作同上。
注意2:
n位的binary就需要进行n次左移
注意3:
最后一次左移不需要进行add3操作
注意4
:
亲自推导16位的,和24位的binary转换,结果正确,所以该算法适用于任意位binary
toBCD,当然这种论断没有足够的理论依据。
verilog代码:
说明:
对于8bit及以下的binary,可以使用case语句实现移位加三算法。
由于这里说明的是任意位的二进制数,转为BCD,所以我的代码中设计了一个状态机,来控制移位,加三和结束操作。
由于代码编写时间仓促,其中或许有些bug。
//name:
二进制转BCD
//data:
2014-04-17atkb129
//info:
as2**8=255changetoBCDthenthisneed
3timesof“8421”moduleb_to_bcd(
clk,
rst_n,
binary,
state_en,
BCD
);
parameter
b_length
=8;
parameter
bcd_len
=12;
parameter
idle
=5'b00001;
parameter
shift
=5'b00010;
parameter
wait_judge=5'b00100;
parameter
judge
=5'b01000;
parameter
add_3
=5'b10000;
input
clk;
input
rst_n;
input
[b_length-1:
0]
binary;
inputstate_en;
outputreg[bcd_len-1:
0]
BCD;
reg
[b_length-1:
0]
reg_binary;
reg[3:
0]
bcd_b,bcd_t,
bcd_h;
reg[3:
0]
shift_time;
reg[5:
0]
c_state,
n_state;
regadd3_en;
regchange_done;
//thisisathreesectionkindofstatecode
stylealways@(posedgeclkornegedgerst_n)
begin
if(!
rst_n)
c_state
else
c_state
if(!
rst_n)
c_state
else
case(n_state)
idle:
begin
if((binary!
=0)&&(state_en==1'b1)&&(change_done==0'b0))
n_state
else
n_state
end
shift:
n_statewait_judge:
begin
if(change_done==1'b1)
n_state
else
n_state
end
judge:
begin
if(add3_en)
n_state
else
n_stateend
add_3:
begin
n_state
end
default:
n_state
endcase
end
//thethirdsectionalways@(posedgeclkornegedgerst_n)
begin
if(!
rst_n)
begin
shift_time
change_done
add3_en
end
else
case(n_state)
idle:
begin
shift_time
reg_binarybcd_h
bcd_t
bcd_b
end
shift:
begin
{bcd_h,bcd_t,bcd_b,reg_binary}
shift_time
if(shift_time==1)
change_done
else
change_done
end
wait_judge:
begin
if((bcd_h>;=4'd5)||(bcd_t>;=4'd5)||(bcd_b>;=4'd5))
add3_en
else
add3_en
if(change_done==1)
BCD
end
judge:
add3_en
add_3:
begin
if(bcd_h>;=4'd5)bcd_h
if(bcd_t>;=4'd5)bcd_t
if(bcd_b>;=4'd5)bcd_b
end
default:
begin
change_done
add3_en
end
endcase
end
endmodule
代码的仿真:
这里对上面的代码进行了仿真,仿真结果显示上面代码可以实现8bitbinary的BCD转换。
testbench:
module
filter_tb;
regclk;
regrst_n;
regstate_en;
reg[7:
0]binary;
wire[11:
0]BCD;
initial
begin
clk=0;
rst_n=0;
state_en=0;
#100binary=8'h3f;
#150rst_n=1;
#200
state_en=1;
end
always#10clk=~clk;
b_to_bcdu_b_to_bcd
(
.clk(clk),
.rst_n(rst_n),
.binary(binary),
.state_en(state_en),
.BCD(BCD)
);
endmodule
仿真结果:
二进制的3f=十进制的63
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verilog 实现 任意 二进制 转换 BCD