您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 利用verilog将二进制码转换为十进制BCD码
利用verilog将二进制码转换为十进制BCD码下面我自己加了注释小序:先说一个bear的亲身体会,bear在做一些fpga小设计时经常会用到数据显示功能,比如数字时钟,数字频率计,温度计,跑表等等,往往我们会选用led数码管来做显示,因为它驱动起来比lcd液晶要简单的很多,我们知道fpga中寄存器在定义和储存的数据都是采用二进制的格式,而fpga输出给数码管做显示的数据必须是十进制的格式,之前bear经常会选择把一个寄存器的个位和十位分开定义,比如在做数字时钟时,就会把时,分,秒的各位和十位都分别定义成一个变量,无疑这种方法会增加代码的复杂度,所以考虑需要一个专门把二进制的数据转换成十进制BCD码的模块,在网上有一些,但是好像都不太完整,所以bear花了一下午写了一个,亲测效果不错,希望对朋友们有所帮助下面开始正文。首先给出二进制码转换为十进制BCD码的几个步骤(以8bit二进制码为例):1.将二进制码左移一位(或者乘2)2.找到左移后的码所对应的个,十,百位。3.判断在个位,十位和百位的码是否大于(?等于)5,如果是则该段码加3。4.继续重复以上三步直到移位8次后停止。下面是一个例子,将1111_1111转换为BCD码,如果8bit数据最终移位得到18bit数据,那么个位,十位,百位分别对应12~9,16~13,18~17位。之前写的代码在转换完之后没有对count清零,所以在仿真时候需要用rst_n清零,感谢博友onlytime417的提示,经过修改之后可以对不同的输入值连续转换,而不需要rst_n的复位,下面是修改后的代码以及仿真结果,(该转换模块已经在实际项目中应用)。CODE:modulebin_dec(clk,bin,rst_n,one,ten,hun,count,shift_reg);input[7:0]bin;inputclk,rst_n;output[3:0]one,ten;output[3:0]count;output[1:0]hun;output[17:0]shift_reg;reg[3:0]one,ten;reg[1:0]hun;reg[3:0]count;reg[17:0]shift_reg=18'b000000000000000000;//全部位数,包括hun,ten,one,bin//////////////////////计数部分////////////////////////always@(posedgeclkornegedgerst_n)beginif(!rst_n)count=0;elseif(count==9)count=0;elsecount=count+1;end//////////////////////二进制转换为十进制///////////////////判断四种情况,1:个位和十位都大于52:只有一个大于53:都不大于5always@(posedgeclkornegedgerst_n)beginif(!rst_n)shift_reg=0;elseif(count==0)shift_reg={10'b0000000000,bin};elseif(count=8)//实现8次移位操作beginif(shift_reg[11:8]=5)//判断个位是否5,如果是则+3beginif(shift_reg[15:12]=5)//判断十位是否5,如果是则+3beginshift_reg[15:12]=shift_reg[15:12]+2'b11;shift_reg[11:8]=shift_reg[11:8]+2'b11;shift_reg=shift_reg1;//对个位和十位操作结束后,整体左移endelsebeginshift_reg[15:12]=shift_reg[15:12];shift_reg[11:8]=shift_reg[11:8]+2'b11;//个位加3shift_reg=shift_reg1;endendelsebeginif(shift_reg[15:12]=5)//十位=5beginshift_reg[15:12]=shift_reg[15:12]+2'b11;shift_reg[11:8]=shift_reg[11:8];shift_reg=shift_reg1;endelsebeginshift_reg[15:12]=shift_reg[15:12];shift_reg[11:8]=shift_reg[11:8];shift_reg=shift_reg1;endendendend/////////////////输出赋值//////////////////////////always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginone=0;ten=0;hun=0;endelseif(count==9)//此时8次移位全部完成,将对应的值分别赋给个,十,百位beginone=shift_reg[11:8];ten=shift_reg[15:12];hun=shift_reg[17:16];endendendmodule
本文标题:利用verilog将二进制码转换为十进制BCD码
链接地址:https://www.777doc.com/doc-2608876 .html