VHDL-kieli FPGA-suunnittelussa/4-bittinen siirtorekisteri
4-bittinen siirtorekisteri
[muokkaa | muokkaa wikitekstiä]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.
Rakenne & toteutus
[muokkaa | muokkaa wikitekstiä]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.
SIPO-siirtorekisteri
[muokkaa | muokkaa wikitekstiä]
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;
SISO-siirtorekisteri
[muokkaa | muokkaa wikitekstiä]
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;
PISO-siirtorekisteri
[muokkaa | muokkaa wikitekstiä]
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;
PIPO-siirtorekisteri
[muokkaa | muokkaa wikitekstiä]
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;
Simulaatio
[muokkaa | muokkaa wikitekstiä]Esimerkiksi alussa esitetyn SIPO-siirtorekisterin piirikaviototeutuksen simulaatio: