Делаем сериал в серийный выход сумматора - PullRequest
0 голосов
/ 17 марта 2019

Меня смущает последовательная логика с компонентами (я новичок).У меня есть эти компоненты, но я не понимаю, как их использовать в процессе.Мне нужна помощь в понимании того, как последовательная логика работает с компонентами, а также я не уверен, верны ли мои векторы ввода / вывода.У меня проблемы с входами и выходами для сдвиговых регистров, например, если x (0) <= sin - правильный вызов. </p>

Я должен спроектировать это: (https://i.stack.imgur.com/mwVdw.jpg)

Это мой основной файл

use IEEE.STD_LOGIC_1164.ALL;

entity sa_top is
  port( 
        x:      in STD_LOGIC_VECTOR(7 downto 0);
        y:      in STD_LOGIC_VECTOR(7 downto 0);
        clk:    in STD_LOGIC;
        rst:    in STD_LOGIC;
        s:      out STD_LOGIC_VECTOR(7 downto 0)
       );
end sa_top;

architecture Behavioral of sa_top is

-- shift register
component sr is
    port( 
          sin:  in STD_LOGIC;
          sout: out STD_LOGIC;
          clk:  in STD_LOGIC;
          rst:  in STD_LOGIC
         );
end component sr;

-- d flip/flop
component dff is 
    port( 
           d:   in STD_LOGIC;
           q:   in STD_LOGIC;
           clk: in STD_LOGIC;
           rst: in STD_LOGIC
           );
end component dff;

-- full adder
component fa is
    port( 
            a:     in STD_LOGIC;
            b:     in STD_LOGIC;
            cin:   in STD_LOGIC;
            sum:   out STD_LOGIC;
            cout:  out STD_LOGIC
         );
end component fa;

signal xi, yi, si: std_logic;
signal xo, yo, so: std_logic;


signal s_temp: std_logic;
signal carry: std_logic;

begin
xi <= x(0);
yi <= y(0);


inp_x_instance:  sr port map(sin => xi, sout => xo, clk => clk, rst => rst);
inp_y_instance:  sr port map(sin => yi, sout => yo, clk => clk, rst => rst);

adder_instace:   fa port map(a => xo, b=> yo, cin => carry, sum => si, cout => carry);

op_s_instance:   sr port map(sin => si, sout => so, clk => clk, rst => rst);

--df_instance: dff port map(d => s_temp, q => s_temp, clk => clk, rst => rst);

    process(clk, s_temp) is
    begin
        if rst = '1' then
            s <= (others=>'0');
        elsif rising_edge(clk) then
            s(0) <= so;
         end if;
    end process;
end Behavioral;```

1 Ответ

0 голосов
/ 20 марта 2019

Я думаю, что вы делаете правильно, единственное, что вас может запутать, - это фактическое смещение, вам нужно сместить биты на 1 влево в другие биты. Который может выглядеть примерно так:

s(7 downto 1) <= s(6 downto 0);

Таким образом, последний фрагмент кода должен выглядеть следующим образом: (обратите внимание, что я удалил s_temp из списка чувствительности процесса)

process(clk) is
begin
    if rst = '1' then
        s <= (others=>'0');
    elsif rising_edge(clk) then
        s(7 downto 1) <= s(6 downto 0);
        s(0) <= so;
     end if;
end process;
...