34
În Fig. 43 : Registru de shiftare se poate vedea un registru de deplasare pe 4 biți, la care se poate accesa
atât data de ieșire pe un bit, Q, cât și datele de intrare în fiecare bistabil D0 ÷ D3.
Bineînțeles că acesta este doar un exemplu, iar cel ce dezvoltă aplicația poate modifica atât
funcționalitatea, cât și pinii de IO în funcție de nevoie. Aici, linia punctată trasată de la ieșirea bistabilului FF3
la intrarea în multiplexorul conectat la bistabilul 0 transformă acest registru de deplasare într-un registru de
rotire. Astfel, datele D0 ÷ D3 se vor roti continuu cât timp LOAD = 0 și RESET = 0.
Fig. 43: Registru de shiftare
Procesul ce generează acest registru de deplasare este următorul:
process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
data_buf <= " 0000 ";
elsif load = '1' then
data_buf <= load_data;
elsif ce = '1' then
q_buf <= data_buf(3);
data_buf(3 downto 1) <= data_buf(2 downto 0);
if rot = '0' then
data_buf(0) <= ' 0 ';
else
data_buf(0) <= data_buf(3);
end if;
end if;
end if;
end process;
Se poate observa că această componentă implementează atât registru de deplasare, cât și registru de
rotire, în funcție de semnalul “rot”. Dacă acesta este ‘0’, atunci implementarea e de registru de deplasare,
iar dacă are valoarea ‘1’, atunci acesta e registru de rotire.
Codul complet al acestei componente, dar și codul de simulare pot fi găsite în anexa:
shift_reg.vhd, respectiv testB_shift_reg.vhd.