Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Дребезг или особенности записи в регистр
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
anatolich
Cделал такой генератор синуса
Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity sinnw is  
  port ( clk   : in  std_logic; en    : in  std_logic; preset : in  std_logic; adr : in std_logic_vector(1 downto 0);
    sin_reg : in std_logic_vector(15 downto 0);    sine   : out std_logic_vector(13 downto 0));
end sinnw;
architecture behave_sine_cos of sinnw is
    signal sine_s : unsigned(13 downto 0); signal ampl : integer; signal cosw : natural; signal shft : natural;
begin  -- behave_sine_cos
registers: process (clk, en)
    variable sine_d : integer;
    variable y_1, y_2, sine_m : integer;

begin  -- process registers
  if clk'event and clk = '1' then    -- rising clock edge
    if (en = '1') then
      sine_d := cosw*y_1;
      sine_m := sine_d/4096-y_2;
      y_2 := y_1;      
      y_1 := sine_m;
      sine_s <= to_unsigned(sine_m+ shft,14);
      sine <= std_logic_vector(sine_s);
    else
        y_1 := 0;
        y_2 := ampl;
        sine <= "00000000000000";
    end if;
  end if;
end process registers;

setregisters: process (clk, preset)
begin  -- preset registers
  if clk'event and clk = '1' then    -- rising clock edge
    if (preset = '1') then
        CASE adr IS
            WHEN  "00"  =>  ampl <= to_integer(signed(sin_reg));
            WHEN  "01"  =>  cosw <= to_integer(unsigned(sin_reg));
            WHEN OTHERS =>  shft <= to_integer(unsigned(sin_reg));
        END CASE;
    end if;
  end if;
end process setregisters;

end behave_sine_cos;


Кому интересно, то с регистры ampl="1111111110011001", cosw="0001111111111011", shft="0000111111000000"
дают в поведенческой модели ModelSim отличный синус
Нажмите для просмотра прикрепленного файла
Но в postroute
Нажмите для просмотра прикрепленного файла
ближе
Нажмите для просмотра прикрепленного файла

С чем это может быть связано? Вроде бы у меня выход синхронный по фронту.
Чем это можно поправить?
Пробовал вынести вычисление в отдельный процесс, в нем буфер, а оттуда в синхронном процессе
из буфера на выход...
То же самое
Grumbler_2002
Разверните шину синуса и убедитесь, что всё работает правильно.
Sergey_Bekrenyov
а какую частоту задаете? У Вас умножитель стоит - он самый медленный будет.
anatolich
Частота у меня 5МГц. Это же не много?
Да в синусе видно, что на шину вываливаются не одновременно
новые значения
Нажмите для просмотра прикрепленного файла
Еще одну защелку ставить? Сдвинуть на такт весь выход?

Подвигал в PlanAhead. Собрал все выходы синуса поближе. Не помогло
vetal
Все нормально у вас на картинке.
В postroute у вас показана картина с учетом задержек на кристалле.
Вас должно интересовать значение сигнала только на фронте тактовой частоты.
anatolich
В принципе - да.
ЦАП будет забирать по фронту.
Спаяю - посмотрю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.