VHDL-kieli FPGA-suunnittelussa/4-bittinen siirtorekisteri
Wikikirjasto
[muokkaa] 4-bittinen siirtorekisteri
Siirtorekisterillä tarkoitetaan digitaalitekniikassa peräkkäin kytketyistä kiikuista koostuvaa järjestelmää, jossa rekisterin sisältö liikkuu kellotulon määräämässä tahdissa eteenpäin. 4-bittisessä siirtorekisterissä on neljä muistipaikkaa. Niiden tärkeä sovellus on sarjamuotoisen signaalin muuttaminen rinnakkaismuotoon ja päinvastoin.
[muokkaa] Rakenne & toteutus
Tiedon syöttäminen rekisteriin ja sen lukeminen voidaan toteuttaa eri tavoilla. On olemassa SIPO-rekistereitä (serial-in parallel-out), SISO-rekistereitä (serial-in serial-out), PIPO-rekistereitä (parallel-in parallel-out) ja PISO-rekistereitä (parallel-in serial-out). Jokaisella on oma käyttötarkoituksensa. Myös käytettävät kiikut voivat vaihdella: Siirtorekisteri voidaan rakentaa esimerkiksi D-kiikuilla tai JK-kiikuilla.
[muokkaa] SIPO-siirtorekisteri
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- 4-bittinen SIPO-siirtorekisteri vhdl:llä toteutettuna. -- -- Ulostulot tulevat olemaan määrittelemättömässä tilassa, -- kunnes niihin ensimmäisen kerran tuodaan signaali entity dkiikku1_vhdl is Port ( INPUT : in STD_LOGIC; CLK : in STD_LOGIC; OUT1 : out STD_LOGIC; OUT2 : out STD_LOGIC; OUT3 : out STD_LOGIC; OUT4 : out STD_LOGIC); end dkiikku1_vhdl; architecture Behavioral of dkiikku1_vhdl is signal temp: STD_LOGIC_VECTOR(3 downto 0); begin process begin wait until CLK'event and CLK='1'; for i in 0 to 2 loop temp(i) <= temp(i+1); end loop; temp(3) <= INPUT; end process; OUT1 <= temp(3); OUT2 <= temp(2); OUT3 <= temp(1); OUT4 <= temp(0); end Behavioral;
[muokkaa] SISO-siirtorekisteri
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Yksinkertaistettu 4-bittinen SISO-siirtorekisteri vhdl:llä toteutettuna. entity dkiikku1_vhdl is Port ( INPUT : in STD_LOGIC; CLK : in STD_LOGIC; OUTPUT : out STD_LOGIC); end dkiikku1_vhdl; architecture Behavioral of dkiikku1_vhdl is signal temp: STD_LOGIC_VECTOR(3 downto 0); begin process begin wait until CLK'event and CLK='1'; for i in 0 to 2 loop temp(i) <= temp(i+1); end loop; temp(3) <= INPUT; end process; OUTPUT <= temp(0); end Behavioral;
[muokkaa] PISO-siirtorekisteri
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- 4-bittinen PISO-siirtorekisteri vhdl:llä toteutettuna. -- -- Ulostulot tulevat olemaan määrittelemättömässä tilassa, -- kunnes niihin ensimmäisen kerran tuodaan signaali. -- -- SELECT on varattu termi vhdl:ssä, korvataan nimellä SEL. -- Kun tämä on aktiivinen, ladataan rinnakkaisista sisääntuloista -- arvot koko ketjuun. Kun tämä ei ole aktiivinen, muuttuu siirtorekisteri -- SIPO-malliseksi, eli vain ensimmäinen rinnakkaissisääntulo vaikuttaa -- siirtorekisterin seuraaviin arvoihin. Tässä suhteessa vhdl-versio -- eroaa edellä esitetystä kaaviosta, jossa on täysin erillinen sisään- -- tulo SER_IN tällaista tilannetta varten, kun SEL on 0. entity piso_vhdl is Port ( DIN : in STD_LOGIC_VECTOR(3 downto 0); CLK : in STD_LOGIC; SEL : in STD_LOGIC; SER_OUT : out STD_LOGIC); end piso_vhdl; architecture Behavioral of piso_vhdl is signal temp: STD_LOGIC_VECTOR(3 downto 0); begin process begin wait until CLK'event and CLK='1'; if (SEL = '1') then temp(3) <= DIN(3); temp(2) <= DIN(2); temp(1) <= DIN(1); temp(0) <= DIN(0); elsif (SEL = '0') then for i in 0 to 2 loop temp(i) <= temp(i+1); end loop; temp(3) <= DIN(3); end if; end process; SER_OUT <= temp(0); end Behavioral;
[muokkaa] PIPO-siirtorekisteri
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- 4-bittinen PIPO-siirtorekisteri vhdl:llä toteutettuna. -- -- Ulostulot tulevat olemaan määrittelemättömässä tilassa, -- kunnes niihin ensimmäisen kerran tuodaan signaali. -- -- SELECT on varattu termi vhdl:ssä, korvataan nimellä SEL. -- Kun tämä on aktiivinen, ladataan rinnakkaisista sisääntuloista -- arvot koko ketjuun. Kun tämä ei ole aktiivinen, muuttuu siirtorekisteri -- SIPO-malliseksi, eli vain ensimmäinen rinnakkaissisääntulo vaikuttaa -- siirtorekisterin seuraaviin arvoihin. Myös tässä tapauksessa vhdl-versio -- eroaa edellä esitetystä kaaviosta SER_IN sisääntulon suhteen samoin kuin -- edellä esitetyn PISO-tyyppisen siirtorekisterinkin tapauksessa. entity pipo_vhdl is Port ( DIN : in STD_LOGIC_VECTOR(3 downto 0); CLK : in STD_LOGIC; SEL : in STD_LOGIC; DOUT1 : out STD_LOGIC; DOUT2 : out STD_LOGIC; DOUT3 : out STD_LOGIC; DOUT4 : out STD_LOGIC); end pipo_vhdl; architecture Behavioral of pipo_vhdl is signal temp: STD_LOGIC_VECTOR(3 downto 0); begin process begin wait until CLK'event and CLK='1'; if (SEL = '1') then temp(3) <= DIN(3); temp(2) <= DIN(2); temp(1) <= DIN(1); temp(0) <= DIN(0); elsif (SEL = '0') then for i in 0 to 2 loop temp(i) <= temp(i+1); end loop; temp(3) <= DIN(3); end if; end process; DOUT1 <= temp(3); DOUT2 <= temp(2); DOUT3 <= temp(1); DOUT4 <= temp(0); end Behavioral;
[muokkaa] Simulaatio
Esimerkiksi alussa esitetyn SIPO-siirtorekisterin piirikaviototeutuksen simulaatio: