VHDL - jak zrobic 8-bitowy rejestr

J.F:

'mietcy' zwykle lubia sprawdzic, co wpisali w hardware :)

przed laty poswiecilem 2 meetingi tlumaczac programistom, ze moga sobie przechowywac dane wpisane do rejestrow sterujacych [a byly ich dziesiatki] w software, bo mnie wyprowadzenie tych danych pozera logike, a fpga bylo male; w koncu zrobilem wlasnie takie oszustwo, trzymalem wartosci rejestrow rowniez w ramie i stamtad byl odczyt ustawien;

JA

Reply to
JA
Loading thread data ...

Zerknij na CPLD Altery o nazwie MAX II - duzo do wyboru i cena niezla.

Reply to
Pszemol

Pszemol:

mialem na mysli rejestry sterujace ustawiane przez software, ktorych hardware nie moze zmienic; chyba, ze taki rejestr moze byc zapisywany przez kilka niezaleznych kontrolerow, ale to chyba nie jest przypadek o ktorym pisal autor watku;

JA

Reply to
JA

Nie, tak jak pisalem to bedzie kontroler LCD. W sumie po zastanowieniu moge w ogole zrezygnowac w wiekszosci przypadkow z RW i zostawic wylacznie mozliwosc zapisu rejestru, bez mozliwosci jego pozniejszego odczytu, szczegolnie jesli to spowoduje, ze zmieszcze sie w tanszym CPLD.

Reply to
T.M.F.

Oczywiscie spowoduje mniejsza ilosc wymaganych LE, a to nie zawsze oznacza mniejszy scalak: to czy uzyjesz 200 czy 220 nie spowoduje przeciez mozliwosci przesiadki z chipu 256 na chip 128, prawda ? A wiec proponuje zrobic uklad minimalny, sprawdzic w jakiej kostce sie miescisz i potem jak Ci zostanie sporo miejsca to mozesz dodac odczyt czy inne "wodotryski", bo wtedy niewiele to kosztuje...

Ale mowia ze dobre zasady tworzenia projektow wymagaja, aby nie zuzyc wiecej niz 70% komorek, aby bylo za miesiac miejsce na ewentualna poprawke jakiegos bledu wykrytego w fazie testow koncowych lub jakies zapomniane feature, ktore mogloby sie nie zmiescic w scalaku wypelnionym juz na poczatku po same brzegi...

Reply to
Pszemol

To oczywiste:)

Pewnie masz racje, tyle, ze jako zupelnie poczatkujacy z VHDLu napisze takie babole, ze po jakims czasie lapiac sie za glowe latwiej bedzie mi to napisac od nowa:)

Reply to
T.M.F.

Wez sie tak nie doluj bez potrzeby bo przeciez nie swieci garnki lepia :-)

Reply to
Pszemol

Ok, to prosze o pomoc, mam taki oto kod (to ma byc 20-bitowy licznik, zerowany synchronicznie):

entity counter20 is port(a : out bit_vector (19 downto 0); clk : in bit; rst : in bit); end counter20;

architecture behv of counter20 is

signal a_tmp: bit_vector(19 downto 0);

begin process(clk, rst) begin if rst = '0' and clk='1' and clk'event then a_tmp <= (a_tmp'range => '0'); elsif clk='1' and clk'event then a_tmp <= a+1; end if; end process;

a <= a_tmp; end behv;

Problem w tym, ze na linii: clk='1' and clk'event then a_tmp <= a+1;

wywala mi blad: ERROR:HDLParsers:808 - Line ... + can not have such operands in this context. Ok, przypuszczam, ze to problem z niewlasciwym typem bit_vector, ale jak go zamienie na std_logic_vector to okazuje sie, ze takiego nie mam, mimo, ze zainkludowalem chyba wszystkie standardowe biblioteki: library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_textio.all; use IEEE.std_logic_arith.all; use IEEE.numeric_bit.all; use IEEE.numeric_std.all; use IEEE.std_logic_signed.all; use IEEE.std_logic_unsigned.all; use IEEE.math_real.all; use IEEE.math_complex.all;

library STD; use STD.textio;

Oczywiscie srodowisko to Xilinxowe WebISE 9.1 z SP1. Co robie nie tak? BTW. Pomijajac ten blad to czy reszta implementacji tego licznika jest ok?

Reply to
T.M.F.

T.M.F:

calkiem Ci nie pomoge, bo na codzien uzywam verolog, a vhdl znam biernie, rozumiem, co czytam, ale aby napisac cokolwiek musze zagladac do ksiazek; nie znosze vhdl za jego maniakalne czepianie sie typow, co chyba jest zrodlem klopotow w Twoim przykladzie;

------- tu chyba powinno byc a_tmp <= a_tmp + 1; ------

bardziej elegancko chyba bedzie:

if RISING_EDGE (CLK) THEN if (rst = '0') THEN a_tmp <= (a_tmp'range => '0'); else a_tmp <= a_tmp + 1; end if; end if;

chodzi mi wylacznie o 'strukture' "if-else" a nie o poprawnosc jezykowa, bo vhdl jest mi obcy, rowniez ideowo :)

mysle, ze jak w googlach napiszesz "vhdl counter" to bez problemow znajdziesz setki przykladow;

JA

Reply to
JA

"T.M.F." napisal:

pewnie mu się nie podoba że w dwóch odgałęzieniach odpytujesz clk'event (niby powinien to skrócić ale...) - najprościej przegrupować to wszystko tak aby zbocze było badane tylko raz:

if clk='1' and clk'EVENT then if rst='0' then a_tmp <= (others=>'0'); elsif a_tmp<=a+1; Jeśli korzystasz z ISE Xilinxa (i choć odrobinę znasz angielski) poszukaj przykładów - są pogrupowane wg. funkcji - gotowe liczniki, rejestry przesuwne, przykłady deklaracji funkcji - co tylko dusza zapragnie. Wystarczy skopiować :) Gdzie dokładnie są schowane - niestety nie mogę podpowiedzieć bo na kompie z którego pisze nie mam zainstalowanego ISE - coś mi się tylko plącze po pamięci że za każdym razem kiedy ich potrzebuje muszę się naszukać bo z przyzwyczajenia zaczynam od przekopywanie helpa a one mają własny dział (templates czy jakoś tak) :) GRG

Reply to
Gregor

Gregor napisał(a):

Nie, zdecydowanie nie podoba mu sie dodawanie:

  • can not have such operands in this context.

Jestem prawie pewien, ze na typie bit_vector nie moge przeprowadzac takiej operacji. Problem w tym, ze nie wiem co zaladowac, zeby miec typ std_logic_vector, laduje juz wszystkie moduly i nic.

Reply to
T.M.F.

T.M.F. napisał(a):

Hm, z mojej pobieżnej znajomości VHDL wynika że: a) wektor a jest wektorem wyjściowym co oznacza, że nie może być argumentem dodawania, bo nie można go "odczytać". Trzeba zmienić, o ile dobrze pamiętam, na inout. b) propnowałbym użycie wewnątrz procesu zmiennej typu unsigned i liczenie na niej, a potem konwersję do typu bit_vector juz na zewnątrz procesu

Marcin

Reply to
Marcin Urbanowicz

"T.M.F." napisal:

Oczywiście masz racje - zasugerowałem się własnym błędem i nie przeczytałem dokładnie komunikatu :( Pod adresem :

formatting link
znajdziesz parę rożnych liczników - powinny być syntezowalne - zrobiłem na nich oscyloskop :) Przy ich konstrukcji nie zastosowałem operatora "+" - krócej trwało zmajstrowanie odpowiedniej funkcji logicznej niż szukanie "dlaczego ten $%^#$% nie potrafi dodawać" :) GRG

Reply to
Gregor

Gregor napisał(a):

Dzieki. Co prawda z przykladami z twojej strony mialem pewien klopot, ale nieoczekiwanie zadzialalo: library ieee; use ieee.std_logic_1164.all, ieee.numeric_std.all;

w efekcie mam juz typ std_logic_vector. Okazuje sie, ze na nim operacja dodawania jest juz poprawna i moj projekt sie syntetyzuje :) BTW. Wczesniej mialem linie: library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; i o dziwo typ std_logic_vector byl nieznany. Czyzby ISE rozroznialo duze i male litery? Jak dla mnie magia:) No nic, biore sie za symulacje.

Reply to
T.M.F.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.