Перейти к содержанию
    

Запутался в реализации "serdes"

Входные данные например 8 бит. Последовательные данные должные идти без задержек... В тесте я пытаюсь это моделировать - подавать на вход постоянно данные, подавая данные на вход.

 

Моя реализация во вложенных файлах.

Почему пролазит глич? Понимаю что асинхронщина где-то...

У меня сейчас только асинхронная загрузка...

 

Где я туплю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас загрузка данных в регистр и предустановка счетчика асинхронные.

Это так специально замышлялось? :)

Ну и если я ничего не напутал в Вашей задаче - раз входные данные подаются с некоей частотой непрерывно, то частота выдачи последовательных данных должна быть в восемь раз выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему пролазит глич?

Потому что есть асинхронная загрузка данных.

На диаграмме видно, что этот ваш глитч есть всегда когда есть rising_edge(load) и в сдвиговом что то есть. Перейдите на

конструкцию вида

if (rising_edge(clk)) then
    if(load='1') then
    ...
end if;

И будет вам счастие ;) только логику нужно будет подрихтовать чуток напильником

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Исправил, но на построут красные линии.... Почему?

 

PS Давно не программировал ПЛИС.... Немного подзабыл...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте добавить сбросы для регистров.

так я при загрузке в сдвигающий регистр - обновляю данные в регистре...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так я при загрузке в сдвигающий регистр - обновляю данные в регистре...

process (clk)
begin
if clk'event and clk = '1' then
    if (load ='1') then
    reg_data <= din;
    cnt <= "000";
    else
    reg_data <= reg_data(6 downto 0) & '0';
    cnt <= cnt + 1;
    end if;

    if (cnt = "101") then
    reg_strob <= '1';
    else
    reg_strob <= '0';
    end if;
end if;
end process;

dout <= reg_data(7);
count <= cnt;
strob <= reg_strob;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

process (clk)
begin
if clk'event and clk = '1' then
    if (load ='1') then
    reg_data <= din;
    cnt <= "000";
    else
    reg_data <= reg_data(6 downto 0) & '0';
    cnt <= cnt + 1;
    end if;

    if (cnt = "101") then
    reg_strob <= '1';
    else
    reg_strob <= '0';
    end if;
end if;
end process;

dout <= reg_data(7);
count <= cnt;
strob <= reg_strob;

спасибо, но к сожалению красные линии остались....

upd

 

Проблема решена. Ответ: в тестбенче поменял на

 clk_process :process
   begin
        clk <= '0';
        wait for clk_period/2;
        clk <= '1';
        wait for clk_period/2;
   end process;

было

 clk_process :process
   begin
        clk <= '1';
        wait for clk_period/2;
        clk <= '0';
        wait for clk_period/2;
   end process;

 

Всем спасибо за помощь!!! :a14:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 Maverick

мне кажется такое "решение" очень подозрительным, я бы всё таки поковырял в дизайне..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 Maverick

мне кажется такое "решение" очень подозрительным, я бы всё таки поковырял в дизайне..

дизайн "десять" строчек кода... и ничего сверхестественного...

 

взять например описание от sazh. Где ковырять?

 

Еще раз спасибо за помощь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этом вопросе согласен с Kuzmi4.

Метасостояние, если оно имелось виду под "красные линии" не должно исправляться инверсией тактовой частоты в тесте. думаю вам нужно пересмотреть свой дизайн в плане включения синхронных сбросов всех или хотябы ключевых регистров. Или отковырять причину появления этих самых "красных линий".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кому-то пригодиться...

Выкладываю исправленную версию serdes (первоначальные удалил)

Всем спасибо и отдельная благодарность за помощь Kuzmi4.

par_ser.vhd

test_P2S.vhd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема вашего тестбенча в том, что следующего клока следует ждать не по времени, а по фронту самого клока, то есть

 wait until rising_edge(clk);

Тогда последующие установки тестовых сигналов тестбенчем будут происходить в следующем дельта цикле после прохождения фронта клока, и не будет дурацких коллизий. Ждать строба, как у вас, конечно, тоже правильно. А вот переносить установку сигналов на середину периода, ПМСМ, не правильно. При поведенческой симуляции удобнее, когда все сигналы, включая активный фронт клока, на временной диаграмме меняются одновременно, хотя это, может быть, у меня привычка такая:).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема вашего тестбенча в том, что следующего клока следует ждать не по времени, а по фронту самого клока, то есть
 wait until rising_edge(clk);

Тогда последующие установки тестовых сигналов тестбенчем будут происходить в следующем дельта цикле после прохождения фронта клока, и не будет дурацких коллизий. Ждать строба, как у вас, конечно, тоже правильно. А вот переносить установку сигналов на середину периода, ПМСМ, не правильно. При поведенческой симуляции удобнее, когда все сигналы, включая активный фронт клока, на временной диаграмме меняются одновременно, хотя это, может быть, у меня привычка такая:).

спасибо ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На какой скорости работает serdes ?

Лучше счетчик cnt делать не сумматором, а также сдвиговым регистром. Частота увеличится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...