Создайте СИГНАЛ «Инициирование» и «Конец» для модуля в VHDL - PullRequest
0 голосов
/ 20 ноября 2018
library IEEE;  
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 
entity struture_test is
        Port ( clk : in STD_LOGIC;
               rst : in STD_LOGIC;
               Init  : in STD_LOGIC;
               i_ia : in STD_LOGIC_VECTOR (11 downto 0);
               i_ib : in STD_LOGIC_VECTOR (11 downto 0);
               end_s : out  std_logic;
               result : out STD_LOGIC_VECTOR (11 downto 0)); 
end struture_test;

architecture Behavioral of struture_test is
    signal en_sn : std_logic := '0'; 
begin 
PROCESS (clk,rst)
    variable acc : signed (23 downto 0) ;
    variable x   : signed (35 downto 0) ; 
begin
    if (rst = '0') then
        result <= (others => '0');
        end_s  <= '0';
    elsif (rising_edge (clk)) then

        if ((Init) = '1') then
            acc := signed (i_ia)*signed (i_ib);
            x   := acc * signed (i_ia);

            result <= std_logic_vector (x(23 downto 12));
            end_s  <= '1';
         else
            end_s  <= '0';
         end if;    
    end if; 
end process;

end Behavioral;

Привет всем У меня есть проект, который включает в себя несколько блоков.Блоки связывают друг друга через сигнал инициализации или окончания.Это означает, что сигнал окончания одного блока связан с сигналом инициализации следующего блока.Я в замешательстве из-за того, что вышеприведенный код дает хороший сигнал инициализации и окончания?

Если я изменю свой код и преобразую его в конвейерную структуру для работы с высокочастотной тактовой частотой.Переменные преобразуются в сигналы

PROCESS (clk,rst)
    signal acc : signed (23 downto 0) ;
    signal x   : signed (35 downto 0) ; 
begin
    if (rst = '0') then
        result <= (others => '0');
        end_s  <= '0';
    elsif (rising_edge (clk)) then

        if ((Init) = '1') then
            acc <= signed (i_ia)*signed (i_ib);
            x   <= acc * signed (i_ia);

            result <= std_logic_vector (x(23 downto 12));
            end_s  <= '1';
         else
            end_s  <= '0';
         end if;    
    end if; 
end process;

Как создать сигнал инициализации и окончания в этом случае?Блок иллюстрирует на рисунке

1 Ответ

0 голосов
/ 26 ноября 2018

Идея хорошая, но код неправильный. Кроме того, он имеет некоторые неприятные запахи кодирования.

Основные правила:

  1. Не использовать асинхронный сброс.
  2. Нельзя объявлять сигналы в процессах. Процесс разрешает объявления переменных; архитектуры допускают декларации сигналов.
  3. Каждое назначение сигнала в процессе синхронизации создает триггер / задержку в один такт. Таким образом, это общая задержка на 3 такта, но ваш сигнал end задерживается только на один цикл.
  4. Не включать конвейерные операции. Используйте задержанную цепочку действительных битов.
  5. Не сбрасывать результаты конвейера, потому что базовые аппаратные ресурсы, такие как модули DSP (умножение), не поддерживают сброс.

Измененный код:

library IEEE;  
use     IEEE.std_logic_1164.all; 
use     IEEE.numeric_std.all; 

entity struture_test is
  port (
    clk    : in  std_logic;
    rst    : in  std_logic;
    Init   : in  std_logic;
    i_ia   : in  std_logic_vector(11 downto 0);
    i_ib   : in  std_logic_vector(11 downto 0);
    end_s  : out std_logic;
    result : out std_logic_vector(11 downto 0)    := (others => '0');
  ); 
end entity;

architecture rtl of struture_test is
  signal ValidChain : std_logic_value(2 downto 0) := (others => '0');
  signal ia_delayed : signed(i_ia'range)          := (others => '0');
  signal acc        : signed(23 downto 0)         := (others => '0');
  signal x          : signed(35 downto 0)         := (others => '0');
begin
  process(clk)
  begin
    if rising_edge(clk) then
      ValidChain <= ValidChain(ValidChain'high - 1 downto ValidChain'low) & Init;

      acc        <= signed(i_ia) * signed(i_ib);
      ia_delayed <= signed(i_ia);
      x          <= acc * ia_delayed;
      result     <= std_logic_vector(x(23 downto 12));
    end if; 
  end process;

  end_s <= ValidChain(ValidChain'high);
end architecture;

Обратите внимание: сигнал i_ia, используемый во втором умножении, должен быть задержан на один цикл, иначе вы бы смешали значения ia из разных циклов конвейера.

...