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 

vhdl - osnove
Pojdi na stran Prejšnja  1, 2
 
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
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Pon Mar 05, 2012 10:21 pm    Naslov sporočila:   Odgovori s citatom

ja v vhdl-u mi je večinoma vse jasno, sem kar nekaj delal z njim vendar kako bi bilo to napisano v verilogu, vem da se da narediti to enostavno z always stavkom, vendar imam v always stavku že definrian pozitivni clock ure Rolling Eyes Confused
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.98
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pon Mar 05, 2012 10:48 pm    Naslov sporočila:   Odgovori s citatom

Koda:

reg count;
reg [7:0] counter;

always @ (posedge clk or posedge rst) begin
  if (rst) count <= #1 1'd0;
  else if (button) count <= #1 1'd1;
  else if (counter == 8'd123) count <= #1 1'd0;
end

always @ (posedge clk) begin
  if (count) counter <= #1 counter + 8'd1;
  else if (button) counter <= #1 8'd0;

end


Counter je tvoj števec, s pritiskom na tipko (button) se postavi zastavica count in resetira števec, v naslednjem ciklu začne counter šteti. In šteje do 123, nakar se ustavi, in zastavica count gre na 0. In ja, je (bolj) pravilno, da uporabljaš uro (clock), kot pa posedge oz. rising_edge(TIPKA).

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Pon Mar 05, 2012 11:37 pm    Naslov sporočila:   Odgovori s citatom

Kaj pa v tem primeru:

Koda:
always @(negedge clk)
        begin
             
             if (!write_bit)
                begin
                     tmp[16:0] = par_load[16:0];
                end
             else
                begin
                     if (count < 17)
                         begin
                            rst = 1;
                            count = count + 1;
                            sout = tmp[16];
                            tmp = tmp << 1;
                         end
                     else if (count >= 17)
                        begin
                            rst = 0;
                            write_bit = 0;
                            count = 0;
                        end
                end
        end

Koda je namenjena serijskemu pošiljanju na digitalni potenciometer, stvar deluje, če je write_bit na 1 toliko časa, da lahko pošlje vseh 17 bitov na izhod sout.
Kaj pa če želim narediti tako, da npr. ob pritisku tipke SET se postavi write_bit na 1 in četudi tipko spustim že preden števec pride do 17, se cikel vseeeno zaključi, potem gre write_bit nazaj na 0 in rst enako.
To mi nekako ne uspe rešiti, je pa tudi problem, da sem z uporabo simulatorja dodal še en always stavek, kjer sem imel proženje write_bit na pozitivno fronto SET, vendar s pomočjo altiuma pa ne gre, mi javi napako, da spremenljivko write_bit operirata dva različna stavka!!
Upam, da sem dovolj jasno napisal zadevo Rolling Eyes Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.98
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Tor Mar 06, 2012 8:58 am    Naslov sporočila:   Odgovori s citatom

Saj lahko daš write_bit v drug always stavek, ali pa pač v tem dodaš ta pogoj. Ali nisem prav razumel, v čem je problem?

Sicer ja, en reg lahko kontroliraš samo v enem always stavku - saj je jasno, predstavljaj si to v obliki vezja.

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Tor Mar 06, 2012 9:18 am    Naslov sporočila:   Odgovori s citatom

torej kako bi implementriral v tem always stavku funkcijo, ki bi ob kratkem pulzu vhodnega signala SET postavil write_bit na 1 in ostal na ena vse dokler števec šteje do 17, potem bi tudi rst šel na 0 in tako dalje?? Rolling Eyes
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



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

PrispevekObjavljeno: Tor Mar 06, 2012 9:42 am    Naslov sporočila:   Odgovori s citatom

V tem stilu:

if tipka=1 then counter_enable=1
...
if counter=999 then counter_enable=0

Vse skupaj pa daš v sinhroni blok krmiljen s sistemskim clockom.
Seveda mora biti pritisk tipke daljši kot perioda ure.

In če si dobro pogledal naslov teme je VHDL...

_________________
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
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.98
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Tor Mar 06, 2012 11:27 am    Naslov sporočila:   Odgovori s citatom

davide: ja saj sem ti napisal tocno to stiri poste visje. Samo zamenjaj 'd123 z 'd17, ali ti moram to jaz narediti?

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Tor Mar 06, 2012 12:19 pm    Naslov sporočila:   Odgovori s citatom

dobro, bom videl, če mi bo spustil Altium skozi...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Tor Mar 06, 2012 1:15 pm    Naslov sporočila:   Odgovori s citatom

chaos je napisal/a:
davide: ja saj sem ti napisal tocno to stiri poste visje. Samo zamenjaj 'd123 z 'd17, ali ti moram to jaz narediti?

LP!


Koda:
reg count;
      reg [4:0] counter;

      always @ (negedge clk) begin
        if (SET) count <= 1'b1;
        else if (counter == 5'd18) begin
           counter <= 1'b0;
           rst <= 1'b0;
           end
      end

      always @ (negedge clk) begin
        if (count) begin
           rst = 1'b1;
           counter <= counter + 5'd1;
           sout = tmp[16];
              tmp = tmp << 1;
           end
        else if (SET) begin
           counter <= 5'd0;
           rst <= 1'b0;
           end
      end

poskušal sem na takšen način, vendar po grafu oz. simulaciji sodeč ne deluje, ne vem kje sem ga polomil (ne shifta registra tmp pa tudi na sout ne pošilja ničesar??)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tozir
Član
Član



Pridružen-a: Pon 17 Mar 2008 19:10
Prispevkov: 187
Aktiv.: 0.96
Kraj: Celje

PrispevekObjavljeno: Tor Mar 06, 2012 3:41 pm    Naslov sporočila:   Odgovori s citatom

Sicer ne poznam Verilog-a, ampak kakšen imaš pa test bench? Imaš Altium 09 ali 10?
_________________
http://www.rielektronika.comule.com/
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.98
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Tor Mar 06, 2012 4:44 pm    Naslov sporočila:   Odgovori s citatom

davide je napisal/a:

Koda:

                            reg count;
      reg [4:0] counter;

      always @ (negedge clk) begin
        if (SET) count <= 1'b1;
        else if (counter == 5'd18) begin
           counter <= 1'b0;
           rst <= 1'b0;
           end
      end

      always @ (negedge clk) begin
        if (count) begin
           rst = 1'b1;
           counter <= counter + 5'd1;
           sout = tmp[16];
              tmp = tmp << 1;
           end
        else if (SET) begin
           counter <= 5'd0;
           rst <= 1'b0;
           end
      end

poskušal sem na takšen način, vendar po grafu oz. simulaciji sodeč ne deluje, ne vem kje sem ga polomil (ne shifta registra tmp pa tudi na sout ne pošilja ničesar??)


Ok.

Prvo, uporabljaj primeren assignment operator (<= / =) Tukaj moras povsod uporabiti non-blocking (torej <=).
Drugo, v prvem stavku imas counter <= 0, verjetno si mislil count?
Tretje, spet imas rst v obeh always stavkih.
Zakaj negedge?
Kaj naj bi delal rst?
Kaj je tmp?

Ce je to cela koda, manjka vsaj assignment za tmp, da bo sout sploh lahko kaj kazal. Kaj pa napake? Kaj ti javi prevajalnik?

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Tor Mar 06, 2012 4:54 pm    Naslov sporočila:   Odgovori s citatom

Bom še popravil, glede ostalega pa:

rst je izhod, ki se postavljen med pošiljanjem bitov, ko se pošiljanje konča oz. ko števec doseže 17 se postavi na 0.
negedge zato, ker si potenciometer ob pozitivni uri jemlje podatke,
tmp je register, zgoraj še menja temp = par_load, v par_load pa naložimo 17 bitov, ter jih potem serijsko pošljemo.
To je vse, upam da mi nekako uspe
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Tor Mar 06, 2012 4:55 pm    Naslov sporočila:   Odgovori s citatom

rst te je verjetno zmotil ja, ker ni mišljen kot reset števca, vendar rst je postavljen da potencioemter bere vse bite
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
patricio
Član
Član



Pridružen-a: Čet 29 Nov 2012 21:40
Prispevkov: 10
Aktiv.: 0.07
Kraj: Moravce

PrispevekObjavljeno: Tor Feb 12, 2013 12:19 pm    Naslov sporočila:   Odgovori s citatom

Osnove VHDL-a in nekaj primerov prakticnih dizajnov:
http://www.fri.uni-lj.si/file/84055/vhdl_zapiski.pdf
Nazaj na vrh
Odsoten 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
Stran 2 od 2

 
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