2

Fast Adder のコンポーネントである次の VHDL コードを作成しました。高速加算器は、以下のコードの加算器に接続された 8by8 レジスタで構成されます。inout Read_Adress の使用をなくすにはどうすればよいですか。Read_Adress を inout ではなく std_logic_vector にしたいのですが?

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

Entity Adder is
port(
        Clock_50_MHZ :in std_logic;
        En :in std_logic;
        Data_Registerfile : in std_logic_vector(7 downto 0);
        Read_Address: inout std_logic_vector(2 downto 0) := "000";
            Output : out std_logic_vector(11 downto 0)
 );
 end Adder;

 Architecture arch of Adder is
 Signal result : unsigned (11 downto 0):="000000000000";
 Signal regData: std_logic_vector(7 downto 0);

 Begin
 regData <= Data_Registerfile;
 Process(Clock_50_MHZ)
Begin
if rising_edge(Clock_50_MHZ)  then
    if (En = '1') then
        if(Read_Address = "000") then
            result <= "000000000000" + unsigned(regData);
            Read_Address <= Read_Address + 1;
        elsif(Read_Address = "111") then
            Output <= std_logic_vector( result + unsigned(regData) );
            Read_Address <= "000";
        else
            result <= result + unsigned(regData);
            Read_Address <= Read_Address + 1;
        end if;
    end if;
end if;
 End Process;
end arch;
4

2 に答える 2

4

これは、VHDL の典型的な不都合です。ポートを信号として使用することはできませんout(Verilog に慣れている場合は、そうしたいと思うことがよくあります)。

私が知っている最善の方法は、追加のダミー信号を作成することです。

signal Read_Address_tmp : std_logic_vector(2 downto 0) := "000";

それを使って計算を行います:

     Process(Clock_50_MHZ)
 Begin
 if rising_edge(Clock_50_MHZ)  then
     if (En = '1') then
         if(Read_Address_tmp = "000") then
             result <= "000000000000" + unsigned(regData);
             Read_Address_tmp <= Read_Address_tmp + 1;
         elsif(Read_Address_tmp = "111") then
             Output <= std_logic_vector( result + unsigned(regData) );
             Read_Address_tmp <= "000";
         else
             result <= result + unsigned(regData);
             Read_Address_tmp <= Read_Address_tmp + 1;
         end if;
     end if;
 end if;
  End Process;

それを出力にリンクします。

Read_Address <= Read_Address_tmp;
于 2012-10-19T02:05:37.833 に答える
0

オーウェンの答えは、歴史的に通常の方法です。

「新しい」VHDL 2008 では、アウトモード ポートの読み取りが可能になりました。ツールがサポートしていない場合は、ベンダーにバグを報告してください。「VHDL 2008 - just the new stuff」のこのページの下部を参照してください。

http://books.google.co.uk/books?id=ETxLguPMEY0C&pg=PA163&lpg=PA163#v=onepage&q&f=false

于 2012-10-19T12:13:56.950 に答える