|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Pon Mar 05, 2012 10:21 pm Naslov sporočila: |
|
|
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 |
|
Nazaj na vrh |
|
|
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.98 Kraj: Zagorje ob Savi
|
Objavljeno: Pon Mar 05, 2012 10:48 pm Naslov sporočila: |
|
|
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 |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Pon Mar 05, 2012 11:37 pm Naslov sporočila: |
|
|
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 |
|
Nazaj na vrh |
|
|
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.98 Kraj: Zagorje ob Savi
|
Objavljeno: Tor Mar 06, 2012 8:58 am Naslov sporočila: |
|
|
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 |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Tor Mar 06, 2012 9:18 am Naslov sporočila: |
|
|
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?? |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9406 Aktiv.: 42.36 Kraj: Kranj - struževo
|
Objavljeno: Tor Mar 06, 2012 9:42 am Naslov sporočila: |
|
|
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 |
|
Nazaj na vrh |
|
|
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.98 Kraj: Zagorje ob Savi
|
Objavljeno: Tor Mar 06, 2012 11:27 am Naslov sporočila: |
|
|
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 |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Tor Mar 06, 2012 12:19 pm Naslov sporočila: |
|
|
dobro, bom videl, če mi bo spustil Altium skozi... |
|
Nazaj na vrh |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Tor Mar 06, 2012 1:15 pm Naslov sporočila: |
|
|
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 |
|
|
tozir Član
Pridružen-a: Pon 17 Mar 2008 19:10 Prispevkov: 187 Aktiv.: 0.96 Kraj: Celje
|
Objavljeno: Tor Mar 06, 2012 3:41 pm Naslov sporočila: |
|
|
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 |
|
|
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.98 Kraj: Zagorje ob Savi
|
Objavljeno: Tor Mar 06, 2012 4:44 pm Naslov sporočila: |
|
|
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 |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Tor Mar 06, 2012 4:54 pm Naslov sporočila: |
|
|
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 |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Tor Mar 06, 2012 4:55 pm Naslov sporočila: |
|
|
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 |
|
|
patricio Član
Pridružen-a: Čet 29 Nov 2012 21:40 Prispevkov: 10 Aktiv.: 0.07 Kraj: Moravce
|
|
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: 47 dni
Powered by phpBB © 2001, 2005 phpBB Group
|