任意二进制转BCD代码模板(左移加三算法)

最近我们老师叫我们做了一个项目,最后的数据显示部分需要用驱动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

你可能感兴趣的:(任意二进制转BCD代码模板(左移加三算法))