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

Временная симуляция

Работаю в ISE6.3 + ModelSim 6.0с

Использую синхронное FIFO 64 разряда на частоте 80 МГц, с одной особенностью

IF DIR = 0 then

DIN <= DIA;

WR <= IA;

DOB <= DO;

RD <= IB;

else

DIN <= DIB;

WR <= IB;

DOA <= DO;

RD <= IA;

end if;

Где DA, DB, A и B - двухнаправленные буферы, т.е. я переключаю FIFO то в одну, то в другую сторону

 

Столкнулся вот с чем...

Во временной симуляции после router и map вижу гадость на DO (некоторые разряды неопределенны!) после снятия с SINT FIFO активного уровня, то есть после снятия сброса!

Что может привести к такому поведению fIFO, если но WR и RD в близлежащей временной области неактивны!!!

На мой взгляд этот код должен превращаться в мультиплексоры, а значит не должно быть ни каких аварий!

 

Как выйти из такой ситуевины :(

 

(2 разных нельзя т.к. fIFO большое и 2 не поместяться в кристалл!)

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


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

А какое FIFO Вы используете? Может причина такого поведения - в его построении.

 

1) Кому-то уже давал такой совет - попробуйте промоделировать Post place and route model без SDF (или значительно уменьшите тактовую частоту в модели) - если заработает как надо, значит частота слишком высока.

2) Если сомневаетесь в том, что синтезатор Вас правильно понял (касаемо мультиплексоров) - внимательно проглядите отчет о синтезе этого модуля.

 

P.S. Хочется заметить, что VHDL для синтезируемых схем - это не совсем (совсем не!) язык программирования - когда пишешь код, нужно четко себе представлять что хочется увидеть в железе. Многие, особенно имеющие опыт программирования на ЯВУ, часто об этом забывают.

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


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

IF DIR = 0 then

  DIN  <= DIA;

  WR  <= IA;

  DOB <= DO;

  RD  <= IB;

else

  DIN <= DIB;

  WR  <= IB;

  DOA <= DO;

  RD  <= IA;

end if;

 

При таком описании на DOA и DOB синтезатор будет ставить латчи, что плохо. Надо писать так:

IF DIR = 0 then

DIN <= DIA;

WR <= IA;

DOB <= DO;

DOA <= 0; -- или что-то другое

RD <= IB;

else

DIN <= DIB;

WR <= IB;

DOA <= DO;

DOB <= 0; -- или что-то другое

RD <= IA;

end if;

 

или еще проще

DOA <= DO;

DOB <= DO;

IF DIR = 0 then

DIN <= DIA;

WR <= IA;

RD <= IB;

else

DIN <= DIB;

WR <= IB;

RD <= IA;

end if;

т.е. 2 шины DOA и DOB на самом деле не нужны.

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


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

При таком описании на DOA и DOB синтезатор будет ставить латчи, что плохо. Надо писать так:

IF DIR = 0 then

  DIN  <= DIA;

  WR  <= IA;

  DOB <= DO;

  DOA <= 0; -- или что-то другое

  RD  <= IB;

else

  DIN <= DIB;

  WR  <= IB;

  DOA <= DO;

  DOB <= 0; -- или что-то другое

  RD  <= IA;

end if;

 

или еще проще

DOA <= DO;

DOB <= DO;

IF DIR = 0 then

  DIN  <= DIA;

  WR  <= IA;

  RD  <= IB;

else

  DIN <= DIB;

  WR  <= IB;

  RD  <= IA;

end if;

т.е. 2 шины DOA и DOB на самом деле не нужны.

 

Ну не факт!!! Автор же не указал какой у него процес ? он просто привел часть кода, может быть у него регистровые выходы ? :)

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


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

Ну не факт!!! Автор же не указал какой у него процес ? он просто привел часть кода, может быть у него регистровые выходы ? :)

 

Если в коде процесса нет других присваиваний (до или после приведенного автором оператора IF) для DOA и DOB, то код автора будет всегда приводить к появлению латчей. Я предполагал, что если проблема в этих сигналах, то автор достаточно сообразителен, чтобы привести весь текст, где эти сигналы меняются. Иначе нечего и обсуждать :)

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


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

Если в коде процесса нет других присваиваний (до или после приведенного автором оператора IF) для DOA и DOB, то код автора будет всегда приводить к появлению латчей. Я предполагал,  что если проблема в этих сигналах, то автор достаточно сообразителен, чтобы привести весь текст, где эти сигналы меняются. Иначе нечего и обсуждать :)

хмм а если то что он привел у него стоит в

process(clock) is

begin

if (rising_edge (clock)) then

.........

 

то то же будут латчи ? или все таки тригеры ?

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


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

То ли ты подцепил не то ... в общем, ничего похожего на обсуждаемый код не обнаружилось. Зато в модуле cnt.vhd обнаружилось вот что

PR : PROCESS
BEGIN
 wait until(CLK'EVENT and CLK = '1');
 ...
END PROCESS;

 

более правильно было бы так

PR : PROCESS(CLK)
BEGIN
 if (CLK'EVENT and CLK = '1') then
   ...
 end if;
END PROCESS;

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


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

Вконце файла есть строчки

.........

if cntCMD = 0 or cntCMD = 8 then

-- DATA

if DIRECT = '0' then

DIfd <= DLI; -- WRITE TODATA

WRfd <= CE_LI; -- WRITE STROB TO

RDfd <= RDfd2; -- READ FROM FIFO

else

DIfd <= DIfd2;

WRfd <= WRfd2;

T_L <= not CSFF;

T_LCE <= not CSFF;

.......

 

Чем IF (CLK'EVENT.... лучше Wait (CLK'EVENT.... ???

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


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

Если в коде процесса нет других присваиваний (до или после приведенного автором оператора IF) для DOA и DOB, то код автора будет всегда приводить к появлению латчей. Я предполагал,  что если проблема в этих сигналах, то автор достаточно сообразителен, чтобы привести весь текст, где эти сигналы меняются. Иначе нечего и обсуждать :)

хмм а если то что он привел у него стоит в

process(clock) is

begin

if (rising_edge (clock)) then

.........

 

то то же будут латчи ? или все таки тригеры ?

 

На самом деле неважно, триггеры или латчи. Важно что автор считает, что код должен синтезироваться в мультиплексор (как я понял, так было задумано) - а это неверно. И поскольку у них не прописано в явном виде сброса, то в начале симуляции их состояние будет неопределено.

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


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

Если в коде процесса нет других присваиваний (до или после приведенного автором оператора IF) для DOA и DOB, то код автора будет всегда приводить к появлению латчей. Я предполагал,  что если проблема в этих сигналах, то автор достаточно сообразителен, чтобы привести весь текст, где эти сигналы меняются. Иначе нечего и обсуждать :)

хмм а если то что он привел у него стоит в

process(clock) is

begin

if (rising_edge (clock)) then

.........

 

то то же будут латчи ? или все таки тригеры ?

 

На самом деле неважно, триггеры или латчи. Важно что автор считает, что код должен синтезироваться в мультиплексор (как я понял, так было задумано) - а это неверно. И поскольку у них не прописано в явном виде сброса, то в начале симуляции их состояние будет неопределено.

 

 

Сброс то есть но в другом процессе!, я его просто не показал.

Именно после этого сброса, по заднему фронту на выходе FIFO образуется неопределенное состояние!

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


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

Сброс то есть но в другом процессе!, я его просто не показал.

Именно после этого сброса, по заднему фронту на выходе FIFO образуется неопределенное состояние!

Это как так ?? назначение в одном процессе а сброс в другом ??

тогда ясно почему непределенное состояние :)

переделать на 1 процесс

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


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

Посавил в один - то же самое!!!

а можно тогда весь код ? а не его кусок

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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