| Author |
Message
|
brt32 Poziom 5

Joined: 19 Mar 2005 Posts: 12
|
#1
05 Dec 2006 16:46 Krążąca jedynka - projekt |
|
|
|
Witam.
Wiecie moze jak w najprostszy sposob napisac w VHDL'u "krazaca jedynke"? Wiem, ze ma to byc rejestr i dekoder... Jednak nie wiem jak to napisac.
Ogolnie mam do zrobienia projekt na plytce Spartan 3 - mam wybrac 8 czestotliwosci, na plytce jest kwarc. Najpierw jedynka ma przejsc przez wszystkie 8 diod z pierwsza czestotliwoscia, pozniej z druga, itd. - coraz szybciej. Po tym, jak przejdzie te 8 czestotliwosci nastepuje zliczanie od poczatku... I tak w nieskonczonosc.
Ma ktos jakis pomysl?
Z gory dziekuje za pomoc.
|
|
| Back to top |
|
 |
pndemon Poziom 17

Joined: 05 Jan 2005 Posts: 411 Location: Poznań
|
#2
05 Dec 2006 17:31 Re: Krążąca jedynka - projekt |
|
|
|
musisz stworzyć dzielnik częstotliwości o programowanej podziałce, coś jak:
| Code: |
entity trigering_freq_gen is port(
tr_clk: in std_logic;
data_bus: in std_logic_vector(3 downto 0);
rst: in std_logic;
clk: inout std_logic);
end entity trigering_freq_gen;
architecture arch of trigering_freq_gen is
signal count: integer range 0 to 10000;
signal rst_sig: std_logic;
begin
gen: process (tr_clk, rst_sig, rst, data_bus)
begin
if rising_edge(tr_clk) then
if (rst='1') then
clk <= '0';
count <= 0;
elsif (rst_sig = '1') then
count <= 0;
clk <= not clk;
else
count <= count + 1;
end if;
end if;
end process gen;
rst_sig <= '1' when count >= (dev(conv_integer(data_bus))) else
'0';
end architecture arch; |
gdzie data_bus jest indeksem tablicy dev
| Code: |
type arr is array (0 to 10) of integer;
constant dev: arr:=(9999, 999, 499, 332, 249, 199, 168, 142, 124, 110, 99); |
ten dzielnik generuje sygnał zegara od 1k do 100k z krokiem co 10k
czyli dla data_bus=0 jest 1k, dla 1 jest 10k itd.
a do krążącej jedynki dajesz np. maszynę stanu, masz od razu załatwiony rejestr i dekoder
czyli jakoś tak:
| Code: |
architecture arch of bleble
type state is (jeden dwa, trzy, cztery, itd..);
signal next_state, present_state: state;
begin
comb: process (present_state)
begin
case present_state is
when jeden =>
led <= "00000001";
next_state => dwa;
when dwa =>
led <= "00000010";
when itd....
end case;
end process comb;
synchro: process(clk)
begin
if rising_edge(clk) then
present_state <= next_state;
end if;
end process synchro;
end architecture arch;
|
|
|
| Back to top |
|
 |
brt32 Poziom 5

Joined: 19 Mar 2005 Posts: 12
|
#3
05 Dec 2006 22:23 Re: Krążąca jedynka - projekt |
|
|
|
Dzieki za szybka odpowiedz :)
Sprobuje to wszystko poskladac i jak beda jakies problemy to jeszcze napisze :)
|
|
| Back to top |
|
 |
Google

|
#
05 Dec 2006 22:23 |
|
|
|
|
|
| Back to top |
|
 |
griva Poziom 14

Joined: 14 Sep 2005 Posts: 199 Location: Krakow
|
#4
08 Dec 2006 11:14 Re: Krążąca jedynka - projekt |
|
|
|
pndemon: ten Twoj kod to chyba z konkursu jak napisac hello world w 300 liniach kodu :PPP
masz internalne clocki i wszystki najgorsze praktyki jakie sie da
przeciez krazaca jedynka to jest cos co jest na dzien dobry w cyfrowce, chcesz gosciowi wmowic ze nie da sie tego zrobic bez automatu??!!!
ja bym to zrobil tak:
process(clk)
begin
if reset='1' then
jhonson <= "0001";
elsif rising_edge(clk) then
if jhonson(3)='1' then
jhonson <= "0001";
else
jhonson <= jhonson(2 downto 0) & '0';
end if;
end if;
end process;
|
|
| Back to top |
|
 |
pndemon Poziom 17

Joined: 05 Jan 2005 Posts: 411 Location: Poznań
|
#5
08 Dec 2006 11:33 Re: Krążąca jedynka - projekt |
|
|
|
Wcale nie mówiłem, że nie da się tego inaczej zrobić, poza tym nie podoba mi się że w twoim procesie tak na prawdę nie występuję sygnał clk, a ty masz nadzieję, że to zadziała, otóż niektóre programy do syntezy/symulacji pomijają listy czułości i co wtedy?? Ja np. uczyłem się że coś takiego jest b. złą praktyką.
Co do
| Quote: |
| masz internalne clocki i wszystki najgorsze praktyki jakie sie da |
to nie wiem za bardzo czego się to tyczy??
|
|
| Back to top |
|
 |
Google

|
#
08 Dec 2006 11:33 |
|
|
|
|
|
| Back to top |
|
 |
griva Poziom 14

Joined: 14 Sep 2005 Posts: 199 Location: Krakow
|
#6
08 Dec 2006 13:22 Re: Krążąca jedynka - projekt |
|
|
|
| pndemon wrote: |
Wcale nie mówiłem, że nie da się tego inaczej zrobić, poza tym nie podoba mi się że w twoim procesie tak na prawdę nie występuję sygnał clk, a ty masz nadzieję, że to zadziała,
|
fakt byl bug juz poprawilem
Dodano po 3 [minuty]:
| pndemon wrote: |
Co do
| Quote: |
| masz internalne clocki i wszystki najgorsze praktyki jakie sie da |
to nie wiem za bardzo czego się to tyczy?? |
sygnal clk, jesli dobrze zrozumialem tworzysz zegar dwojka liczaca i a potem tymze zegarem clockujesz drugi modul, tak??
|
|
| Back to top |
|
 |
pndemon Poziom 17

Joined: 05 Jan 2005 Posts: 411 Location: Poznań
|
#7
11 Dec 2006 18:29 Re: Krążąca jedynka - projekt |
|
|
|
| Quote: |
sygnal clk, jesli dobrze zrozumialem tworzysz zegar dwojka liczaca i a potem tymze zegarem clockujesz drugi modul, tak?? |
Rozumiem, że mówisz o tym jak tworzony jest sygnał clk. Niestety nie znam innego sposobu na dzielnik częstotliwości jak tylko licznik, który zlicza do połowy zadanej częstotliwości, a potem zmienia sygnał clk na not clk.
Ten moduł działa bez problemów przy 20 MHz, ale jeśli sądzisz, że jest 'nie ok' to z przyjemnością dowiem się o Twojej propozycji, w końcu nadal się uczę tego języka i wszelkie sugestie mile widziane.
|
|
| Back to top |
|
 |
griva Poziom 14

Joined: 14 Sep 2005 Posts: 199 Location: Krakow
|
#8
11 Dec 2006 19:00 Re: Krążąca jedynka - projekt |
|
|
|
| pndemon wrote: |
| Quote: |
sygnal clk, jesli dobrze zrozumialem tworzysz zegar dwojka liczaca i a potem tymze zegarem clockujesz drugi modul, tak?? |
Rozumiem, że mówisz o tym jak tworzony jest sygnał clk. Niestety nie znam innego sposobu na dzielnik częstotliwości jak tylko licznik, który zlicza do połowy zadanej częstotliwości, a potem zmienia sygnał clk na not clk.
Ten moduł działa bez problemów przy 20 MHz, ale jeśli sądzisz, że jest 'nie ok' to z przyjemnością dowiem się o Twojej propozycji, w końcu nadal się uczę tego języka i wszelkie sugestie mile widziane. |
nie tworzysz nowego zegara, caly projekt powinien chodzic na jednym zegarze (oczywiscie nie zawsze jest to mozliwe) natomiast ten clk ktory Ty tworzysz dwojka liczaca zamieniasz na enable.
|
|
| Back to top |
|
 |
pndemon Poziom 17

Joined: 05 Jan 2005 Posts: 411 Location: Poznań
|
#9
11 Dec 2006 19:30 Re: Krążąca jedynka - projekt |
|
|
|
| Quote: |
| nie tworzysz nowego zegara |
no a jak jest na płytce na 50MHz, to i tak musisz zrobić dzielnik
| Quote: |
| caly projekt powinien chodzic na jednym zegarze |
nie wiem jak to się ma do jednego z założeń projektowych, że częstotliwość mrugania ma się zmieniać
| Quote: |
| natomiast ten clk ktory Ty tworzysz dwojka liczaca zamieniasz na enable. |
mógłbyś to rozwinąć bo nie wiem za bardzo o co chodzi ;)
|
|
| Back to top |
|
 |
Google

|
#
11 Dec 2006 19:30 |
|
|
|
|
|
| Back to top |
|
 |
griva Poziom 14

Joined: 14 Sep 2005 Posts: 199 Location: Krakow
|
#10
12 Dec 2006 08:05 Re: Krążąca jedynka - projekt |
|
|
|
| pndemon wrote: |
| Quote: |
| nie tworzysz nowego zegara |
no a jak jest na płytce na 50MHz, to i tak musisz zrobić dzielnik
| Quote: |
| caly projekt powinien chodzic na jednym zegarze |
nie wiem jak to się ma do jednego z założeń projektowych, że częstotliwość mrugania ma się zmieniać
| Quote: |
| natomiast ten clk ktory Ty tworzysz dwojka liczaca zamieniasz na enable. |
mógłbyś to rozwinąć bo nie wiem za bardzo o co chodzi ;) |
jesli masz za duzy zegar wejsciowy to uzywasz dcm-a do podzielenia tej wartosci np przez 2 i masz ladny zegar.
generalnie metoda enabli jest starsza od fpga, zrob sobie counter podlacz jedno z wyjsci do en przerzutnika przesymuluj i zajarzysz.
poszukaj tez cos na temat detektor zbocza (poszukaj moich postow - nie ma ich duzo- i juz gdzies rozpisywalem)
internalne clocki rozwala Ci projekt poniewaz tworzysz w ten sposob asynchroniczny projekt (chyba ze jestes w tym dobry ;-) ).
pamietaj tez ze dedykowanych linii zegarowych jest malo, do tego kazdy wykryty internal obkladanyh jest buforem bufg zeby zmniejszyc skew(zalezy tez od syntezera) ktorych np w virtexie I bylo tylko 4.
poczytaj logi, stawiam piwo ze router napisal Ci ze masz low-skew lub tez zroutowal zegar niededykowana linia
|
|
| Back to top |
|
 |