0
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Lab3_Adder1 is
    Port ( cin : in  STD_LOGIC;
           a : in  STD_LOGIC_VECTOR (3 downto 0);
           b : in  STD_LOGIC_VECTOR (3 downto 0);
           s : out  STD_LOGIC_VECTOR (3 downto 0);
           cout : out  STD_LOGIC);
end Lab3_Adder1;

architecture Behavioral of Lab3_Adder1 is

    SIGNAL c : STD_LOGIC_VECTOR (4 DOWNTO 0);

begin
    c(0) <= cin;
    s <= a XOR b XOR c (3 DOWNTO 0);
    c (4 DOWNTO 1) <= (a AND b) OR (a AND c(3 DOWNTO 0)) OR (b AND c(3 DOWNTO 0));
    cout <= c(4);
end Behavioral;

こんにちは、このフォーラムを使用するのは初めてです。VHDLでウォレス木乗算を行っています。上記のコードは全加算器のコードです。メインコードで関数/コンポーネントを呼び出す方法を知りたいですか? (Cプログラミングのように)。メインコードでこの全加算器を呼び出します。(間違いがあれば私の英語で申し訳ありません、私はフランス語です)

4

2 に答える 2

5

VHDL の関数は、C の場合と同じように呼び出して、定数、シグナル、または変数を初期化するか、プロセス内の順次ステートメントとして呼び出します。しかし、それは今重要なことではありません。

しかし、あなたはコンポーネントを呼び出しません! これは、C++ でオブジェクトを呼び出すようなものです。まったく意味がありません。

VHDL では、コンポーネントまたは (より簡単に!) エンティティのみをインスタンス化し、信号を使用してそれらのポートを相互接続できます。これは (非常に大雑把に言えば) オブジェクト指向言語でオブジェクトを宣言してメッセージを送信することに似ています。これは「構造 VHDL」と呼ばれ、多くの場合、VHDL デザインの最上位に表示され、CPU、メモリ インターフェイス、FFT プロセッサなどのコンポーネントを作成および相互接続します。

あなたのエンティティを考える

entity Lab3_Adder1 is
    Port ( cin : in  STD_LOGIC;
           a : in  STD_LOGIC_VECTOR (3 downto 0);
           b : in  STD_LOGIC_VECTOR (3 downto 0);
           s : out  STD_LOGIC_VECTOR (3 downto 0);
           cout : out  STD_LOGIC);
end Lab3_Adder1;

たとえば、次のように 8 ビットの加算器を作成できます。

entity Adder_8bit is
    Port ( cin : in  STD_LOGIC;
           a : in  STD_LOGIC_VECTOR (7 downto 0);
           b : in  STD_LOGIC_VECTOR (7 downto 0);
           s : out  STD_LOGIC_VECTOR (7 downto 0);
           cout : out  STD_LOGIC);
end Adder_8bit;

architecture Structural of Adder_8bit is

signal carry_int : std_logic;   -- between lower and upper halves

begin
-- We need to create and connect up two adders

LSB_adder : entity work.Lab3_Adder1
    Port Map( 
           cin => cin,
           a  => a(3 downto 0),
           b  => b(3 downto 0),
           s  => s(3 downto 0),
           cout => carry_int
    );
MSB_adder : entity work.Lab3_Adder1
    Port Map( 
           cin => carry_int,
           a  => a(7 downto 4),
           b  => b(7 downto 4),
           s  => s(7 downto 4),
           cout => cout
    );

end Structural;
于 2013-03-06T15:45:58.163 に答える
0

組み合わせ回路を置き換え、C 関数と同様にメイン VHDL コード内の任意の場所で呼び出すことができる VHDL 関数を定義できます。

関数定義が入るパッケージを最初に定義する必要があります。

======= myAdders.vhdl ==============

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

package myAdders is

function Lab3_Adder1( cin : in  STD_LOGIC;
a : in  STD_LOGIC_VECTOR (3 downto 0);
b : in  STD_LOGIC_VECTOR (3 downto 0);
s : out  STD_LOGIC_VECTOR (3 downto 0)) return std_logic;
end Lab3_Adder1;

end myAdders;

package body myAdders is


function Lab3_Adder1 ( cin : in  STD_LOGIC;
a : in  STD_LOGIC_VECTOR (3 downto 0);
b : in  STD_LOGIC_VECTOR (3 downto 0);
s : out  STD_LOGIC_VECTOR (3 downto 0)) return std_logic is
variable c: std_logic_vector(4 downto 0);
begin

c(0) := cin;
s := a XOR b XOR c (3 DOWNTO 0);
c (4 DOWNTO 1) := (a AND b) OR (a AND c(3 DOWNTO 0)) OR (b AND c(3 DOWNTO 0));
return c(4);
end Lab3_Adder1;


end myAdders;

======= topLevel.vhdl ==============

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use work.myAddres.all;


entity TopLevel is
    Port ( 
           cin : in  STD_LOGIC;
           a : in  STD_LOGIC_VECTOR (3 downto 0);
           b : in  STD_LOGIC_VECTOR (3 downto 0);
           c : out  STD_LOGIC_VECTOR (3 downto 0)
           );
end TopLevel;

architecture Structural of TopLevel is

signal carry : std_logic;  

begin

carry <= Lab3_Adder1(cin, a, b, c);

... and so on ...

end Structural;
于 2015-11-19T17:13:13.087 に答える