|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
commander29 Član
Pridružen-a: Pon 20 Nov 2006 15:24 Prispevkov: 47 Aktiv.: 0.22
|
Objavljeno: Čet Avg 09, 2007 12:17 pm Naslov sporočila: |
|
|
Ker uporabljam Spartan-3 in moram priprti Clock nanj se mi zastavlja vprašanje, ki ga nisem znal rešiti z prebiranjem User guide-a.
Spartan ima 8 GCLK pinov, ki so vsi po vrsti lahko tudi I/O pini. Kako FPGA-ju dopoveš da je to sedaj GCLK in ne I/O pin? Ali je dovolj da ga definiraš v Constraint file-u kot
Citiram: |
Record=Constraint | TargetKind=Port | TargetId=CLK_BRD | FPGA_PINNUM=P181
Record=Constraint | TargetKind=Port | TargetId=CLK_BRD | FPGA_CLOCK_PIN=TRUE |
P181 = IO_L32N_1/GCLK4
in ali je dovol če pripeljem Clock samo na en pin? |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.19 Kraj: Kranj - struževo
|
Objavljeno: Čet Avg 09, 2007 2:01 pm Naslov sporočila: |
|
|
Dovolj je na en pin.
V .UCF fajlu je definirana povezava med netlisto in pinoutom:
Koda: |
NET "clock_in_100MHz" LOC = "p181" ;
NET "clock_in_50MHz" LOC = "p180" ; |
Da je ta input globalni clock mu lahko poveš v VHDLu s komponento
Koda: |
input_clock_inst : BUFG port map (I => clock_in_50MHz, O => clock); |
Signal "clock" potem uporabiš za šofiranje FFov v vezju.
Seveda moraš na začetku fajla definirati:
Koda: |
---- Use the following library declaration if instantiating
---- any Xilinx primitives in this code.
library UNISIM;
use UNISIM.VComponents.all;
|
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.19 Kraj: Kranj - struževo
|
Objavljeno: Sre Avg 22, 2007 11:06 am Naslov sporočila: |
|
|
Za kolega sem napisal en testni program in ga bom objavil še tu. Za lažji začetek programiranja v VHDL-u...
Jaz najraje uporabljam binarne vrednosti. Lahko bi tudi hex...
Integerjev ipd. nočem uporabljati, ker dostikrat naredi glomazno kodo. S std_logic_vector pa mu točno definiraš debelino žice. In iz njega lahko tudi pobereš poljubni bit(e) ven z npr: ime_signala (6 downto 3).
In če pustiš števec z znano širino besede teči v nedogled točno veš pri kateri vrednosti naredi overflow.
Sintaksa za prirejanje vrednosti:
:= je za konstante
<= je za spremenljivke
Tole se lepo prevede, preizkušal pa nisem na HW.....
Primer deluje tako, da 32-bitni števec teče od vrednosti 0 do vrednosti cnt_max. Ob vrednosti cnt_led1 se prižge izhodni pin, ob vrednosti cnt_led pa se ugasne.
Koda: |
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity test01 is
Port ( takt : in STD_LOGIC;
izhod : out STD_LOGIC);
end test01;
architecture Behavioral of test01 is
signal counter : std_logic_vector (31 downto 0);
signal clear : std_logic;
constant cnt_max : std_logic_vector (31 downto 0) := "11100000000000000000000000000000";
constant cnt_led0 : std_logic_vector (31 downto 0) := "00000010000000000000000000000000";
constant cnt_led1 : std_logic_vector (31 downto 0) := "00000000010000000000000000000000";
begin
-- števec
process (takt)
begin
if rising_edge (takt) then
if clear = '1'
then counter <= "00000000000000000000000000000000"; -- sinhroni reset
else counter <= counter + 1;
end if;
end if; -- clock
end process;
-- komparator za reset števca
process (takt)
begin
if rising_edge (takt) then
if counter = cnt_max
then clear <= '1';
else clear <= '0';
end if;
end if; -- clock
end process;
-- komparatorja za krmiljenje izhoda
process (takt)
begin
if rising_edge (takt) then
if counter = cnt_led1
then izhod <= '1';
elsif counter = cnt_led0 then izhod <= '0';
end if;
end if; -- clock
end process;
end Behavioral; |
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.19 Kraj: Kranj - struževo
|
Objavljeno: Sre Avg 22, 2007 11:10 am Naslov sporočila: |
|
|
Še par napotkov....
VHDL je po svoje kar zahteven. Eno stvar lahko opišeš na vsaj 5 različnih načinov.
V principu pa je najlažje, da si sestavljaš funkcijske bloke (npr števec posebej, komparator posebej) in jih zvežeš med seboj.
Ves čas moraš vedeti, da vsi procesi tečejo paralelno in ne po vrsti kot v uC.
Zaradi tega tudi ne moreš enega izhodnega signala spreminjat iz dveh različnih procesov. (analogija : dve različni fazi iz 3f vtičnice pripelješ na isti kontakt žarnice ).
Nasvet - če nočeš imeti težav, vselej uporabljaj sinhron dizajn! Vse naj se dogaja z istim taktom.
Ko definiraš proces, v oklepaju definiraš, na kateri signal se bo proces sprožil = sensitivity list). Če delaš sinhron dizajn, imaš v oklepaju samo clock signal. Ali pa še mogoče asinhroni master reset.
Jaz uporabljam Xilinx ISE webpack. ActiveHDL je ok za simulacije ali grafično risanje stanj avtomatov. Trenutno ga ne uporabljam.
Še ena zanimiva zadeva se skriva v ISE sw... Poišči ikonco z narisano žarnico. Ta ti odpre kot nek help fajl, kjer imaš notri mnooogo primerov raznih števcev, multiplekserjev,.... in primitivnih komponent = s temi uporabiš namenski hardver, ki je že v čipu, npr RAM, množilnik,...
Tako kot v drugih jezikih lahko tudi tu delaš ugnezdene source fajle. Samo sistem je malo drugačen. Tu v celoti narediš neko komponento, vključno z vhodi in izhodi.
To komponento pa potem kličeš iz glavnega fajla kot nek black-box z znanimi vhodi in izhodi. V Project Navigatorju (ISE) se ti pojavi neka neznana kompoonenta, ki ji moraš določiti fajl z vsebino.
Če komu to dela težave, naj javi in bom napisal step-by-step proceduro.
Še par osnovnih zadev...
PULL_UP / -DOWN na IO pinih:
Koda: |
architecture Behavioral of Testni_dizajn is
ATTRIBUTE PULLUP : STRING ;
ATTRIBUTE PULLDOWN : STRING;
ATTRIBUTE PULLUP OF vhod1 : SIGNAL IS "TRUE";
ATTRIBUTE PULLDOWN OF vhod2 : SIGNAL IS "TRUE";
|
Definiranje signalov za povezavo z zunanjim svetom:
Vhodno/izhodni signal modula je lahko definiran kot IN, OUT ali INOUT.
Tazadnjemu signalu lahko na enem mestu definiramo izhodno vrednost, beremo pa ga lahko kjerkoli v ostalem vezju. Za razliko od definicije OUT, ki se ne bo pustil brati (prevajalnik zajamra).
Najbolj uporabne vrednosti za signal tipa OUT ali INOUT so: '0', '1' in 'Z'. Tretje je High-Z oz. Tristate. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.04 Kraj: glej fogl
|
Objavljeno: Sre Dec 19, 2007 9:07 pm Naslov sporočila: |
|
|
Jaz sem preizkusil en drug primer (minimalno sem ga spremenil), pa mi ne funkcionira. Ledica ves čas samo gori. Zakaj to?
Koda: |
entity ledica is
Port (
utripajoca_ledica : out STD_LOGIC;
clockIn : in STD_LOGIC);
end ledica;
architecture Behavioral of ledica is
signal ClkStevec : STD_LOGIC_VECTOR ( 16 downto 0 ):="00000000000000000";
signal Clock : STD_LOGIC:='0';
begin
DeliteljClocka : process(clockIn)
begin
if rising_edge(clockIn) then
if ClkStevec >= "1100001101010000" then -- 0b1100001101010000 = 50000
ClkStevec <= "00000000000000000";
if (Clock = '0') then Clock <= '1';
else Clock <= '0';
end if;
else ClkStevec <= ClkStevec + 1;
end if;
end if;
end process;
IzpisNaLED : process(Clock)
begin
if(Clock = '1') then utripajoca_ledica <= '1';
else utripajoca_ledica <= '0';
end if;
end process;
end Behavioral;
|
|
|
Nazaj na vrh |
|
|
MarkoM Član
Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 13.17 Kraj: Lovrenc na P.
|
Objavljeno: Sre Dec 19, 2007 9:36 pm Naslov sporočila: |
|
|
Zato, ker ne vidiš utripanja zaradi prevelike frekvence utripanja. |
|
Nazaj na vrh |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.04 Kraj: glej fogl
|
Objavljeno: Sre Dec 19, 2007 9:48 pm Naslov sporočila: |
|
|
Sem spremenil:
signal ClkStevec : STD_LOGIC_VECTOR ( 23 downto 0 ):="000000000000000000000000";
in
if ClkStevec >= "11111111100001101010000" then
Pa je rezultat isti. |
|
Nazaj na vrh |
|
|
MarkoM Član
Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 13.17 Kraj: Lovrenc na P.
|
Objavljeno: Sre Dec 19, 2007 10:32 pm Naslov sporočila: |
|
|
Poskusi z osciloskopom. Jaz imam 50MHz quartz pa sem nastavil mislim, da 23 bitov in vse postavil na 1. |
|
Nazaj na vrh |
|
|
icek Član
Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.47 Kraj: Ruše
|
Objavljeno: Sre Dec 19, 2007 11:14 pm Naslov sporočila: |
|
|
trot je napisal/a: |
Jaz sem preizkusil ta primer (minimalno sem ga spremenil), pa mi ne funkcionira. Ledica ves čas samo gori. Zakaj to?
Koda: |
entity ledica is
Port (
utripajoca_ledica : out STD_LOGIC;
clockIn : in STD_LOGIC);
end ledica;
architecture Behavioral of ledica is
signal ClkStevec : STD_LOGIC_VECTOR ( 16 downto 0 ):="00000000000000000";
signal Clock : STD_LOGIC:='0';
begin
DeliteljClocka : process(clockIn)
begin
if rising_edge(clockIn) then
if ClkStevec >= "1100001101010000" then -- 0b1100001101010000 = 50000
ClkStevec <= "00000000000000000";
if (Clock = '0') then Clock <= '1';
else Clock <= '0';
end if;
else ClkStevec <= ClkStevec + 1;
end if;
end if;
end process;
IzpisNaLED : process(Clock)
begin
if(Clock = '1') then utripajoca_ledica <= '1';
else utripajoca_ledica <= '0';
end if;
end process;
end Behavioral;
|
|
Jaz bi del IzpisNaLED delal malo drugače. Če si že reševal s procesnim stavkom, bi bilo boljše, če bi delal na fronto Clock-a. Drugače bi jaz napisal kar
Koda: |
utripajoca_ledica <= '1' when Clock = '1' else '0';
|
edit:
Ali pa še enostavneje:
Koda: |
utripajoca_ledica <= Clock;
|
|
|
Nazaj na vrh |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.04 Kraj: glej fogl
|
Objavljeno: Čet Dec 20, 2007 9:24 am Naslov sporočila: |
|
|
Jaz nisem nič reševal, ampak sem samo hotel preizkusit program, ki je bil spisan na začetku te teme.
Najbrž tvoja rešitev še vedno ne bi rešila problema neutripanja ledice. |
|
Nazaj na vrh |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.04 Kraj: glej fogl
|
Objavljeno: Ned Dec 23, 2007 12:43 pm Naslov sporočila: |
|
|
Sem preizkusil tole kodo, ki jo je prilepil aly malo višje, pa mi ne deluje. Ledica, ki bi morala utripat samo gori (druga ledica, ki sem jo vezal na tipko dela normalno), pa sem poskusil različne vrednosti za cnt_led0 in cnt_led1. Poskusil sem tudi zamenjat jumper za nastavljanje frekvence, pa je rezultat še vedno isti.
Koda: |
entity main is
Port(
ledica0 : out std_logic;
ledica1 : out std_logic;
takt : in STD_LOGIC;
tipka0 : in std_logic;
tipka1 : in std_logic);
end main;
architecture Behavioral of main is
signal counter : std_logic_vector (31 downto 0);
signal clear : std_logic;
constant cnt_max : std_logic_vector (31 downto 0) := "11100000000000000000000000000000";
constant cnt_led0 : std_logic_vector (31 downto 0) := "00000001000000000000000000000000";
constant cnt_led1 : std_logic_vector (31 downto 0) := "00000000000000000001000000000000";
begin
-- števec
process (takt)
begin
if rising_edge (takt) then
if clear = '1'
then counter <= "00000000000000000000000000000000"; -- sinhroni reset
else counter <= counter + 1;
end if;
end if; -- clock
end process;
-- komparator za reset števca
process (takt)
begin
if rising_edge (takt) then
if counter = cnt_max
then clear <= '1';
else clear <= '0';
end if;
end if; -- clock
end process;
-- komparatorja za krmiljenje izhoda
process (takt)
begin
if rising_edge (takt) then
if counter = cnt_led1
then ledica1 <= '1';
elsif counter = cnt_led0 then ledica1 <= '0';
end if;
end if; -- clock
end process;
ledica0 <= tipka0;
end Behavioral;
|
|
|
Nazaj na vrh |
|
|
icek Član
Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.47 Kraj: Ruše
|
Objavljeno: Ned Dec 23, 2007 3:29 pm Naslov sporočila: |
|
|
Takšne napake je dobro iskat s pomočjo simulatorja.
Zgoraj manjka del kode, v katerem so vključene knjižnice. Probaj spremenit pri števcu
counter <= counter + '1'.
1 je v tvojem primeru mišljena kot integer za seštevanje katerega moraš vključiti knjižnico IEEE.STD_LOGIC_UNSIGNED.ALL. Če pa napišeš '1' pa je to mišljeno kot binarni signal logične enice. To mi je prvo kaj mi pade na pamet. Če ne bo šlo povej, pa bom zalaufal moj Xboard pa da vidimo kaj bo rekel. |
|
Nazaj na vrh |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.04 Kraj: glej fogl
|
Objavljeno: Ned Dec 23, 2007 4:26 pm Naslov sporočila: |
|
|
Te knjižnice imam tudi na vrhu (nisem vedel da so bistvene za delovanje kode, pa jih nisem prilepil):
Koda: |
ibrary IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
Sem pa poskusil tudi to kar si predlagal (1 v '1'), pa je rezultat še vedno isti (ampak to je potem itak napačno, če imam knjižnice že vključene). |
|
Nazaj na vrh |
|
|
icek Član
Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.47 Kraj: Ruše
|
Objavljeno: Ned Dec 23, 2007 7:00 pm Naslov sporočila: |
|
|
Ne vem. Rešitev se mi zdi drugače kar precej zakomplicirana. Utripanje LED bi rešil jaz tako, pa še bolj enostavneje je. Hitrost nastavljaš s pogojem v if stavku.
Koda: |
entity main is
Port ( ledica0 : out STD_LOGIC;
ledica1 : out STD_LOGIC;
takt : in STD_LOGIC;
tipka0 : in STD_LOGIC;
tipka1 : in STD_LOGIC);
end main;
architecture Behavioral of main is
signal counter : std_logic_vector (31 downto 0);
signal tmp : std_logic;
begin
-- števec
process (takt)
begin
if rising_edge (takt) then
if counter = x"00010000" then
counter <= x"00000000";
tmp <= tmp xor '1';
else
counter <= counter + '1';
end if;
end if; -- clock
end process;
ledica1 <= tmp;
ledica0 <= tipka0;
end Behavioral; |
|
|
Nazaj na vrh |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.04 Kraj: glej fogl
|
Objavljeno: Pon Dec 24, 2007 6:09 pm Naslov sporočila: |
|
|
Sem preizkusil tudi ta primer, pa tudi ta ne deluje...ledica še vedno samo gori.
Očitno delam nekaj narobe, da mi nič ne funkcionira, samo ne vem kaj.
A si ti preizkusil tole na plati? |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|