最近我们老师叫我们做了一个项目,最后的数据显示部分需要用驱动9个数码管。数据量过长通过取余除法分离各位在FPGA中太消耗资源(由于我用的二代芯片而且板子也是小型的,取余直接把我的资源占完了,导致编译过不了),于是我在网上看了大佬的思路,写了一份任意二进制转BCD的,供大家使用,需要修改的地方我注释了,直接套模板。
module Binary_to_BCD(clk,bin,Result_INT);
input [27:0] bin; //输入28位的数据 //改改改
input clk;
output [35:0]Result_INT; //计算下需要多少位BCD ,bin表示最大数为 2^28=268,435,456,故这里需要 9个数码管表示 9*4=36位。
//改改改
reg [35:0]Result_INT;
reg [5:0] count;
reg [63:0]shift_reg; //Result_INT和bin拼起来的位数 bin的位数+Result_INT的位数 28+36=64位
//改改改
// 计数部分
always @ ( posedge clk )
begin
if (count==29) //需要移位28次 加上一个count清零和一个count把数据送出去。
count<=0; //改改改
else
count<=count+1;
end
// 二进制转换为BCD进制
always @ (posedge clk )
begin
if (count==0)
shift_reg={10'b0000000000_0000000000_0000000000_000000,bin}; //把Result_INT和bin拼起来准备左移 //改改改
else if ( count<=28) //实现28次移位操作 , 你输入数据多少位就移位多少次 //改改改bin多少位这里就是多少
begin
if(shift_reg[31:28]>=5) shift_reg[31:28]=shift_reg[31:28]+3;
if(shift_reg[35:32]>=5) shift_reg[35:32]=shift_reg[35:32]+3;
if(shift_reg[39:36]>=5) shift_reg[39:36]=shift_reg[39:36]+3;
if(shift_reg[43:40]>=5) shift_reg[43:40]=shift_reg[43:40]+3;
if(shift_reg[47:44]>=5) shift_reg[47:44]=shift_reg[47:44]+3; // 这一部分是保证移位后不会出现大于10的数
if(shift_reg[51:48]>=5) shift_reg[51:48]=shift_reg[51:48]+3; // Result_INT的对应位每四个写一条if语句。我有9个数码管故对应9条//改改改
if(shift_reg[55:52]>=5) shift_reg[55:52]=shift_reg[55:52]+3; //例如我的Result_INT 的第一组是 28~31位也就是 第一个数码管的BCD码
if(shift_reg[59:56]>=5) shift_reg[59:56]=shift_reg[59:56]+3;
if(shift_reg[63:60]>=5) shift_reg[63:60]=shift_reg[63:60]+3;
shift_reg=shift_reg<<1;
end
end
//输出赋值
always @ ( posedge clk)
begin
if (count==29) //此时28次移位全部完成, 第29个count输出数据//改改
Result_INT<=shift_reg[63:28];
end
endmodule