VHDL - Signal xx ikke kan syntetiseres, dårlig synkron desc

T

Tarek -

Guest
Jeg har skrevet en 4-bit ALU med CCR i VHDL, men når jeg prøver at få den sammenfattende rapport i Xilinx ISE 9.2i, jeg får denne fejl:

linje 39: Signal C ikke kan syntetiseres, dårlig synkrone beskrivelse.

Linje 39 er: "-proces (s, CLK) er"

Kode:

library IEEE;

brug IEEE.STD_LOGIC_1164.ALL;

brug IEEE.STD_LOGIC_ARITH.ALL;

brug IEEE.STD_LOGIC_UNSIGNED.ALL;enhed ALU4bit er

Port (x: i std_logic_vector (3 downto 0);

y: i std_logic_vector (3 downto 0);

s: i std_logic_vector (3 downto 0);

CLK: i STD_LOGIC;

V, N, Z, C: out STD_LOGIC;

f: out std_logic_vector (3 downto 0));

- SEV_SEG: out std_logic_vector (7 downto 1));

ende ALU4bit;architecture Behavioral af ALU4bit erbegyndPROCESS (s, CLK) IS

VARIABLE temp, at: std_logic_vector (4 downto 0); - ekstra bit er for Retten i aritmetiske operationer

VARIABLE A: std_logic_vector (3 downto 0): = x;

VARIABLE B: std_logic_vector (3 downto 0): = y;

VARIABLE k, sub: STD_LOGIC: = '0 ';

BEGIN- Initialisere variabler og udgange

C <= '0 ';

V <= '0 ';

N <= '0 ';

Z <= '0 ';

sub: = '0 ';

bære (4 downto 0): = "XXXXX";HVIS (CLK = '1 'AND CLK'event) THENCASE S- Aritmetiske operationer: s (3) = 0Når "0000" =>

temp: = ('0 '& A) - overførsel x til temp

Når "0.001" =>

temp: = ('0 '& A) 1 - tilvækst x senest 1.

Når "0.010" =>

temp: = ('0 '& A) B - tilføj y til x

Når "0.011" =>

temp: = ('0 '& A) B 1 - tilføj y og Cin til x

Når "0.100" =>

B: = IKKE B;

temp: = ('0 '& A) B - subtrahere y fra x (en besætningsmedlemmer subtraktion)

sub: = '1 ';

Når "0.101" =>

B: = IKKE B;

temp: = ('0 '& A) B 1 - trække y fra x og tilvækst (to besætningsmedlemmer subtraktion)

sub: = '1 ';

Når "0.110" =>

temp: = ('0 '& A) - 1 - dekrementeringen x

sub: = '1 ';

Når "0.111" =>

temp: = ('0 '& B) - overførsel y til temp- Logiske operationer: s (3) = 1Når "1000" =>

temp: = IKKE ('0 '& B) - flydende y

NÅR "1001" =>

temp: = ('0 '& (A NAND B)) - logisk nog af x og y

Når "1010" =>

temp: = ('0 '& (A eller B)) - logisk eller af x og y

Når "1011" =>

temp: = ('0 '& (A XNOR B)) - logisk xnor af x og y

Når "1100" =>

temp: = ('0 '& (A XOR B)) - logisk xor af x og y

Når "1101" =>

temp: = ('0 '& (A eller B)) - logisk eller af x og y

Når "1110" =>

temp: = ('0 '& (A og B)) - logisk og af x og y

Når andre =>

temp: = IKKE ('0 '& A) - invertsukker x

END CASE;- Output overdragelseHvis S (3) = '0 'THEN - kun overveje CCR i aritmetiske mode- Bestemme negativ smule, N

IF temp (3) = '1 'THEN

N <= '1 ';

END IF;- Afgøre overflow smule, V

bære (0): = '0 ';

for k i 1 til 4 loop

bære (k): = (A (k-1) og B (k-1)) ELLER (bære (k-1) og (a (k-1) XOR B (k-1)));

END LOOP;IF (bære (4) XOR bære (3)) = '1 'THEN

V <= '1 ';

END IF;- Afgøre nul bit, Z

IF temp (3 downto 0) = "0000" THEN

Z <= '1 ';

END IF;- Afgøre bære smule, C

IF ((sub = '1 'AND y> x) eller (sub = '0' AND temp (4) = '1 ')) THEN

C <= '1 ';

END IF;END IF;- Afgøre output, ff <= temp (3 downto 0);ELSE - Når CLK er lav, giver skrald output

f <= "xxxx";

C <= 'X';

V <= 'X';

N <= 'X';

Z <= 'X';

END IF;END PROCESS;

END Behavioral;
 
Hej,
Jeg tror, 'else' del for, hvis (clk'event og clk = '1 ') skaber et problem, ellers til' begivenhed er ikke synthesizable.Ændre koden i overensstemmelse hermed.

 
PROCESS (s, CLK) IS

Dette er en synkron discription af en ALU.Hvad har du, hvis du bruger:

PROCESSEN (CLK) ISLagt efter 15 sekunder:pROCESS (s, CLK) IS

Dette er en asynkron discription af en ALU.Hvad har du, hvis du bruger:

PROCESSEN (CLK) IS

 
Jeg stadig få det problem, når jeg fjerner ELSE erklæring.Hvis jeg skifter til proces (CLK) fejlen er der stadig ...

meget mærkeligt.Jeg flyttede koden under ELSE til toppen, hvor input / output initialiseringen er og gør ikke arbejde, men når jeg udkommentere denne kode jeg selv kan fremstille.nogen idé om, hvorfor?

Kode:

f <= "xxxx";

C <= 'X';

V <= 'X';

N <= 'X';

Z <= 'X';

 
Du er ved at C, (og dine andre signaler) til 1, hvis en copndition opstår, men du er ikke resseting dem.

I hvert hvis erklæring, indeholde og ellers erklæring for at indstille smule til 0, hvis betingelsen ikke er opfyldt.

Der kan løse dit problem (og bør gøres alligevel).

 
De signaler, er alle initialiseres til 0 efter begynde i processen erklæring.det er ikke nok?bør ELSE erklæring i "output assignment afsnittet så?Jeg bruger Xilinx ISE 9.2i, installation qu (at) rtus 7,2 lige nu også.

Kode:Hvis S (3) = '0 'THEN - kun overveje CCR i aritmetiske mode- Bestemme negativ smule, N

IF temp (3) = '1 'THEN

N <= '1 ';

ELSE

N <= '0 ';

END IF;- Afgøre overflow smule, V

- Beregne bære på hvert trin i regnefunktionen

bære (0): = '0 ';

for k i 1 til 4 loop

bære (k): = (A (k-1) og B (k-1)) ELLER (bære (k-1) og (a (k-1) XOR B (k-1)));

END LOOP;IF (bære (4) XOR bære (3)) = '1 'THEN

V <= '1 ';

ELSE

V <= '0 ';

END IF;- Afgøre nul bit, Z

IF temp (3 downto 0) = "0000" THEN

Z <= '1 ';

ELSE

Z <= '0 ';

END IF;- Afgøre bære smule, C

IF ((sub = '1 'AND y> x) eller (sub = '0' AND temp (4) = '1 ')) THEN

C <= '1 ';

ELSE

C <= '0 ';

END IF;END IF;

 
Ingen skal du nulstille dem til nul, hvis du ikke have det i din kode, du foretager vil forblive som 1, efter den er sat for første gang.Jeg går ud fra du ikke ønsker det.

Uden at spille rundt med koden selv det er svært at sige, hvad den præcise fejl er.Selv, se da det er en "dårlig synkron beskrivelse ', fejl, så er det snævrer det ned til, hvis redegørelse C.

IF ((sub = '1 'AND y> x) eller (sub = '0' AND temp (4) = '1 ')) THEN

Jeg tror, at der er betingelser, der, som ikke kan løses præcist.

prøve at ændre det til
IF ((J) eller (k)) THEN

med j og k er forarbejdet synchounously andre steder, med en
HVIS (CLK = '1 'AND CLK'event) THEN
IF ((sub = '1 'AND y> x)
j: = 1;
anden
j: = 0;
etc

eller lignende.

at i det mindste vil hjælpe dig med at indsnævre hvilket signal er årsag til fejlen.

 
at en del af den kode jeg tror ikke skaber problemer.den, når jeg adresse den stat, hvor CLK er lav, jeg ønsker, at alle udgange som X. Jeg satte Else og jeg blive "dårlige synkrone beskrivelse«.Jeg tager ellers ud og initialisere alle udgange som X før IF (clk = 1 og clk'event) og stadig få "dårlige synkrone beskrivelse«.Jeg ved, hvad der forårsager dette.

 
hvis du gør, hvad jeg foreslår ovenstående, vil du finde ud af hvad der forårsager den, eller vil du vide, hvilken af disse to udtryk, der giver dig problemet (hvis en, men jeg vil lægge gode penge på det at være derinde!) .Det er op til dig selv.

 
Jeg har fulgt dit forslag og stadig få fejl.

Kode:

library IEEE;

brug IEEE.STD_LOGIC_1164.ALL;

brug IEEE.STD_LOGIC_ARITH.ALL;

brug IEEE.STD_LOGIC_UNSIGNED.ALL;enhed ALU4bit er

Port (x: i std_logic_vector (3 downto 0);

y: i std_logic_vector (3 downto 0);

s: i std_logic_vector (3 downto 0);

CLK: i STD_LOGIC;

V, N, Z, C: out STD_LOGIC: = '0 ';

f: out std_logic_vector (3 downto 0));

- SEV_SEG: out std_logic_vector (7 downto 1));

ende ALU4bit;architecture Behavioral af ALU4bit erbegyndPROCESS (s, CLK) IS

VARIABLE temp, at: std_logic_vector (4 downto 0); - temp gemmer resultatet af drift og udføre.
medføre, er individuel foretage bits

VARIABLE A: std_logic_vector (3 downto 0); - giver input x skal ændres

VARIABLE B: std_logic_vector (3 downto 0); - giver input y skal ændres

VARIABLE k, sub: STD_LOGIC - skranke og angivelse af subtraktion drift henholdsvis

VARIABLE T1, T2: Boolean;

BEGIN- Initialisere variabler og udgange

f <= "0000";

C <= '0 ';

V <= '0 ';

N <= '0 ';

Z <= '0 ';

sub: = '0 ';

A: = x;

B: = y;

bære (4 downto 0): = "00.000" - gemmer bære bits, der er nødvendige for fastlæggelse overflowHVIS (CLK = '1 'AND CLK'event) THENCASE S- Aritmetiske operationer: s (3) = 0Når "0000" =>

temp: = ('0 '& A) - overførsel x til temp

Når "0.001" =>

temp: = ('0 '& A) 1 - tilvækst x senest 1.

Når "0.010" =>

temp: = ('0 '& A) B - tilføj y til x

Når "0.011" =>

temp: = ('0 '& A) B 1 - tilføj y og Cin til x

Når "0.100" =>

B: = IKKE B;

temp: = ('0 '& A) B - subtrahere y fra x (en besætningsmedlemmer subtraktion)

sub: = '1 ';

Når "0.101" =>

B: = IKKE B;

temp: = ('0 '& A) B 1 - trække y fra x og tilvækst (to besætningsmedlemmer subtraktion)

sub: = '1 ';

Når "0.110" =>

temp: = ('0 '& A) - 1 - dekrementeringen x

sub: = '1 ';

Når "0.111" =>

temp: = ('0 '& B) - overførsel y til temp- Logiske operationer: s (3) = 1Når "1000" =>

temp: = IKKE ('0 '& B) - flydende y

NÅR "1001" =>

temp: = ('0 '& (A NAND B)) - logisk nog af x og y

Når "1010" =>

temp: = ('0 '& (A eller B)) - logisk eller af x og y

Når "1011" =>

temp: = ('0 '& (A XNOR B)) - logisk xnor af x og y

Når "1100" =>

temp: = ('0 '& (A XOR B)) - logisk xor af x og y

Når "1101" =>

temp: = ('0 '& (A eller B)) - logisk eller af x og y

Når "1110" =>

temp: = ('0 '& (A og B)) - logisk og af x og y

Når andre =>

temp: = IKKE ('0 '& A) - invertsukker x

END CASE;- Output overdragelseHvis S (3) = '0 'THEN - kun overveje CCR i aritmetiske mode- Bestemme negativ smule, N

IF temp (3) = '1 'THEN

N <= '1 ';

END IF;- Afgøre overflow smule, V

- Beregne bære på hvert trin i regnefunktionen

bære (0): = '0 ';

for k i 1 til 4 loop

bære (k): = (A (k-1) og B (k-1)) ELLER (bære (k-1) og (a (k-1) XOR B (k-1)));

END LOOP;IF (bære (4) XOR bære (3)) = '1 'THEN

V <= '1 ';

END IF;- Afgøre nul bit, Z

IF temp (3 downto 0) = "0000" THEN

Z <= '1 ';

END IF;- Afgøre bære smule, C

HVIS (sub = '1 'AND y> x) THEN

t1: = TRUE;

ELSE

t1: = FALSE;

END IF;

HVIS (sub = '0 'OG temp (4) = '1') THEN

t2: = TRUE;

ELSE

t2: = FALSE;

END IF;IF (T1-eller T2) THEN

C <= '1 ';

END IF;ELSE

C <= '0 ';

Z <= '0 ';

N <= '0 ';

V <= '0 ';

END IF;- Afgøre output, ff <= temp (3 downto 0);ELSE

f <= "xxxx";

C <= 'X';

V <= 'X';

N <= 'X';

Z <= 'X';

END IF;END PROCESS;

END Behavioral;
 
sætte hver i deres ownprocess med hvis (clk'event og CLK = 1), og sender dem til det nuværende, er, hvad jeg mente, du skal gøre.Jeg formoder, at der legel, har det været et par år siden jeg programmeret VHDL, men jeg tror ikke, at der bør være et problem at gøre det.

så den fejl vil pege på den ene med den synkrone problemet, og dermed indsnævre ned, hvor den faktiske fejl.Da det er jeg forestille mig, det er stadig peger på den samme linje som den gjorde oprindeligt.

Det er helt sikkert en fejl med uret, og med fastsættelsen af C, hvorved det er at være et sted i denne erklæring.Du er nødt til at finde en måde at omskrive det, men du først nødt til at vide, hvor stor en del til at fokusere din opmærksomhed på.Der kan være en beter måde at finde fejlen, men jeg kan ikke tænke på en.Lagt efter 2 minutter:forsøge at gøre dem signaler i stedet for variabler derefter.

Jeg bemærkede lige at else-sætning, problemet er, at det ikke vil give skrald (selv om det måske), det vil give dig et 1 eller 0, sikkert den sidste værdi, og det kan ikke skrive en X, således det kan ikke syntetiseres.

 
Godt i testbench det giver X for lav CLK.Jeg tror, det underliggende problem er, at selv om koden er syntactially korrekt og arbejder i simulator, er der ikke en sådan ressource) eller et sæt af ressourcer), som svarer til den adfærd modelleret i koden således det ikke kan syntetiseres.Jeg gør nogle omstruktureringer og omorganiserer nu, forhåbentlig vil det arbejde ...

 
Tarek-skrev:

Godt i testbench det giver X for lav CLK.
Jeg tror, det underliggende problem er, at selv om koden er syntactially korrekt og arbejder i simulator, er der ikke en sådan ressource) eller et sæt af ressourcer), som svarer til den adfærd modelleret i koden således det ikke kan syntetiseres.
Jeg gør nogle omstruktureringer og omorganiserer nu, forhåbentlig vil det arbejde ...
 
Denne erklæring er faktisk forsøger at skrive på begge kanter af uret, der er heller ikke muligt i VHDL.
Du er nødt til at omstrukturere din kode noget.

 
Signaler om, at ændre på et ur begivenhed er modelleret med registre.Registre på en Xilinx FPGA forblive stabilt indtil der er et ur begivenhed, eller en højere prioritering eller nulstille tilstand.En udefineret tilstand er en ugyldig tilstand - det kan ikke syntetiseres.Deres proces skal afspejle denne virkelighed.

Negation af et ur begivenhed er "nonevent".I ELSE af et ur begivenhed, er du dybest set beder kredsløb til at opretholde en bestemt produktion oplyse, hvornår uret signal er stabilt - og et ur-signal er stabilt mellem ur kanter (events).Denne helt negerer ethvert forsøg på at ændre output tilstand.

 

Welcome to EDABoard.com

Sponsor

Back
Top