Najczesciej popelniane bledy w VHDL - PowerPoint PPT Presentation

About This Presentation
Title:

Najczesciej popelniane bledy w VHDL

Description:

... Programowanie pod k tem sprz tu Biblioteka: unisim a pami blokowa BRAM entity RAMB16_S36_S36 is generic ( INIT_00 : bit_vector : ... – PowerPoint PPT presentation

Number of Views:24
Avg rating:3.0/5.0
Slides: 31
Provided by: EAI4
Category:

less

Transcript and Presenter's Notes

Title: Najczesciej popelniane bledy w VHDL


1
Najczesciej popelniane bledy w VHDLu
  • Ernest Jamro
  • Kat. Elektroniki
  • AGH

2
Wzory poprawnej syntezy
  • ActiveHDL Menu/Tools/Language Assistant
    Synthesis Templates
  • ISE Procject Navigator Menu/Edit/Language
    Templates
  • VHDL / Synthesis Constructs / (Coding Example)

3
Poprawna 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

4
Najczestsze 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

5
Przerzutnik 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
6
Bledy 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
7
Blad 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
8
Przerzutnik 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
9
Multiplekser (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
10
Multiplekser 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
11
Process 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
12
Alternatywne 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
13
Umiejscawianie 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
14
Umiejscawianie 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
15
Umiejscawianie 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
16
Wartosci 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
17
Uzycie 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)

18
Po 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

19
Ustawianie 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
20
Dodawanie 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))
21
Programowanie 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))
22
Programowanie 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))
23
Programowanie 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 )
24
Programowanie 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 )
25
Programowanie 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.
26
Reset 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

27
Poziomy 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
28
Operacje 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)
29
Operacje 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
30
Operacje 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
Write a Comment
User Comments (0)
About PowerShow.com