Формирование блоков регистров

Цель: получение представления о временном хранении данных в RISC-процессоре.

Постановка задачи: исполнительное устройство нашего процессора содержит два блока: блок регистров, где операнды временно хранятся для производства операций над ними, и блок АЛУ, где собственно и производятся операции. Наша задача построить блок регистров, содержащий четыре 8-разрядных регистра. Один из этих регистров постоянно хранит «0», т.е. не может быть приемником информации, три других же предполагаются под общее назначение. На общую шину данных может поступать как значение непосредственного операнда источника, так и содержимое выхода сумматора АЛУ. Простейшей развязкой этих сигналов в нашем случае может служить блок элементов 2ИЛИ. У каждого регистра буфер записи может быть включен только в том случае, если этот регистр служит приемником операнда (позиции приемник или второй источник).

Программа 3.1

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity reg_sb is

port(

data_i: in std_logic_vector(7 downto 0);

clk_i: in std_logic;

ena : in std_logic;

ctrl : in std_logic;

sbst : in std_logic;

data_out: out std_logic_vector(7 downto 0)

);

end reg_sb;

architecture arch of reg_sb is

signal regist: std_logic_vector(7 downto 0);

begin

process (clk_i)

begin

if(rising_edge(clk_i)) then

if(ena ='1') then

regist <= data_i;

end if;

end if;

end process;

process (ctrl,sbst)

begin

if(ctrl='1') then

if(sbst ='0') then

data_out <= regist;

elsif(sbst ='1') then

data_out <=not(regist) + "00000001";

elsif(ctrl='0') then

data_out<="00000000";

end if;

end if;

end process;

end arch;

Регистр сдвига.

Схема устройства:

Формирование блоков регистров - student2.ru

Временная диаграмма работы устройства:

Формирование блоков регистров - student2.ru

Часть №4

Формирование блока арифметико-логического устройства (АЛУ).

Цель: получение представления о проведении арифметических операций в RISC-процессоре.

Постановка задачи: последний из синтезируемых блоков – АЛУ. В нашем случае АЛУ состоит только из 8-разрядного сумматора. Программа, описывающая такой сумматор – прогр.4.3. Она строится на основе прогр.4.1, описывающей одноразрядный сумматор без входа переноса для младшего разряда и прогр.4.2, описывающей одноразрядный сумматор, имеющий вход переноса для построения всех остальных разрядов. На входы сумматора могут поступать данные с выходов регистров соответствующего блока. Для выбора нужных операндов строим два блока из восьми мультиплексоров на четыре направления каждый. Для хранения бита переноса нужен триггер.

Программа 4.1

library ieee;

use ieee.std_logic_1164.all;

entity add1 is

port(a1,b1:in BIT;c1,s1:out BIT);

end add1;

architecture struct_1 of add1 is

begin

s1<= ((a1 and (not b1)) or ((not a1) and b1));

c1<= a1 and b1;

end struct_1;

Прогр.4.2

library ieee;

use ieee.std_logic_1164.all;

entity add11 is

port(a2,b2,c1:in BIT;c2,s2:out BIT);

end add11;

architecture struct_1 of add11 is

begin

s2<=(a2 xor b2) xor c1;

c2<= (a2 and b2) or ((a2 xor b2)and c1);

end struct_1;

Программа 4.3

library ieee;

use ieee.std_logic_1164.all;

port(a,b:in bit_vector(7 downto 0);

entity add8 is

s:out bit_vector(7 downto 0);

c : out bit);

end add8;

architecture structural of add8 is

component add1

port(a1,b1:in BIT;c1,s1:out BIT);

end component;

component add11

port (c1,a2,b2:in BIT; c2,s2:out BIT);

end component;

signal c_in: bit_vector(6 downto 0);

begin

p0: add1

port map(a1=>a(0),b1=>b(0),c1=>c_in(0),s1=>s(0));

p1: add11

port map(c1=>c_in(0),a2=>a(1),b2=>b(1),c2=>c_in(1),s2=>s(1));

p2: add11

port map(c1=>c_in(1),a2=>a(2),b2=>b(2),c2=>c_in(2),s2=>s(2));

p3: add11

port map(c1=>c_in(2),a2=>a(3),b2=>b(3),c2=>c_in(3),s2=>s(3));

p4: add11

port map(c1=>c_in(3),a2=>a(4),b2=>b(4),c2=>c_in(4),s2=>s(4));

p5: add11

port map(c1=>c_in(4),a2=>a(5),b2=>b(5),c2=>c_in(5),s2=>s(5));

p6: add11

port map(c1=>c_in(5),a2=>a(6),b2=>b(6),c2=>c_in(6),s2=>s(6));

p7: add11

port map(c1=>c_in(6),a2=>a(7),b2=>b(7),c2=>c,s2=>s(7));

end structural;

Программа 4.4.

library ieee;

use ieee.std_logic_1164.all;

entity ms4e is

port(

adr_i: in std_logic_vector(1 downto 0);

k_i: in std_logic_vector(7 downto 0);

l_i: in std_logic_vector(7 downto 0);

m_i: in std_logic_vector(7 downto 0);

n_i: in std_logic_vector(7 downto 0);

en: in std_logic;

data_out: out std_logic_vector(7 downto 0)

);

end ms4e;

architecture BBB of ms4e is

begin

process (adr_i)

begin

if (en=’0’) then data_out<=”00000000”;

elsif (en=’1’) then

case adr_i is

when “00”=>data_out<=k_i;

when “01”=>data_out<=l_i;

when “10”=>data_out<=m_i;

when “11”=>data_out<=n_i;

end case;

end if;

end process;

end;

Схема устройства:

Формирование блоков регистров - student2.ru

Временная диаграмма работы устройства:

Формирование блоков регистров - student2.ru

Часть №5

Наши рекомендации