2011-03-10 86 views
1

我需要拆分兩位數字以便我可以分別顯示它們。問題是mod只能使用2的冪數。如何做到這一點?如何在Verilog中拆分兩位數號碼

+0

我認爲你的意思是一個兩位數*十進制*數字? – 2011-03-10 23:45:31

+0

「分裂」和「兩位數」是什麼意思?就像把數字'42'變成'4'和'2'? – 2011-03-10 23:47:12

+0

是的,就像那樣。 – 2011-03-10 23:54:33

回答

1

一個簡單的蠻力解決方案是使用if-else塊來比較你的數字和10的倍數。小於你的數字的十的最大倍數是「十」數字,不同之處在於「一個」數字。

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

這就是說,這是不可擴展的,巨大的if-else塊通常不是好的做法。

2

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

許多合成工具不通過二的冪支持 整數除法/模量/餘 除非計算是微不足道的, 如分裂。如果 你的價值不是2的冪,那麼 你可能倒黴。

也許你可以使用另一種方法 如建立自己的數學模塊, 或使用數學核心從 軟件的IP庫。

或者你可以通過在 分數1/K相乘,而不是由K.

如果兩個操作數都是小分逼近 師,你可以取 從ROM查找 表的結果。

-1

相當混淆的問題。當你說「顯示」時,我立即想到$display,因此建模和仿真。對於建模而言,不存在對模2的限制的權力。

但即使你的意思是合成,一般情況下模數只能在2的冪運算時纔是真的。但是,這樣做可能不是一個好主意,因爲它在硬件上會相當昂貴。

+0

我不想使用$ display。我需要點亮一些7段LED來顯示二進制數的十進制值。我有一個模塊可以在一個LED上顯示一個十進制數字。我試圖用這個模塊顯示一個兩位數的數字,所以我需要將二進制數分成兩個十進制數。 – 2011-03-11 16:33:43

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並不那麼簡單。