Reklama

Blogi, które czytam

Kategorie

Archiwum

2008

2007

2006

2005

2004

Stat4u

Stat4u

Komentarze do wpisów

Nieco spóźniony wpis z projektem

17.12.2006 - Niedziela - 14:52

Jakiś czas temu miałem termin oddania projektu układu opisanego w VHDL-u. Ponieważ do dyspozycji miałem tylko CPLD Xilinx XC95108, który bardzo pojemnym układem nie jest, program nie mógł być zbyt skomplikowany. Napisałem więc symulator taśmociągu z dwiema programowalnymi bramkami.

Większość opisu napisałem u siebie w domu, skompilowałem i przetestowałem oglądając przebiegi czasowe. Ale już na miejscu, w pracowni, okazało się, że trochę "przedobrzyłem". Nie wziąłem pod uwagę faktu, że układ nie poradzi sobie z tak skomplikowanym programem... Musiałem się wziąć za "odchudzanie"... W moich pierwotnych założeniach układ był zupełnie niezależny od zegara znajdującego się na płytce. Odpowiednie działania miały się wykonywać w momencie pojawienia się narastających zboczy sygnałów symulujących i programujących (to jest wciśnięć przypisku symulującego paczkę i przycisków programowania bramek). Niestety, w XC95108 można wykorzystać tylko trzy sygnały, które będą sprawdzane pod kątem wystąpienia zbocza (takie sprawdzanie jest możliwe tylko w przerzutniku synchronicznym na jego wejściu zegarowym). Ja potrzebowałem niestety co najmniej czterech takich sygnałów. Musiałem więc sobie darować tę możliwość i wykorzystać uzależnienie od zegara wewnętrznego, co jest nieco gorszym rozwiązaniem. Kolejnym problemem była ilość porównać dokonywanych w układzie. Komparatory wielobitowe szybko i skutecznie zżerają zasoby układu, przez co momentalnie straciłem możliwość "wgrania" opisu do tego układu. Musiałem podjąć kolejne kroki optymalizacyjne: łączenie czterobitowych wektorów w ośmiobitowe (dzięki temu nieco lepiej mogłem rozdysponować zasoby w poszczególnych makrokomórkach), minimalizacja ilości zmiennych wewnętrznych (zwalniałem przerzutniki), usunięcie sygnałów typu buffer (kolejne wolne przerzutniki) itd. Po odchudzeniu układ dawał się zaprogramować, ale stracił kilka fajnych bajerów, które miałem ochotę do niego wrzucić. Ważne, że wyrobiłem się w czasie (jako jeden z nielicznych) i nie muszę teraz stosować dalszego odchudzania ;-)

Oczywiście zamieszczam pełny kod opisu układu. Oczywiście w VHDL ;-)

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity sterownik is
port(
        WE, R, P0, P1, AKC: in std_logic;
        CLK: in std_logic;
        LED1, LED2: out std_logic_vector(7 downto 0));
end sterownik;

architecture urzadzenie of sterownik is

        function hex2led (hex: std_logic_vector(3 downto 0)) return std_logic_vector is
                variable s: std_logic_vector(7 downto 1);
                begin
                case hex is
                        when "0000" => s:= "1000000";
                        when "0001" => s:= "1111100";
                        when "0010" => s:= "0001001";
                        when "0011" => s:= "0011000";
                        when "0100" => s:= "0110100";
                        when "0101" => s:= "0010010";
                        when "0110" => s:= "0000010";
                        when "0111" => s:= "1111000";
                        when "1000" => s:= "0000000";
                        when "1001" => s:= "0010000";
                        when "1010" => s:= "0100000";
                        when "1011" => s:= "0000110";
                        when "1100" => s:= "1000011";
                        when "1101" => s:= "0001100";
                        when "1110" => s:= "0000011";
                        when "1111" => s:= "0100011";
                        when others => s:= "1010101";
                end case;
                return s;
        end hex2led;

        begin
        process(CLK, WE, AKC, P0, P1, R)
        variable B: std_logic_vector(7 downto 0) := "00000000";
        variable BS: std_logic_vector(7 downto 0);
        variable start: std_logic := '0';
        begin
                if R = '1' then
                        B := "00000000";
                        BS := "00000000";
                        LED1(0) <= '1';
                        LED2(0) <= '1';
                        start := '0';
                elsif CLK'event and CLK = '1' then
                        if P0 = '1' then BS(7 downto 4) := BS(7 downto 4) + 1;
                        elsif P1 = '1' then BS(3 downto 0) := BS(3 downto 0) + 1;
                        elsif AKC = '1' then start := '1';
                        elsif WE = '1' then
                                if B(7 downto 4) < BS(7 downto 4) then
                                        B(7 downto 4) := B(7 downto 4)+1;
                                        if B(7 downto 4) = BS(7 downto 4) then
                                                LED1(0) <= '0';
                                        end if;
                                elsif B(3 downto 0) < BS(3 downto 0) then
                                        B(3 downto 0) := B(3 downto 0)+1;
                                        if B(3 downto 0) = BS(3 downto 0) then
                                                LED2(0) <= '0';
                                        end if;
                                elsif B = BS then
                                        B := "00010000";
                                        LED1(0) <= '1';
                                        LED2(0) <= '1';
                                end if;
                        end if;
                end if;
                if start = '1' then
                        LED1(7 downto 1) <= hex2led(B(7 downto 4));
                        LED2(7 downto 1) <= hex2led(B(3 downto 0));
                else
                        LED1(7 downto 1) <= hex2led(BS(7 downto 4));
                        LED2(7 downto 1) <= hex2led(BS(3 downto 0));
                end if;
        end process;
end urzadzenie;

Testbencha zamieścić? ;-)

Słowa kluczowe: vhdl programowanie komputer linux

Komentarze

mih
Może jakaś ilustracja, zdjęcie, wykresik, cokolwiek? ;)
17.12.2006 20:44
Adres permanentny

tranx
To o tym gadałes wtedy w 523 ;P
17.12.2006 23:49
Adres permanentny

Krzysiek
mih: Mogą być przebiegi czasowe? ;-)
tranx: Tak, o tym gadałem ;-)
18.12.2006 20:34
Adres permanentny

Dodaj komentarz

Uzupełnij poniższe pola

Imię:

E-mail (opcjonalny, nie zostanie wyświetlony):

Strona WWW (opcjonalna):

Uwaga! Komentarze pojawią się dopiero po ich zaakceptowaniu. Zastrzegam sobie prawo do usuwania komentarzy obraźliwych wobec mnie i innych czytelników, komentarzy nic nie wnoszących do tematu oraz komentarzy będących typowym spamem.

© Krzysztof Sawicki