verilog实现任意位二进制转换BCD

上传人:大米 文档编号:493901022 上传时间:2023-08-19 格式:DOCX 页数:12 大小:57.64KB
返回 下载 相关 举报
verilog实现任意位二进制转换BCD_第1页
第1页 / 共12页
verilog实现任意位二进制转换BCD_第2页
第2页 / 共12页
verilog实现任意位二进制转换BCD_第3页
第3页 / 共12页
verilog实现任意位二进制转换BCD_第4页
第4页 / 共12页
verilog实现任意位二进制转换BCD_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《verilog实现任意位二进制转换BCD》由会员分享,可在线阅读,更多相关《verilog实现任意位二进制转换BCD(12页珍藏版)》请在金锄头文库上搜索。

1、verilog 实现任意位二进制转换 BCD一直感觉这是个很简单的问题,直到突然自己连 BCD 都 不太清楚的时候,才发现这没有看起来那么简单,这里 介绍里任意位二进制转为BCD的verilog代码,这个转换 方法也可以用在 C 上面,此为原创,转载请注明,谢谢 基础知识:BCD:BCD 码又称为 8421 码,意义:之所以有时候需要将binary转换为BCD, 般是 用在本科的实验中,为了将 binary 显示在数码管中,当 然还有很多应用,只是目前我还没有用到。转换算法:左移加 3法移位加 3 法的具体原理,在网上感觉也没有人能够说的 清楚,以后找到书籍再说吧。下面解释下左移加三算法。 这

2、里以8bit二进制数FF做例子。Oj)crayonHundredsLensUnitsBinaryHEXFFStart11111111Shift 1111111 1 1Shift 21 111111 1Shifts11111111Add 31 Q 1 011111Shift 415 10 11111Add 31LOGO1111Shifts1 10 0 0 1111Shift 61100 0 111 1Add 310 0 11 Q 1 11 1Shift 了10 0 100 1111Add310 0 1010 1015hift81 QQ 1 0 1a 1 Q 1BCDz53该算法的操作为上图。下面

3、对上图的操作进行详细的解释:由于8bit的二进制最大为FF,转换为十进制为255。所 以需要使用三个 BCD 码来表示所有的 8bit 二进制数。上 图的 hundreds 表示百位的 BCD, tens 表示十位的 BCD, Uni ts表示个位的BCD。算法的操作为一直将binary数据 左移,移出的数据按顺序存在 hundreds, tens, Units 例如上面的 shift1, shift2, shift3 操作后, Units 变 为了 0111,至于为何在 shift3 后进行 add3 操作,是因 为在算法中每一次左移,都要对 hundreds, tens 和 Units 进

4、行判断,如果 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: 亲自推导 1

5、6 位的,和 24 位的 binary 转换,结果正确 所以该算法适用于任意位 binarytoBCD,当然这种论断没有足够的理论依据。verilog 代码:说明:对于8bit及以下的binary,可以使用case 语句实现移位加三算法。由于这里说明的是任意位的二 进制数,转为 BCD ,所以我的代码中设计了一个状态机, 来控制移位,加三和结束操作。由于代码编写时间仓促, 其中或许有些 bug。/name:二进制转 BCD/data: 2014-04-17 at kb129/info: as 2*8=255 change to BCD then this need3 times of “842

6、1”module b_to_bcd( clk, rst_n, binary, state_en,BCD);parameter b_length= 8; parameter bcd_len= 12; parameteridle= 5b00001;parametershift= 5b00010;parameterwait_judge = 5b00100; parameterjudge= 5b01000;parameteradd_3= 5b10000;inputclk;inputrst_n;input b_length-1:0 binary;inputstate_en;output regbcd_l

7、en-1:0 BCD;reg b_length-1:0 reg_binary;reg 3:0bcd_b, bcd_t, bcd_h;reg 3:0shift_time;reg 5:0c_state,n_state;regadd3_en; regchange_done;/this is a three section kind of state code stylealways(posedge clk or negedge rst_n) beginif(!rst_n)c_stateelsec_stateif(!rst_n)c_stateelsecase(n_state)idle:beginif(

8、binary!=0)&(state_en=1b1)&(change_done=0 b0)n_stateelsen_stateendshift: n_state wait_judge:beginif(change_done=1b1) n_stateelsen_stateendjudge:begin if(add3_en) n_stateelsen_state end add_3:begin n_stateenddefault: n_stateendcaseend/the third sectionalways(posedge clk or negedge rst_n)beginif(!rst_n

9、)beginshift_timechange_doneadd3_enendelsecase(n_state) idle:beginshift_timereg_binary bcd_hbcd_tbcd_bendshift:beginbcd_h,bcd_t,bcd_b,reg_binaryshift_timeif(shift_time=1)change_doneelsechange_doneendwait_judge:beginif(bcd_h;=4d5)|(bcd_t;=4d5)|(bcd_b;=4d5) add3_enelse add3_en if(change_done=1) BCDend

10、judge: add3_enadd_3: beginif(bcd_h;=4d5) bcd_h if(bcd_t;=4d5) bcd_t if(bcd_b;=4d5) bcd_b end default: beginchange_doneadd3_enend endcaseendendmodule代码的仿真:这里对上面的代码进行了仿真,仿真结 果显示上面代码可以实现 8bitbinary 的 BCD 转换。testbench :modulefilter_tb;reg clk;reg rst_n;reg state_en;reg 7:0 binary;wire 11:0BCD;initialbeg

11、inclk=0;rst_n=0;state_en = 0;#100 binary = 8h3f;#150 rst_n=1;#200state_en =1;endalways #10 clk=clk; b_to_bcd u_b_to_bcd (.clk(clk),.rst_n(rst_n),.binary(binary), .state_en(state_en), .BCD(BCD);endmodule仿真结果:二进制的3f=十进制的63i 3 eblots2a-MDLjtiQ EliOLDU IjoioEXrti门 pOmrET5TirnnmnnnmnnrmTpmrmji也 Jmmty bcd_b bod_t b 匚d.h shi禅诳 匚.state JilfltE addJrri dr*ngOftllllll oooo CffilO MMKKOCGCOO-1 KMQ01

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号