www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

FPGA začetnik
Pojdi na stran Prejšnja  1, 2, 3, 4, 5  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> FPGA in CPLD programabilna vezja
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
commander29
Član
Član



Pridružen-a: Pon 20 Nov 2006 15:24
Prispevkov: 47
Aktiv.: 0.22

PrispevekObjavljeno: Čet Avg 09, 2007 12:17 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9406
Aktiv.: 42.36
Kraj: Kranj - struževo

PrispevekObjavljeno: Čet Avg 09, 2007 2:01 pm    Naslov sporočila:   Odgovori s citatom

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 Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9406
Aktiv.: 42.36
Kraj: Kranj - struževo

PrispevekObjavljeno: Sre Avg 22, 2007 11:06 am    Naslov sporočila:   Odgovori s citatom

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 Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9406
Aktiv.: 42.36
Kraj: Kranj - struževo

PrispevekObjavljeno: Sre Avg 22, 2007 11:10 am    Naslov sporočila:   Odgovori s citatom

Š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 Smile ).

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 Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1270
Aktiv.: 6.07
Kraj: glej fogl

PrispevekObjavljeno: Sre Dec 19, 2007 9:07 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
MarkoM
Član
Član



Pridružen-a: Tor 12 Sep 2006 15:29
Prispevkov: 2825
Aktiv.: 13.23
Kraj: Lovrenc na P.

PrispevekObjavljeno: Sre Dec 19, 2007 9:36 pm    Naslov sporočila:   Odgovori s citatom

Zato, ker ne vidiš utripanja zaradi prevelike frekvence utripanja.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1270
Aktiv.: 6.07
Kraj: glej fogl

PrispevekObjavljeno: Sre Dec 19, 2007 9:48 pm    Naslov sporočila:   Odgovori s citatom

Sem spremenil:

signal ClkStevec : STD_LOGIC_VECTOR ( 23 downto 0 ):="000000000000000000000000";

in

if ClkStevec >= "11111111100001101010000" then

Pa je rezultat isti.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
MarkoM
Član
Član



Pridružen-a: Tor 12 Sep 2006 15:29
Prispevkov: 2825
Aktiv.: 13.23
Kraj: Lovrenc na P.

PrispevekObjavljeno: Sre Dec 19, 2007 10:32 pm    Naslov sporočila:   Odgovori s citatom

Poskusi z osciloskopom. Jaz imam 50MHz quartz pa sem nastavil mislim, da 23 bitov in vse postavil na 1.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.47
Kraj: Ruše

PrispevekObjavljeno: Sre Dec 19, 2007 11:14 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1270
Aktiv.: 6.07
Kraj: glej fogl

PrispevekObjavljeno: Čet Dec 20, 2007 9:24 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1270
Aktiv.: 6.07
Kraj: glej fogl

PrispevekObjavljeno: Ned Dec 23, 2007 12:43 pm    Naslov sporočila:   Odgovori s citatom

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. Confused

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.47
Kraj: Ruše

PrispevekObjavljeno: Ned Dec 23, 2007 3:29 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1270
Aktiv.: 6.07
Kraj: glej fogl

PrispevekObjavljeno: Ned Dec 23, 2007 4:26 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.47
Kraj: Ruše

PrispevekObjavljeno: Ned Dec 23, 2007 7:00 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1270
Aktiv.: 6.07
Kraj: glej fogl

PrispevekObjavljeno: Pon Dec 24, 2007 6:09 pm    Naslov sporočila:   Odgovori s citatom

Sem preizkusil tudi ta primer, pa tudi ta ne deluje...ledica še vedno samo gori. Shocked
Očitno delam nekaj narobe, da mi nič ne funkcionira, samo ne vem kaj. Confused
A si ti preizkusil tole na plati?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> FPGA in CPLD programabilna vezja Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3, 4, 5  Naslednja
Stran 4 od 5

 
Pojdi na:  
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group