Title: Najczesciej popelniane bledy w VHDL
1Najczesciej popelniane bledy w VHDLu
- Ernest Jamro
- Kat. Elektroniki
- AGH
2Wzory poprawnej syntezy
- ActiveHDL Menu/Tools/Language Assistant
Synthesis Templates - ISE Procject Navigator Menu/Edit/Language
Templates - VHDL / Synthesis Constructs / (Coding Example)
3Poprawna skladnia przerzutnikatypu D
- process (CLK, RESET)
- begin
- if RESET'1' then reset asynchroniczny
- DOUT lt '0'
- elsif (CLK'event and CLK'1') then DOUT lt
DIN - end if
- end process
4Najczestsze bledy
- process (CLK, RESET) brak sygnalu reset
- begin
- if RESET'1' then reset asynchroniczny
- DOUT lt '0'
- elsif (CLK'event and CLK'1') then DOUT lt
DIN - end if
- end process
5Przerzutnik D z Clock Enable (CE)
process (ltclockgt, ltresetgt) begin if
ltresetgt1' then ltoutputgt lt '0'
elsif (ltclockgt'event and ltclockgt'1') then
if ltclock_enablegt '1' then --
lub inna logika synchroniczna
ltoutputgt lt ltinputgt end
if end if end process
6Bledy Przerzutnik z CE
process (ltclockgt, ltresetgt, ltclock_enablegt)
begin if ltresetgt'0' then
ltoutputgt lt '0' elsif (ltclockgt'event and
ltclockgt'1 and ltclock_enablegt '1' ) ltoutputgt
lt ltinputgt end if end process
7Blad Wymuszenie tego samego sygnalu w dwóch
procesach
A0 process(...) begin .... if (
...) alt 0 end if end
process A1 process(...) begin ....
if ( ...) alt 1 end if end
process
8Przerzutnik typu Latch
process (GATE, DIN) begin if GATE'1' then
--GATE active High DOUT lt DIN end if end
process Przerzutników Latch nalezy raczej
unikac z reguly powstaja one w wyniku bledu a
nie zamierzonego projektowania
9Multiplekser (lub inna logika kombinacyjna)
process (SEL, A, B, C) begin case SEL is when
"00" gt MUX_OUT lt A when "01" gt MUX_OUT lt
B when "10" gt MUX_OUT lt C when others gt
MUX_OUT lt 'X' end case end process
10Multiplekser Bledy
process (SEL, A, B, C) brak jednego z sygnalów
wejsciowych (latch) begin case SEL is when
"00" gt MUX_OUT lt A when "01" gt MUX_OUT lt
B when "10" gt MUX_OUT lt C when others gt
MUX_OUT lt 'X' end case end process
11Process magiczne slowo
Poza procesem nie mozna uzywac nastepujacych
skladni If ... Then ... Elsif ... End if For
.... Loop Uwaga Wiele operacji (szczególnie
logiki kombinacyjnej) mozna umiescic poza
procesem
12Alternatywne rozwiazanie Multiplekser
Mux_outlt A when sel "00" else B when
sel "01" else C when sel "10" else
'-' LUB WITH sel SELECT Mux_out lt A when
"00", B when "01", C when
"10" '-' when others
inB AFTER 10 NS WHEN OTHERS
13Umiejscawianie komponentów 1
entity FULL_ADDER port ( a, b, cin in
std_logic s, cout out std_logic) end
FULL_ADDER architecture arch of FULL_ADDER
is begin slt a xor b xor c coutlt a when ab
else cin end arch
14Umiejscawianie komponentów 2
entity MY_ADDER generic (width integer)
port ( a, b in std_logic_vector(0 to width-1)
s out std_logic_vector(0 to width-1) end
MY_ADDER architecture arch of MY_ADDER is
component FULL_ADDER -- deklaracja komponentu
port ( a, b, cin in std_logic s,
cout out std_logic) end component signal
carry std_logic_vector(0 to dwidth) begin
15Umiejscawianie komponentów 3
Ciag dalszy z poprzedniej strony (rozwiazanie
nieoptymalne) Carry(0)lt 0 Gi for i in 0 to
width-1 generate wielokrotne uzycie elementu!
g full_adder port map (agt a(i), bgt b(i),
cingt carry(i), coutgt
carry(i1), sgt s(i)) end generate end
arch Lepsze rozwiazanie (uzyta dedykowana logika
dodajaca) slt a b
16Wartosci domyslne, uaktualnienie modulów
Stary komponent component and_gate port (
din1, din2 in std_logic dout out
std_logic) end component Nowy
komponent component and_gate generic
(invert_output integer 0) -- dodanie
dodatkowego parametru port ( din1, din2,
din3 in std_logic 1 -- wartosc domyslna
1 dout out std_logic) end
component
17Uzycie zmodyfikowanego komponentu
Stary kod uzywa nowego elementu z nowymi
wartosciami w formie domyslnej A and_gate
port map (din1gt a, din2gt b, dout gt
y) Równowazne i zalecane w nowym kodzie A
and_gate generic map (invert_outputgt0) port
map (din1gt a, din2gt b, din3gt 1, dout gt y)
18Po co wartosci domyslne
- Rozwazany element jest elementem nadrzednym
podczas symulacji lub implementacji - Zgodnosc z poprzednimi wersjami tego samego
elementu bez koniecznosci zmiany calego starego
kodu
19Ustawianie wartosci parametrów
Architecture arch of my_gate is component
and_gate generic (invert_output integer 1) --
nie zmieniamy wartosci parametru tutaj port
( din1, din2, din3 in std_logic 0 -- nie
zmieniamy wartosci domyslnej tutaj dout
out std_logic) end component begin a
and_gate -- uzycie elementu generic map
(invert_outputgt 1) -- umieszczamy wartosc
kazdego parametru port map (din1gt a, din2gt
b, din3gt 0) -- staramy sie okreslic wartosc
kazdego wejscia End arch
20Dodawanie bibliotek
library ieee use ieee.std_logic_1164.all --
uzycie std_logic use ieee.std_logic_unsigned.all
-- kazda wartosc std_logic_vector jest
traktowana jako integer bez znaku use
ieee.std_logic_signed.all -- kazda wartosc
std_logic_vector jest traktowana jako integer ze
znaku Nie mozna równoczesnie uzyc obu bibliotek
std_logic_unsigned oraz std_logic_signed. W tym
wypadku nalezy uzyc biblioteki use
ieee.std_logic_arith.all oraz zamiast slowa
kluczowego std_logic_vector nalezy uzyc
slów unsigned lub signed (wada koniecznosc
uzywania konwersji std_logic_vector ? unsigned
(lub signed))
21Programowanie pod katem sprzetu
Pamiec RAM 16x1 (distributed RAM) type mem_type
is array (0 to 15) od std_logic_vector(0 to
7) signal mem mem_type begin process
(ltclockgt) begin if (ltclockgt'event and ltclockgt
'1') then if (ltwrite_enablegt '1') then
mem(conv_integer(ltaddressgt))
lt ltinput_datagt end if end if end
process ltram_outputgt lt mem(conv_integer(ltaddress
gt))
22Programowanie pod katem sprzetu
Pamiec blokowa BRAM (dwuportowa) PortA process
(ltclockAgt) begin if (ltclockAgt'event and
ltclockAgt '1') then if (ltwrite_enableAgt
'1') then ltram_namegt(conv_integer(ltad
dressAgt)) lt ltinput_dataAgt end if
ltaddressA_siggt lt ltaddressAgt end
if end process PortB process (ltclockBgt) begin
if (ltclockBgt'event and ltclockBgt '1') then
ltaddressB_siggt lt ltaddressBgt end if
end process ltram_outputAgt lt ltram_namegt(conv_int
eger(ltaddressA_siggt)) ltram_outputBgt lt
ltram_namegt(conv_integer(ltaddressB_siggt))
23Programowanie pod katem sprzetu
Biblioteka unisim a pamiec blokowa BRAM entity
RAMB16_S36_S36 is generic ( INIT_00 bit_vector
X"000000000000000000000000000000000000000000000
0000000000000000000" .... INIT_3F bit_vector
X"000000000000000000000000000000000000000000000
0000000000000000000" ) port( DOA out
STD_LOGIC_VECTOR (31 downto 0) DOB out
STD_LOGIC_VECTOR (31 downto 0) DOPA out
STD_LOGIC_VECTOR (3 downto 0) DOPB out
STD_LOGIC_VECTOR (3 downto 0) ADDRA in
STD_LOGIC_VECTOR (8 downto 0) ADDRB in
STD_LOGIC_VECTOR (8 downto 0) CLKA in
STD_ULOGIC CLKB in STD_ULOGIC DIA
in STD_LOGIC_VECTOR (31 downto 0) DIB
in STD_LOGIC_VECTOR (31 downto 0) DIPA in
STD_LOGIC_VECTOR (3 downto 0) DIPB in
STD_LOGIC_VECTOR (3 downto 0) ENA in
STD_ULOGIC ENB in STD_ULOGIC SSRA
in STD_ULOGIC SSRB in STD_ULOGIC WEA
in STD_ULOGIC WEB in STD_ULOGIC )
24Programowanie pod katem sprzetu
Biblioteka unisim Petla DLL (delay lock loop
dzialajaca podobnie jak PLL) entity CLKDLL is
port ( CLK0 out std_ulogic
'0' CLK180 out std_ulogic '0'
CLK270 out std_ulogic '0'
CLK2X out std_ulogic '0'
CLK90 out std_ulogic '0'
CLKDV out std_ulogic '0' LOCKED
out std_ulogic '0' CLKFB in
std_ulogic '0' CLKIN in
std_ulogic '0' RST in
std_ulogic '0 )
25Programowanie pod katem sprzetu
library UNISIM use unisim.all -- for global set
reset signal component ROC port ( O out
std_ulogic '1' ) end component Kazdy
przerzutnik powinien byc zerowany (ustawiany)
asynchronicznie tym sygnalem jest to potrzebne
zarówno do celów symulacyjnych jak i dla potrzeb
ustawiania (wartosc 1) po procesie
konfiguracji.
26Reset synchroniczny i asynchroniczny
- Reset asynchroniczny nalezy uzywac jako reset
inicjalizujacy prace ukladu FPGA po konfiguracji
jest on wspomagany sprzetowo - Reset synchroniczny (np. opb_rst) nalezy uzywac
jako sygnal zerujacy w pozostalych przypadkach
np. podczas zerowania liczników, powtórnej
inicjalizacji automatów, itd. - Nie nalezy mieszac resetów synchronicznych i
asynchronicznych
27Poziomy logiczne
Standard std_logic zawiera wiele poziomów nie
tylko 0, 1, co moze powodowac inne zachowanie
ukladu podczas symulacji funkcjonalnej, po
syntezie i w rzeczywistym ukladzie. Przyklad if
ce1 then Qlt D end if Co sie stanie jezeli
dana wejsciowa ce jest typu H, X, Z itd
28Operacje na wektorach - przesuniecia
signal a, b std_logic_vector(dwidth-1 downto 0)
-- deklaracja wektorów, dwidth- szerokosc
wektora Przesuniecie o jeden bit w lewo
(pomnozenie przez 2) alt b(dwidth-2 downto 0)
0 Przesuwajacy o jeden bit w prawo (dzielenie
liczb dodatnich przez 2) alt 0 b(dwidth-1
downto 1) Dzielenie liczb w kodzie uzupelnien
do 2 przez 2 alt b(dwidth-1) b(dwidth-1)
b(dwidth-2 downto 1) -- kopiowanie bitu znaku
b(dwidth-1) Przesuniecie o n-bitów w lewo (n-
constant lub generic) a(dwidth-1 downto n)lt
b(dwidth-1-n downto 0) a(n-1 downto 0)lt
(othersgt0) Podzielenie przez 2n liczby w
kodzie U2 a(dwidth-1 downto dwidth-n-1)lt
(othersgt b(dwidth-1)) a(dwidth-2-n downto
0)lt b(dwidth-2 downto n)
29Operacje logiczne na wektorach
signal c, a, b std_logic_vector(dwidth-1 downto
0) -- deklaracja wektorów clt a and
b Równowazne Gi for i in 0 to dwidth-1
generate c(i)lt a(i) and b(i) end generate
30Operacje logiczne w ramach jednego wektora
Operacje logicze w ramach jednego
wektora library IEEE use IEEE.STD_LOGIC_1164.al
l use IEEE.STD_LOGIC_MISC.all -- dodatkowa
biblioteka signal a std_logic_vector(dwidth-1
downto 0) signal y std_logic ylt
OR_REDUCE(a) Równowazne ylt a(0) or a(1) or
a(2) or ..... or a(dwidth-1) Równowazne Process(
a) variable b std_logic begin b 0
for i in 0 to dwidth-1 loop b b or
a(i) end loop end process