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

VHDL+Quartus

Помогите, please

Имеется процесс (сдвиговый регистр):

 

SIGNAL parallel_in_signal:std_logic_vector(24 DOWNTO 0);

shiftreg1 : PROCESS ( clk_spi, load_shiftreg1, enable_shiftreg, reset )

BEGIN

IF reset = '1' THEN

sdo <= 'Z';

ELSIF RISING_EDGE(load_shiftreg1) THEN

parallel_in_signal <= parallel_in;

ELSIF enable_shiftreg = '1' THEN

IF FALLING_EDGE(clk_spi) THEN

sdo <= parallel_in_signal(0);

FOR i IN 0 TO 22 LOOP

parallel_in_signal(i) <= parallel_in_signal(i+1);

END LOOP;

parallel_in_signal(23) <= '0';

END IF;

END IF;

END PROCESS;

на что квартус выдает:

Error: VHDL error at file.vhd(129): signal statement is not synthesizable

because it does not hold its value after a clock adge,

причем ModelSim в этом месте ничего не находил

что здесь можно сделать?

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


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

То, что сразу бросается в глаза:

изменение по фронту описывается так: IF (clk'EVENT AND clk = '1') THEN

В Вашем случае необходимо заменить:

IF FALLING_EDGE(clk_spi) THEN на

IF (clk_spi'EVENT AND clk = '0') THEN

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


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

Разницы нет никакой.Просто FALLING_EDGE как и RISING_EDGE -это функции библиотеки IEEE.std_logic_1164. Залезь в эту библиотеку и найти 10 отличий от (clk'EVENT AND clk = '1') или (clk'EVENT AND clk = '0')

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


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

не являюсь большим знатоком VHDL, но здесь требуют синтезировать триггер с 2-мя тактовыми входами:

[ELSIF RISING_EDGE(load_shiftreg1) THEN
parallel_in_signal <= parallel_in; 
ELSIF enable_shiftreg = '1' THEN 
IF FALLING_EDGE(clk_spi) THEN

что для моделирования вещь возможная, для синтеза нет.

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


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

Тут два варианта

 

регистр с асинхронной загрузкой

 

IF load_shiftreg1 THEN

.

.

IF FALLING_EDGE(clk_spi) THEN

 

или с синхронной

 

IF FALLING_EDGE(clk_spi) THEN

IF load_shiftreg1 THEN

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

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


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

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

 

Во-первых, при использовании в одном процесе RISING_EDGE и FALLING_EDGE уже автоматически делают его несинтезируемым.

 

Во-вторых, конструкция if edge else также является несинтезируемой, пусть автор сам представит, как это должно выглядеть в железе ;)

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


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

Помогите, please

Имеется процесс (сдвиговый регистр):

 

  IF reset = '1' THEN

  sdo <= 'Z';

 

А как он Z на внутренней логике делать? Z - на выходном буфере.

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


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

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

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

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

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

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

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

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

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

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