在verilog中分割出一个四位数的数字

时间:2014-04-05 15:29:52

标签: verilog

对于我的应用程序,我可以使用0到9999之间的数字,我需要将它放在4个7段显示器上。

我遇到的主要问题是将数字分成4位数,我想到了几种方法:

  1. 每个号码都有多个if语句(非常长的啰嗦而不是最佳选择)
  2. 使用if语句来确定10个,100个等的数量(不长的啰嗦但很多代码)
  3. 有更好的方法吗? (我很确定有)

1 个答案:

答案 0 :(得分:0)

理想情况下,您可以将数字除以10,100和1000(取结果和余数),这将告诉您您的数字中有多少,数十,数百和数千。

然而,由于除法/模数在verilog中是一项昂贵的操作,因此您可能希望尝试一种在区域/逻辑上更有效但在时间上效率较低的方法。

一个想法是只计算一次一个循环,每个列中有多少个数字位于一些单独的计数器中:

一些未经测试的伪代码:

input [13:0] mynumber;
input        start;
output       done;

reg   [13:0] counter;
reg   [3:0]  ones;
reg   [3:0]  tens;
reg   [3:0]  hundreds;
reg   [3:0]  thousands;
reg          done;

always @ posedge clk begin
    if(start) 
        counter <= 0;
    else if(counter == mynumber)
        done <= 1;
    else begin
        counter <= counter + 1;
        ones <= ones == 9 ? 0 : ones + 1;
        if(ones == 9) begin
            tens <= tens == 9 ? 0 : tens + 1;
            if(tens == 9) begin
                hundreds <= hundreds == 9 ? 0 : hundreds + 1;
                if(hundreds == 9) begin
                     thousands <= thousands + 1; 
                end
            end
        end
    end
end