Skocz do zawartości
agamor

[FPGA] rejestr przesuwny

Pomocna odpowiedź

Witam,

Analizuje jeszcze raz kurs FPGA na Forbot, wrocilam do rejestru przesuwnego, chcialam zmienic ten program aby diody przesuwaly sie w lewo oraz aby wykorzystane zostaly dwa bajty poniewaz na mojej pytce jest 16 bitow. Niestety nie udaje mi sie to.

Czy moze ktos z czytelnikow podac jakies wskazowki co jest zle?

dziekuje i pozdrawiam

schiebenregister.thumb.PNG.183eb6997a1c93d9de83912ba4cddf87.PNG

Udostępnij ten post


Link to post
Share on other sites
Witam,

Analizuje jeszcze raz kurs FPGA na Forbot, wrocilam do rejestru przesuwnego, chcialam zmienic ten program aby diody przesuwaly sie w lewo oraz aby wykorzystane zostaly dwa bajty poniewaz na mojej pytce jest 16 bitow. Niestety nie udaje mi sie to.

Czy moze ktos z czytelnikow podac jakies wskazowki co jest zle?

dziekuje i pozdrawiam

Cześć,

zmień linie 42 (entity schiebenlinks) z:

signal schiebenlinks : STD_LOGIC_VECTOR(15 downto 0) := X"01";

na :

signal schiebenlinks : STD_LOGIC_VECTOR(15 downto 0) := X"0001";

Powinno pomóc, daj znać, czy działa?

BTW: Kod wklejaj tekstowo w tagu "Code", ułatwia to odpowiedź (z obrazka nie daje się skopiować kod).

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

dziekuje za odpowiedz, jednak znowu cos jest nie tak 😥

pozdrawiam

schiebenr.thumb.PNG.acfbca4cc99b77bddf8d65cf9279313c.PNG

Udostępnij ten post


Link to post
Share on other sites
dziekuje za odpowiedz, jednak znowu cos jest nie tak 😥

pozdrawiam

Cześć,

to zrób to tak (podstaw wartość binarnie):

signal schiebenlinks : STD_LOGIC_VECTOR(15 downto 0) := "0000000000000001";

Teraz twierdził, że podstawienie po prawej ma 17 bitów (jest dłuższe niż zadeklarowane 16 bitów w def. po lewej. Binarnie powinno działać (15 zer i jedynka).

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

niestety bledy sa takie same przy liczbie binarnej.

Nie jestem pewna czy dobrze wpisalam liczby np. 100MHz to maksymalna wartosc licznika

100 000 000 powinno byc dobrze.

Teraz nie wiem sygnal licznika napisalam 128 bitow a w kursie jest 25 bitow jest tez napisane ze 25 bitow odpowiada wartosci 33 mln.

Moze wlasciwie gdzies tutaj jest blad.

dziekuje za pomoc

Unt.thumb.PNG.e9c365656ac18db9050878271cf8d9b7.PNG

Udostępnij ten post


Link to post
Share on other sites
niestety bledy sa takie same przy liczbie binarnej.

Nie jestem pewna czy dobrze wpisalam liczby np. 100MHz to maksymalna wartosc licznika

100 000 000 powinno byc dobrze.

Teraz nie wiem sygnal licznika napisalam 128 bitow a w kursie jest 25 bitow jest tez napisane ze 25 bitow odpowiada wartosci 33 mln.

Moze wlasciwie gdzies tutaj jest blad.

dziekuje za pomoc

Cześć,

wklej cały kod tekstowo do postu do tagów code , bo te obrazki nie chcą się otwierać prawidłowo, wtedy będzie łatwiej.

Pozdrawiam

Hej,

no teraz otworzył mi się po długim oczekiwaniu obrazek w drugim twoim poście:

to podstawienie :

signal schiebenlinks : STD_LOGIC_VECTOR(15 downto 0) := X"0001";

było poprawne. Binarne też . Błąd był zlokalizowany w linii:

schiebenlinks <= schiebenlinks(0) & schiebenlinks(15 downto 0);

Powinno być:

schiebenlinks <= schiebenlinks(0) & schiebenlinks(15 downto 1);

Sorry, że od razu tego nie zauważyłem 😉 Piewszt błąd był w linii:

signal schiebenlinks : STD_LOGIC_VECTOR(15 downto 0) := X"01";

Czyli łącznie były 2 błędy :->

Jesli możesz to na przyszłość wklejaj kod tekstowo, bo obrazki utrudniają wymianę informacji.

Pozdrawiam

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Czesc,

rzeczwiscie program zadzialal bez zarzutow.

Przepraszam nie zrozumialam z tym wklejaniem ale teraz juz ok.

dziekuje 🙂

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity schiebenlinks is

Port ( clk : in STD_LOGIC;

led : out STD_LOGIC_VECTOR (15 downto 0));

end schiebenlinks;

architecture Behavioral of schiebenlinks is

signal schiebenlinks :STD_LOGIC_VECTOR (15 downto 0):= B"0000000000000001";

constant counter_limit :integer:= 100000000;

signal counter :STD_LOGIC_VECTOR (127 downto 0);

begin

zahlen_schieben : process (CLK)

begin

if rising_edge (CLK) then

if (counter = counter_limit) then

counter <= (others =>'0');

schiebenlinks <= schiebenlinks(0) & schiebenlinks(15 downto 1);

else

counter <= counter +1;

end if;

end if;

end process zahlen_schieben;

led <= schiebenlinks;

end Behavioral;

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
Czesc,

rzeczwiscie program zadzialal bez zarzutow.

Przepraszam nie zrozumialam z tym wklejaniem ale teraz juz ok.

dziekuje 🙂

Hej teraz super, tylko na przyszlość w edytorze postu u góry masz klawisz klikasz raz przed wklejeniem kodu i raz po zakończeniu - wtedy tekst programu będzie ładnie wyróżniony i sformatowany 😃

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

super teraz beda wiadziala 🙂

dziekuje

a jeszcze chcialam sie zapytac, czemu tak naprawde musi byc tam ta 1-ka a nie 0?

❓

Udostępnij ten post


Link to post
Share on other sites
super teraz beda wiadziala 🙂

dziekuje

a jeszcze chcialam sie zapytac, czemu tak naprawde musi byc tam ta 1-ka a nie 0?

❓

Cześć,

żeby 1-nka 'krążyła' w naszym rejestrze, wartość najmniej znaczącego bitu jest kopiowana na najbardziej znaczący - to takie "zapętlenie" rejestru. jest to realizowane w linii:

schiebenlinks <= schiebenlinks(0) & schiebenlinks(15 downto 1); 

schiebenlinks(0) - to wartość najmniej znaczącego bitu (skrajny prawy)

przesuwamy go na skrajny lewy (najbardziej znaczący bit) i konkatenujemy (łączymy) z resztą zawartości rejestru, ale już bez tego bitu - stąd zakres indeksów od 15 do 1 (a nie zero).

----------------------------

w VHDL są instrukcje, które wykonują przesunięcia (różne rodzaje). Jakbyś chciała to jako ćwiczenie możesz sobie przeanalizować kod rejestru przesuwnego do którego (z lewej strony można wprowadzać dane przyciskiem (wejście D). Zakładamy, że zegar CLK ma niedużą częstotliwość, tak aby było widać na LED'ach przesuwanie. Ale kod, który Ty ćwiczyłaś jest prostszy 😉

Oto kod VHDL rejestru przesuwnwgo:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift_register_top is
   Port ( CLK : in  STD_LOGIC;
          D   : in  STD_LOGIC;
          LED : out STD_LOGIC_VECTOR(7 downto 0));
end shift_register_top;

architecture Behavioral of shift_register_top is
   signal clock_div : STD_LOGIC_VECTOR(4 downto 0);
   signal shift_reg : STD_LOGIC_VECTOR(7 downto 0) := X"00";
begin

   -- clock divider
   process (CLK)
   begin
       if (CLK'event and CLK = '1') then
           clock_div <= clock_div + '1';
       end if;
   end process;

   -- shift register
   process (clock_div(4))
   begin
       if (clock_div(4)'event and clock_div(4) = '1') then
           shift_reg(7) <= D;
           shift_reg(6) <= shift_reg(7);
           shift_reg(5) <= shift_reg(6);
           shift_reg(4) <= shift_reg(5);
           shift_reg(3) <= shift_reg(4);
           shift_reg(2) <= shift_reg(3);
           shift_reg(1) <= shift_reg(2);
           shift_reg(0) <= shift_reg(1);
       end if;
   end process;

   -- hook up the shift register bits to the LEDs
   LED <= shift_reg;

end Behavioral;

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Chętnie przeanalizuje twój przykład.

Dziękuje za wytłumaczenie 🙂

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Rejestr przesuwny, czyli inaczej rejestr szeregowo-równoległy, zwany z angielskiego SIPO (Serial In Parallel Out) lub inaczej: shift register.

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

entity shift_register_top is 
   Port ( CLK : in  STD_LOGIC; 
          D   : in  STD_LOGIC; 
          LED : inout STD_LOGIC_VECTOR(7 downto 0)); 
end shift_register_top; 

architecture Behavioral of shift_register_top is 
begin 

   process (CLK) 
   begin 
       if rising_edge(CLK) then 
           LED <= D&LED(7 downto 1); -- przesuw w prawo
           LED <= LED(6 downto 0)&D; -- przesuw w lewo
       end if; 
   end process; 

end Behavioral;

I już!

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...