2017-06-09 177 views
-1

我正在嘗試在VHDL中創建一個組件,下面是我的代碼。我不知道我哪裏錯了。我的邏輯是: •每隔一步 •將除數右移,並將其與當前的除數比較 •如果除數較大,則將0作爲商的下一位移位•如果除數較小,則減去以獲得新的除數和移位1 作爲商的下一位。在VHDL中使用組件和forloop問題

我在這裏使用' - '符號,但實際上我必須使用門,所以要麼我必須使用我的減法組件或只是在這裏創建一個減法器。

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use ieee.std_logic_arith.all; 

ENTITY divprog IS 
PORT(
    a: IN std_logic_vector(3 downto 0); 
    b: IN std_logic_vector(3 downto 0); 
    err: OUT std_logic; 
    reslow: OUT std_logic_vector(3 downto 0); 
    reshigh: OUT std_logic_vector(3 downto 0)); 
END divprog; 

architecture behaviour of divprog is 
signal ax,bx,bsub,res :std_logic_vector(7 downto 0) := (others => '0'); 
signal quo: std_logic_vector(3 downto 0) := (others => '0'); 
signal intcarry: std_logic_vector(8 downto 0):= (others => '0'); 

BEGIN 
--sub1: subtractor PORT MAP(aa,bb,x,ss); 
Process is 
variable i : POSITIVE := 1; 
BEGIN 
    ax <= "0000" & a; 
    bx <= b & "0000"; 
    if(b > "0000") then 

    while (i <=3) loop 


     bx <= '0'&bx(7 downto 1); 
     IF (ax < bx) then 
     quo <= quo(2 downto 0)& '0'; 
     --bx <= '0'&bx(7 downto 1); 
     res <=ax; 
     elsif(ax >= bx) then 
     res <= ax - bx; 
     quo <=quo(2 downto 0)& '1'; 
     end if; 
    i := i + 1; 
    ax <= res; 
    end loop; 
    reshigh <= quo; 
    reslow <= res(3 downto 0); 
    end IF; 
    wait for 100 ns; 
END PROCESS; 
end behaviour; 

可以請別人幫我這個嗎? 謝謝

+0

在代碼中,您只需執行很多操作,然後等待100ns。你如何檢查你的代碼?你的測試平臺在哪裏?要進行調試,您應該一次執行一個步驟。嘗試一個操作,看看它是否符合你的期望。然後嘗試第二次操作:再次檢查。等等...... – JHBonarius

+0

一些建議:1)告訴我們你收到了什麼錯誤信息。 2)最好使用ieee.numeric_std包(而不是std_logic_arith和std_logic_unsigned),它提供簽名和未簽名的數據類型。 3)我猜你的代碼很難合成。它是否用於合成?或者只是模擬?對於綜合來說,你可能想創建一個更流水線的設計。 – Juergen

+0

我的代碼符合,但我得到輸出爲'0'。我只是爲了模擬而實現這個代碼。當我開始運行中斷代碼時,我將值分配給ax和bx,它顯示爲零。我改變了邏輯,因爲它對我來說太複雜了,我只知道基本的VHDL。 –

回答

0

功能問題與變量i有關。它在第一個100ns後陷入了4。應在0​​和END PROCESS之間設置爲1。

+0

「也許」和「猜測」沒有回答。這更像是一條評論... – JHBonarius

+0

你是對的,謝謝。我編輯了我的答案,這是我能做的最好的,直到我獲得完整的評論意見。 – ahmedus