реализация задержки 50 нс в VHDL

Я отправляю данные на аналого-цифровой преобразователь, и мне нужно, чтобы данные команды были задержаны не менее чем на 50 нс от clk_19khz. Вот что у меня есть до сих пор. Как мне вставить задержку 50 нс, которая требуется для аналого-цифрового преобразования между clk_19khz и моим первым битом Dout для аналого-цифрового преобразования? Я использую Xilinx FPGA. Спасибо за помощь!

         library IEEE;
        use IEEE.STD_LOGIC_1164.ALL;

         -- Uncomment the following library declaration if using
         -- arithmetic functions with Signed or Unsigned values
         --use IEEE.NUMERIC_STD.ALL;

         -- Uncomment the following library declaration if instantiating
         -- any Xilinx primitives in this code.
         --library UNISIM;
         --use UNISIM.VComponents.all;

      entity PSOL is
        Port ( clk : in  STD_LOGIC;
               clk_19khz : OUT std_logic;
               Dout :out std_logic);
        end PSOL;

     architecture Behavioral of PSOL is
         signal temp : std_logic;
         signal count : integer range 0 to 1301 := 0; --1301
         signal temp2 : std_logic;
         signal dcount : integer range 0 to 11 := 0; --
         signal start : std_logic  := '1'; -- indicates the start of                      
         signal parity : std_logic := '1'; --used to varify data sent
         signal stop : std_logic := '0'; --indicate when word/command has                             
       --signal chip_select : bit :='1'; -- active low



     begin
       process (clk)
         begin
            if (clk' EVENT AND clk='1') then
                if (count = 1301) then --1301
                    temp <= not(temp);
                    count <=0;
                else
                    count <= count + 1;     
                end if;
            end if;
     end process;

        clk_19khz <= temp;
         temp2 <= temp;


      process (temp2)
        begin
            If (temp2' EVENT and temp2 ='0') then

                dcount <= dcount + 1;
                parity <= '1';
                stop <= '0';
                start <='1';
            if (dcount < 12 and start = '1' and stop = '0') then
                CASE dcount is
                  when 1 => Dout <= start; -- need delay 50ns before this 
                  when 2 => Dout <= '0';
                  when 3 => Dout <= '1';
                  when 4 => Dout <= '0';
                  when 5 => Dout <= '1';
                  when 6 => Dout <= '0';
                  when 7 => Dout <= '0';
                  when 8 => Dout <= '1';
                  when 9 => Dout <= '1';
                  when 10 => Dout <= parity;
                  when 11 => Dout <= '0';
                  when others => null;
                 end case;
            end if;
        end if;             
        --dcount <= 0;
        --start <='1';

    end process;



 end Behavioral;

person hfbroady    schedule 04.11.2015    source источник
comment
Итак, какова тактовая частота clk и связана ли она с clk_19khz целочисленным отношением?   -  person    schedule 05.11.2015
comment
clk - это тактовая частота 50 МГц. clk_19khz - это тактовая частота, которую я сгенерировал из тактовой частоты 50 МГц, которая мне нужна для синхронизации данных с аналого-цифровым преобразователем.   -  person hfbroady    schedule 05.11.2015


Ответы (1)


Ваши часы (50 МГц) имеют период 20 ns. Таким образом, вам понадобится счетчик по модулю 3 для подсчета задержки не менее 3 тактовых импульсов, что дает задержку 60 ns.

Декларации:

signal delay_en : std_logic;
signal delay_us : unsigned(1 downto 0) := (others => '0');
signal delay_ov : std_logic;

Применение:

process(clk)
begin
  if rising_edge(clk) then
    if (delay_en = '1') then
      delay_us <= delay_us + 1;
    else
      delay_us <= (others => '0');
    end if;
  end if;
end process;
delay_ov <= '1' when (delay_us = 2) else '0';

Ваша текущая реализация должна управлять delay_en, пока она ожидает временной интервал. Если задержка закончилась, выдается сигнал delay_ov (ov = переполнение). Это может быть использовано вашим решением для перехода к алгоритму in. Ваш код также должен сбрасывать delay_en, что очищает счетчик до 0.

person Paebbels    schedule 04.11.2015
comment
где вы меняете delay_en? - person hfbroady; 05.11.2015
comment
@hfbroady Упрощен счетчик и добавлен текст использования. - person Paebbels; 05.11.2015
comment
Спасибо за помощь. Мне также сказали, что дизайн плохой из-за того, что я использую clk_19khz. Какие-нибудь мысли? - person hfbroady; 05.11.2015
comment
clk_19khz/temp — это самодельные часы. Его можно использовать для выходных контактов, но его нельзя использовать для процессов в качестве новых часов (что вы делаете, используя temp2'event). Таким образом, ваша схема не полностью синхронизирована с clk (основными часами). Решение и чистый способ состоит в том, чтобы использовать clk для всех ваших процессов и temp в качестве сигнала включения часов. - person Paebbels; 05.11.2015