Дизайн "простого" модуля VHDL все еще сводит меня с ума - PullRequest
0 голосов
/ 27 февраля 2011

Благодаря вашему вкладу я реализовал ваши предложения, однако проблема осталась прежней.Результат в симуляции работает нормально, но аппаратные средства выводят что-то другое.Вкратце, у меня есть два ctrl-сигнала, которые определяют поведение объекта:

GET    (ctrl = "00000000") sets register tx to input of op1
SH1_L (ctrl = "00000001")  res := (op1 << 1) | tx;
                           tx  := tx >> 31;

Вот код VHDL:

    library ieee;
    use ieee.std_logic_1164.all;

     entity test is
     port
     (
       op1   : in  std_logic_vector(31 downto 0);      -- Input operand
       ctrl   : in std_logic_vector(7 downto 0);          -- Control signal
       clk   : in  std_logic;                                     -- clock
       res   : out std_logic_vector(31 downto 0)       -- Result
     );
     end;

     architecture rtl of test is

       type res_sel_type is (GET, SH1_L);

       constant Z : std_logic_vector(31 downto 0) := (others => '0');

       signal res_sel  : res_sel_type;
       signal load      : std_logic := '0';
       signal shl        : std_logic := '0';

       signal tx        : std_logic_vector(31 downto 0) := (others => '0');
       signal inp1    : std_logic_vector(31 downto 0) := (others => '0');

     begin

       dec_op: process (ctrl, op1)
       begin

         res_sel  <= GET;
         load      <= '0';
         shl        <= '0';
         inp1      <= ( others => '0');

         case ctrl is

            -- store operand
                when "00000000" =>
                   inp1      <= op1;
                   load      <= '1';
                   res_sel <= GET;

                -- 1-bit left-shift with carry
                when "00000001" =>
                 inp1      <= op1;
                 shl        <= '1';
                 res_sel <= SH1_L;

                when others =>
                   -- Leave default values

                end case;

       end process;

       sel_out: process (res_sel, inp1, tx)
       begin

         case res_sel is

          when SH1_L =>
           res  <= ( inp1(30 downto 0) & '0' ) or tx;

           when others =>
           res <= (others => '0');

         end case;

       end process;

       sync: process(clk)
       begin
        if clk'event and clk = '1' then
             if load = '1' then
                tx <= op1;
             elsif shl = '1' then
                tx <= Z(30 downto 0) & op1(31);
             end if;
       end if;
       end process;

     end rtl;

ТЕСТРОГРАММА

   GET  0               (this sets tx <= 0 )
   SH1_L 0xfedcba90     exp. output: 0xfdb97520  act. output = 0xfdb97521
   SH1_L 0x7654321f     exp. output: 0xeca8643f  act. output = 0xeca8643f
   SH1_L 0x71234567     exp. output: 0xe2468ace  act. output = 0xe2468ace

Как видите, последний бит неверен для первой операции SH1_L.Первая операция SH1_L создает перенос для операции NEXT SH1_L, поскольку MSB установлен на один из входов, однако кажется, что этот перенос уже учитывается в текущей операции SH1_L, что неверно (tx должен быть нулевым).Я проверил сводный отчет, и защелок нет, поэтому я немного не в курсе и почти отчаялся, что здесь не так.Я использую Xilinx ISE 12.1 для синтеза, может ли быть проблема, потому что у меня нет сигнала сброса в моей архитектуре, что создается неправильный тип защелок?

Большое спасибо за дополнительные полезные комментарии для решения этой проблемыПатрик

1 Ответ

0 голосов
/ 28 февраля 2011

В отличие от симуляции RTL, реальная синхронизация входов и тактовых импульсов не идеальна.Например, дерево часов может иметь более длительную задержку, чем входные буферы, или наоборот.Вы это учли?

...