質問
私は比較的VHDLが初めてです。全加算器の組み合わせを使用して符号なし乗算を実行するコードを記述しようとしています。コンパイルすると、ポートマッピングに渡されます。最初のマップのエラーを解決しましたが、他のすべてのマップで問題が発生します。
それぞれに同じエラーが表示されます:<!> quot;ポートマップアスペクトの式の実績は静的である必要があります<!> quot;
これが私のコードです。どんな助けも大歓迎です。さらに、私のコードを見ることに基づいた一般的なヒントがあれば、ありがたいです。
ありがとう、 ブズキー
library ieee;
use ieee.std_logic_1164.all;
entity fulladder is
port (a, b, c: in std_logic;
sout, cout: out std_logic);
end fulladder;
architecture behav of fulladder is
begin
sout <= (a xor b) xor c ;
cout <= (a and b) or (c and (a xor b));
end behav;
library ieee;
use ieee.std_logic_1164.all;
entity unsignedmult is
port (a,b: in std_logic_vector (3 downto 0);
pro: out std_logic_vector (7 downto 0));
end unsignedmult;
architecture synth of unsignedmult is
--Declarations
signal c1,c2,c3,c4,c5: std_logic_vector (3 downto 0);
signal s1,s2,s3,s4: std_logic_vector (2 downto 0);
component fulladder
port (a,b,c:in std_logic;
sout,cout:out std_logic);
end component;
begin
--Row 0 ----Sin-----A&B-------Cin--Sout---Cout
Fand00: fulladder port map('0',(a(0) and b(0)),'0',pro(0),c1(0));
Fand01: fulladder port map('0',(a(1) and b(0)),'0',s1(0),c1(1));
Fand02: fulladder port map('0',(a(2) and b(0)),'0',s1(1),c1(2));
Fand03: fulladder port map('0',(a(3) and b(0)),'0',s1(2),c1(3));
--Row 1
Fand10: fulladder port map(s1(0),(a(0) and b(1)),c1(0),pro(1),c2(0));
Fand11: fulladder port map(s1(1),(a(1) and b(1)),c1(1),s2(0),c2(1));
Fand12: fulladder port map(s1(2),(a(2) and b(1)),c1(2),s2(1),c2(2));
Fand13: fulladder port map('0',(a(3) and b(1)),c1(3),s2(2),c2(3));
--Row 2
Fand20: fulladder
----Sin------A&B------Cin-Sout-Cout
port map(s2(0),(a(0) and b(2)),c2(0),pro(2),c3(0));
Fand21: fulladder
----Sin--A&B------Cin-Sout-Cout
port map(s2(1),(a(1) and b(2)),c2(1),s3(0),c3(1));
Fand22: fulladder
----Sin--A&B------Cin-Sout-Cout
port map(s2(2),(a(2) and b(2)),c2(2),s3(1),c3(2));
Fand23: fulladder
----Sin--A&B------Cin-Sout-Cout
port map('0',(a(3) and b(2)),c2(3),s3(2),c3(3));
--Row 3
Fand30: fulladder
----Sin------A&B------Cin-Sout-Cout
port map(s3(0),(a(0) and b(3)),c3(0),pro(3),c4(0));
Fand31: fulladder
----Sin--A&B------Cin-Sout-Cout
port map(s3(1),(a(1) and b(3)),c3(1),s4(0),c4(1));
Fand32: fulladder
----Sin--A&B------Cin-Sout-Cout
port map(s3(2),(a(2) and b(3)),c3(2),s4(1),c4(2));
Fand33: fulladder
----Sin--A&B------Cin-Sout-Cout
port map('0',(a(3) and b(3)),c3(3),s4(2),c4(3));
--Row 4
F40: fulladder
port map(s4(0),c4(0),'0',pro(4),c5(0));
F41: fulladder
port map(s4(1),c4(1),c5(0),pro(5),c5(1));
F42: fulladder
port map(s4(2),c4(2),c5(1),pro(6),c5(2));
F43: fulladder
port map('0',c4(3),c5(2),pro(7),c5(3));
end synth;
解決
さびていますが、a(_) and b(_)
エントリには明示的なゲートが必要になる場合があります。ワイヤードORについて聞いたことがありますが、ワイヤーANDについては聞いていません(少なくとも正論理では)。
少なくとも、これらのそれぞれをa(_)
部分だけに置き換えて、エラーが解消されるかどうかを確認してください。正しい回路ではありませんが、コンパイルの問題の原因について正しいかどうかは確認できます。
他のヒント
物事を正しく覚えていれば、論理式(a(0)やb(0)など)をポートにマッピングできません(ただし、定数は問題ないと思います)。これが正しい場合、すべての入力および出力に対して明示的な信号を作成する必要があります。
また: 1)fulladderアーキテクチャは動作的ではないと思うので、別の名前を付けます。これらのアーキテクチャにrtlという名前を使用しました(正しくもしなかった)。
2)コンポーネントを宣言せずに全加算器をインスタンス化することが可能であるべきです。次のような構文を使用します
Fand00: entity fulladder port map(...)
また、通常は正式なポート名を常に指定するのが普通です(cout = <!> gt; c1(0)、矢印の方向などをいくらか予約します)
3)最近の新しいシンセサイザーは乗算を合成できること、そしてそれがどのように動作するかを学習するためにこれを行っていることを知っていると思います。
一部のシンセサイザーでは、静的な式ではないポートマップに問題があります。
シンセサイザーが苦情を言うところはどこでも、ポートマップの表現を信号に置き換える必要があるかもしれません。例:
Fand00: fulladder port map('0',(a(0) and b(0)),'0',pro(0),c1(0));
with:
signal t: std_logic;
...
t <= a(0) and b(0);
Fand00: fulladder port map('0',t,'0',pro(0),c1(0));
<=>
可能な限り、別のシンセサイザーソフトウェアに変更します。自分を拷問しないでください。