? 發問時間: 電腦與網際網路程式設計 · 1 0 年前

VHDL高手近來幫幫忙吧@@

LIBRARY ieee;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ss1 is

Port(

CLK: in STD_LOGIC;

RESET: in STD_LOGIC;

CE,LOAD,DIR: in STD_LOGIC;

DIN: in STD_LOGIC_VECTOR(3 downto 0);

count: inout STD_LOGIC_VECTOR(3 downto 0)

);

end ss1;

architecture Behavioral of ss1 is

begin

process (CLK,RESET)

begin

if RESET='1' then

count<="0000";

elsif CLK='1' and CLK'event then

if LOAD='1' then

count<= DIN;

else

if CE='1' then

if DIR='1' then

count<= count+1;

else

count<=count-1;

end if;

end if;

end if;

end if;

end process;

end Behavioral;

他設定count: inout STD_LOGIC_VECTOR(3 downto 0)

的INOUT是甚麼意思呢~我在模擬波形圖的時候~會有兩組COUNT出現ㄟ@@

我改成OUT程式又會出錯~能麻煩高手幫忙解答嗎@@?

已更新項目:

那要如何改成OUT就好呢~我改成OUT程式會出現錯誤@@

麻煩一下哩>"<

2 個解答

評分
  • ?
    Lv 6
    1 0 年前
    最佳解答

    因為COUNT這一根信號,出現過在 <= 符號的右邊,而 COUNT 也在 Entity 中出現過,所以編譯器會以為這是具有 IN 的屬性;而且 COUNT 出現過在 <= 符號的左邊,而 COUNT 也在 Entity 中出現過,所以編譯器會以為這是具有 OUT 的屬性;所以你寫 INOUT 的屬性編譯器可以譯器成功。但是這結果,會看起來比較奇怪,COUNT 我們會是期望它是 OUT 啊!

    就 counter 的工作特性而言,它本來就是把結果抓回來加一或減一,再放回到 Register內,週而復始。又, counter 內部信號到輸出腳之間,其實還有一層 Buffer,只是 VHDL 合成器或是 Place & Route 軟體,幫你自動做掉了!

    所以我建議的作法是,如果是一個信號同時出現在 <= 符號的左右邊而且也出現在 Entity 中,應該先取一個內部的信號名稱,全部的內部運算,都用此內部的信號名稱,一直到要輸出時,再把此內部信號倒引到 entity 的 port 針腳上。

    以下是依上述的說法改寫過的,新增了一個信號叫 CNTX,那我門的加減載入就在此 CNTX信號上完成,在倒數第二行的地方再利用 COUNT<=CNTX; 把結果倒引到輸出 Port 去。

    就這樣子了,請參考!

    library ieee;

    use ieee.std_logic_1164.all;

    use ieee.std_logic_unsigned.all;

    entity ss1 is

    Port(

    CLK : in STD_LOGIC;

    RESET : in STD_LOGIC;

    CE : in STD_LOGIC;

    LOAD : in STD_LOGIC;

    DIR : in STD_LOGIC;

    DIN : in STD_LOGIC_VECTOR(3 downto 0);

    COUNT : out STD_LOGIC_VECTOR(3 downto 0)

    );

    end entity ss1;

    architecture ss1_arch of ss1 is

    signal CNTX : STD_LOGIC_VECTOR(3 downto 0);

    begin

    p_cntx : process (CLK,RESET)

    begin

    if (RESET='1') then

    CNTX<=(others=>'0');

    elsif rising_edge(CLK) then

    if (LOAD='1') then

    CNTX <= DIN;

    else

    if (CE='1') then

    if (DIR='1') then

    CNTX<= CNTX + '1';

    else

    CNTX <=CNTX - '1';

    end if;

    end if;

    end if;

    end if;

    end process p_cntx;

    COUNT <= CNTX;

    end architecture ss1_arch;

    2007-05-19 22:42:57 補充:

    註:如果把知識+的表列直接拷貝到 Text Editor 內,空白、加號等必需先整理過一次,否則可能會有錯誤!

  • 你把它設為 count: inout STD_LOGIC_VECTOR(3 downto 0)

    所以模擬撥型圖會出現一個 count 與 count_result 的

    則各代表ㄉ意義為 count (為要輸入的波形) count_result (為經程式跑出來的輸出波形)

    參考資料: 自己
還有問題?馬上發問,尋求解答。