Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Nie działający sumator dwóch rejestrów 4 bitowych

03 Lip 2011 03:40 2353 10
  • Poziom 8  
    Witam wszystkich,
    próbuję zrobić projekt o następującej treści:
    Zaprojektować przy użyciu vhdl'a układ złożony z dwóch rejestrów i sumatora: o wejściu informacyjnym A(3:0); wejściach sterujących adres, enable, wpis i rst. Wyjściach Led(6:0) i Carry.
    Gdy rst ='1' wartość akumulatorów jest zerowana.
    Gdy adres = '0' liczba A wpisywana jest do rejestru A na narastajacym zboczu sygnału wpis;
    Gdy adres = '1' liczba A wpisywana jest do rejestru B na narastajacym zboczu sygnału wpis;
    Gdy enable jest ='1' to zawartość akumulatorów jest sumowana i wystawiana na wyświetlacz LED.
    Gdy enable ='0' na wyświetlaczu mają wyświetlić się 3 poziome kreski.

    A o to mój kod, który napisałem. Problem jest to, że albo mi nie działa dobrze sumator tych rejestrów albo mam coś nie tak z przekazaniem na wyświetlacz wyniku z sumatora. Te 3 poziome kreski wyświetlają mi się dobrze, niżej podam screena z symulacji.
    Nie działający sumator dwóch rejestrów 4 bitowych
    Cytat:
    ----------------------------------------------------------------------------------
    -- Company:
    -- Engineer:
    --
    -- Create Date: 16:49:28 07/02/2011
    -- Design Name:
    -- Module Name: s2r - Behavioral
    -- Project Name:
    -- Target Devices:
    -- Tool versions:
    -- Description:
    --
    -- Dependencies:
    --
    -- Revision:
    -- Revision 0.01 - File Created
    -- Additional Comments:
    --
    ----------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    ---- Uncomment the following library declaration if instantiating
    ---- any Xilinx primitives in this code.
    --library UNISIM;
    --use UNISIM.VComponents.all;

    entity s2r is
    Port ( AA : in STD_LOGIC_VECTOR (3 downto 0);
    Enable : in STD_LOGIC;
    Rst : in STD_LOGIC;
    Adr : in STD_LOGIC;
    Wpis : in STD_LOGIC;
    LED : out STD_LOGIC_VECTOR (6 downto 0);
    Carry : out STD_LOGIC);
    end s2r;

    architecture Behavioral of s2r is

    component sum4bit is
    Port ( A : in STD_LOGIC_VECTOR (3 downto 0);
    B : in STD_LOGIC_VECTOR (3 downto 0);
    Cin : in STD_LOGIC;
    Suma : out STD_LOGIC_VECTOR (3 downto 0);
    Cout : out STD_LOGIC);
    end component;

    signal QrA, QrB, Qsum, SumRej:STD_LOGIC_VECTOR (3 downto 0);
    signal Q0, Q1, clk, przeniesienie,s1 :STD_LOGIC;
    begin



    --DEMULTIPLESKER
    process (Adr, wpis)
    begin
    if Adr ='0' then Q0<=Wpis;
    elsif Adr ='1' then Q1<=Wpis;
    end if;
    end process;

    --REJESTR_A
    process (rst,clk)
    begin
    if rst='1' then QrA<="0000";
    elsif (clk'event and clk='1') then
    QrA<=AA;
    end if;
    end process;

    --Rejestr_B

    process (clk,rst)
    begin
    if rst ='1' then QrB<="0000";
    elsif (clk'event and clk = '1')then
    QrB<=AA;
    end if;
    end process;

    QQQ: sum4bit port map(A=>QrA,B=>QrB,cin=>s1,cout=>Carry,Suma=>Qsum);
    Qsum<=SumRej;

    process(SumRej,enable)
    begin
    if enable='0' then LED<="0110110";
    elsif enable='1' then
    case SumRej is
    WHEN "0000" => LED <= "1000000";
    WHEN "0001" => LED <= "1111100";
    WHEN "0010" => LED <= "0100100";
    WHEN "0011" => LED <= "0110000" ;
    WHEN "0100" => LED <= "0010110" ;
    WHEN "0101" => LED <= "0010010" ;
    WHEN "0110" => LED <= "0000010" ;
    WHEN "0111" => LED <= "1111000";
    WHEN "1000" => LED <= "0000000" ;
    WHEN "1001" => LED <= "0010000" ;
    WHEN "1010" => LED <= "0001000" ;
    WHEN "1011" => LED <= "0000011" ;
    WHEN "1100" => LED <= "1000110" ;
    WHEN "1101" => LED <= "0100001" ;
    WHEN "1110" => LED <= "0000110" ;
    WHEN OTHERS => LED <= "0001110" ;
    end case;
    end if;
    end process;

    end Behavioral;



    Proszę o pomoc z tym problemem.
    Z góry dziękuje
    Pozdrawiam
    skotix23
  • Poziom 30  
    Aż dziw, że Tobie w ogóle coś się wyświetla. Clk wisi w powietrzu, Q0 i Q1 sygnały widmo, przy Qsum<=SumRej; u Ciebie Qsum jest wyjściem sumatora, więc powinno być na odwrót.
    skotix23 napisał:
    Gdy adres = '0' liczba A wpisywana jest do rejestru A na narastajacym zboczu sygnału wpis;
    Gdy adres = '1' liczba A wpisywana jest do rejestru B na narastajacym zboczu sygnału wpis;

    Tą część masz źle, zrób Sobie detektor zbocza. Ale nie na rising_edge() czy 'event, tylko przerzutnik + prosta logika.
  • Poziom 8  
    Jestem w vhdl'u bardzo początkującym, więc za bardzo nie wiem jak to zrobić co mi podpowiedziałeś. Mógłbyś mnie bardziej jakoś nakierować na rozwiązanie mojego problemu?
    A co do wyświetlacza: jest prawidłowo zrobiony?

    Pozdrawiam
    skotix23
  • Poziom 30  
    skotix23 napisał:
    Jestem w vhdl'u bardzo początkującym, więc za bardzo nie wiem jak to zrobić co mi podpowiedziałeś. Mógłbyś mnie bardziej jakoś nakierować na rozwiązanie mojego problemu?

    Rozdział V: Tutoriale z Kompedium wiedzy na temat CPLD/FPGA. Tam znajdziesz tutoriale, które spokojnie rozruszają Twoje szare komórki. Jeśli pisałeś to sam, to masz jakieś pojęcie o podstawowej składni, więc Sobie poradzisz.

    Jeśli zarejestrowałeś się dzisiaj na forum, tylko ze względu żeby ktoś rozwiązał zadanie, to wiedz że obowiązuje tu: przyjemna lektura. Wiem, że to trochę okrutne na sam początek, ale ostatnio jest wysyp podobnych postów z "zadaniami z VHDLa". Więc bez dalszej inwencji własnej, nie udzielam pomocy. Jak poprawisz to co powiedziałem, to zobaczymy co się da poradzić.
  • Poziom 8  
    Dzięki za linka do tutoriala, za chwilę zabieram się za czytanie. Post wcześniej napisałeś mi bym użył przerzutnika, problem w tym, że w tym zadaniu nie mogę go używać. Jest inny sposób zgodny z treścią zadania by to zrobić?
    Pozdrawiam
    skotix23
    Poniżej przedstawiam treść zadania z schematem. Mam wszystko zrobione tak mi sie wydaje, lecz nie wiem jak poprawnie zapisać to by na wyświetlaczu pojawiała się suma z dwóch rejestrów.
    Nie działający sumator dwóch rejestrów 4 bitowych
  • Poziom 30  
    skotix23 napisał:
    Post wcześniej napisałeś mi bym użył przerzutnika, problem w tym, że w tym zadaniu nie mogę go używać. Jest inny sposób zgodny z treścią zadania by to zrobić?

    Sam skorzystałeś przerzutników (a raczej próbowałeś), jak masz podobną składnię: clk'event and clk='1' wstawiasz przerzutnik, układ synchroniczny, co dziwnego używasz clk, ale ja nie widzę żeby gdziekolwiek wchodził to Twojego modułu.
    Nie utrudniaj sobie życia, nie masz napisane wprost czego nie używać, a co możesz. Wykaż się odrobiną twórczości, a nie będą jakieś nakazy/zakazy Cię ograniczać. Bo ja nic w treści takiego nie widzę. A tak po za tym jak zrobisz kombinacyjnie, to i tak będzie to z definicji przerzutnik...
  • Poziom 8  
    W tym samym momencie dodaliśmy posty. Wyżej jest schemat tego projektu. Moim Clk jest odpowiednio Q0 oraz Q1 (tak mi się wydaje)
    pozdrawiam
    skotix23
  • Poziom 30  
    skotix23 napisał:
    W tym samym momencie dodaliśmy posty. Wyżej jest schemat tego projektu. Moim Clk jest odpowiednio Q0 oraz Q1 (tak mi się wydaje)

    Po pierwsze Twój (powtarzam się) clk wisi, nigdzie nie jest podłączony. Po drugie, masz niby wszytko podane (wielki rysunek). Równie dobrze mógłbyś zrobić schematic, czyli narysować (przerysować będzie odpowiednie) i wygenerować VHDLa. Widzę, że korzystasz z ISE (komentarze, symulacja), on takie coś potrafi zrobić i tylko sobie podejrzeć. Ale powiedz Swojemu nauczycielowi/profesowi, czy komu tam jeszcze, że jest to BAD DESIGN, podawać sygnały na wejścia zegarowe. Dlatego pisałem tu o detektorze zbocza.
  • Poziom 8  
    Właśnie próbuję wpisać zamiast Clk w rejestrze, odpowiednio do Rej1 Q0 a do Rej2 Q1 zamiast tego nieszczęsnego CLK. Mam nadzieję, że to pomoże.

    Zrobiłem tak jak jest pokazane poniżej i dalej nie wyświetla na LED dobrego wyniku.
    Cytat:
    --REJESTR_A
    process (rst,q0)
    begin
    if rst='1' then QrA<="0000";
    elsif (q0'event and q0='1') then
    QrA<=AA;
    end if;
    end process;


    A mógłbyś mi powiedzieć czy sumator rejestrów jest dobrze napisany?
    pozdrawiam
    skotix23
  • Poziom 2  
    Mam praktycznie, dokładnie ten sam problem. Siedzę już od nie wiem ilu godzin i nie potrafię napisać tego cholernego programu. Czy idzie to w jakiś normalny, prosty i zrozumiały sposób ogarnąć? Mam nadzieję, że ktoś byłby w stanie tutaj ten program jakoś dokończyć, ja również bardzo bym na tym skorzystał.
  • Poziom 8  
    sprawdziłem rejestry i okazało się, że były błędne. Teraz po przeróbce działają dobrze. Ostatnim moim problemem jest sumator owych rejestrów. Mógłby mi ktoś podpowiedzieć co w tej linijce kodu jest nie tak?
    Cytat:
    sumator1 : sum4bit port map(A=>QrA,B=>QrB,cin=>s1,cout=>Carry,Suma=>Qsum);


    z góry wielki dzięki.
    pozdrawiam
    skotix23