如何在Verilog中分割两位数的数字

时间:2011-03-10 23:44:12

标签: verilog

我需要将两位数字分开,以便我可以单独显示它们。问题是mod仅适用于2的幂数。如何做到这一点?

4 个答案:

答案 0 :(得分:2)

来自http://www.edaboard.com/thread112872.html

  

许多综合工具不支持   整数除法/模数/余数   除非计算是微不足道的,   比如用两个力量除法。如果   那么,你的价值不是两个人的力量   你可能运气不好。

     

也许你可以使用另一种方法   比如建立自己的数学模块,   或使用你的数学核心   软件的IP库。

     

或许你可以近似   除以乘以   分数1 / K而不是除以K.

     

如果两个操作数都很小,你可以   从ROM查找中获取结果   表

答案 1 :(得分:2)

如果这是一个简单的递增值,您应该考虑Binary Coded Decimal个计数器。每个数字需要4位,但它可以更容易地与7段显示器连接。

//BCD counter - I did not test this
reg [3:0] digit_one, digit_two;    
always @(posedge clk)
  begin : led_digits
  if(reset)
    begin
    digit_one <= 0;
    digit_two <= 0;
    end
  else if(increment)
    begin
    //BCD values wrap at 9 
    if(digit_one == 4'd9)
      digit_one <= 0;
    else
      digit_one <= digit_one + 1;

    //Carry when previous digit wraps
    if(digit_one == 4'd9)
      begin
      if(digit_two == 4'd9)
        digit_two <= 0;
      else
        digit_two <= digit_two + 1;
      end
    end
  end

如果你需要显示一些任意十进制值,那么它会变得更复杂。 GuanoLoco的解决方案应该适用于2位数输出。存在一种更有效的算法,但implementation并不那么简单。

答案 2 :(得分:1)

一个简单的强力解决方案是使用if-else块将你的数字与10的倍数进行比较。小于你的数字的十的最大倍数是“十位”数字,差别是“ “数字。

if (number >= 90) begin
    tens <= 9;
    ones <= number - 90;
end else if ...

尽管如此,这是不可扩展的,并且巨大的if-else块通常不是好的做法。

答案 3 :(得分:-1)

相当困惑的问题。当你说“显示”时,我立即想到$display,因此建模和模拟。对于建模目的,模数没有2个限制的权限。

但即使你的意思是综合,一般情况下,模数只适用于2的幂。但是,这样做可能不是一个好主意,因为它在硬件上会非常昂贵。