문제

저는 VHDL을 비교적 처음으로 사용합니다. 전체 추가기의 조합을 사용하여 서명되지 않은 곱셈을 수행하기 위해 코드를 작성하려고합니다. 컴파일 할 때 포트 매핑으로 전달됩니다. 첫 번째지도에서 오류를 해결했지만 다른 모든 사람들은 나에게 문제를줍니다.

각각에 대해 동일한 오류가 발생합니다. "포트 맵의 표현식 실제는 정적이어야합니다"

여기 내 코드가 있습니다. 모든 도움이 감사합니다. 또한, 내 코드를 바라 보는 일반적인 팁이 있다면 감사 할 것입니다.

감사합니다, Buzkie

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에 대해 들었지만 와이어 앤스는 아니었다 (적어도 양의 논리로).

최소한 이들 각각을 a(_) 일부는 오류가 사라지는 지 확인하십시오. 올바른 회로는 아니지만 컴파일 문제의 원인에 대해 옳은지 확인합니다.

다른 팁

내가 올바르게 기억한다면, 논리 표현식 (예 : a (0) 및 b (0))을 포트에 매핑 할 수는 없습니다 (그러나 상수가 괜찮다고 생각합니다). 이것이 올바른 경우 모든 입력 및 출력에 대한 명시 적 신호를 만들어야합니다.

또한 : 1) 풀 라더 아키텍처가 행동이라고 생각하지 않으므로 다른 이름을 지을 것입니다. 이 아키텍처의 이름 RTL을 사용했습니다 (올바른지).

2) 구성 요소를 선언하지 않고 전체 부가자를 인스턴스화 할 수 있어야합니다. 구문과 같은 구문을 사용하십시오

Fand00: entity fulladder port map(...)

또한 항상 공식 포트 이름을 지정하는 것이 일반적입니다 (Cout => C1 (0), 화살표의 방향 등에 대한 예약 등).

3) 최근에 새로운 신시사이저가 곱셈을 합성 할 수 있고 그것이 어떻게 작동하는지 배우기 위해이 일을하고 있다고 생각합니다. 그렇지 않으면 방금 말씀 드렸습니다 :)

일부 신디사이저는 정적 표현이 아닌 포트 맵에 문제가 있습니다.

합성기가 불평하는 곳마다 포트 맵의 표현식을 신호로 바꿔야 할 수도 있습니다. 예를 들어:

Fand00: fulladder port map('0',(a(0) and b(0)),'0',pro(0),c1(0));

와 함께:

signal t: std_logic;

...

t <= a(0) and b(0);

...

Fand00: fulladder port map('0',t,'0',pro(0),c1(0));

가능하다면 다른 신시사이저 소프트웨어로 변경하십시오. 자신을 고문하지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top