Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Что не так с моим кодом на Verilog?

Что не так с моим кодом на Verilog? 2 мес. 3 нед. назад #7804

Добрый день!
Я тут нарисовал некоторую систему, в основном, используя IP компоненты из Квартуса. Отсимулировал в University Program WVF, оно работает. Решил компоненты переписать на верилоге. Помучался в верилогом (я вот вообще совсем новичок), переписал один, другой... Начал третий - и получил проблем. Не могу разобраться.

Итак, мне был нужен параллельный регистр, с сигналами ALOAD, ACLR, с возможностью превращать ео в сдвиговый регистр. У меня устройство в этот регистр по параллельной шине кладет данные, читает их, потом снова кладет, а потом мне нужен SPI наружу - регистр превращается в сдвиговый и вуаля.

Я сделал отдельный проект только с этим регистром (на верилоге), писал-писал, отладил. Работает, симулируется, все отлично. Удалил из основного проекта IP компонент, всунул мой регистр - компилируется, но не симулируется. Дает ошибку "Error (suppressible): (vsim-3601) Iteration limit 5000 reached at time 22715 ns." Это ровно то время, когда на регистр приходит сигнал ALOAD. Погуглил, гуглится что "сигнал, помещенный в список чувствительности меняется..." Но у меня-то не меняется! Но я же смотрел, я ж его написал... У меня же этот регистр работает в другом проекте, пустом, в котором кроме регистра ничего нет..

Код регистра в студию:
module SHREG_R (CLK, ACLR, SHIFT_Enable, LOAD, DIN, SHIFTIN, DOUT, SHOUT);
parameter width=24;

input CLK;
input ACLR; 
input SHIFT_Enable; 
input LOAD; 
input [width-1:0] DIN; 
input SHIFTIN; 
output [width-1:0] DOUT;
output SHOUT;
reg [width-1:0] DOUT;

always @(posedge CLK or posedge LOAD or posedge ACLR) 
begin
	if(ACLR) DOUT <= 0;
		else
			if(LOAD) DOUT <= DIN;
				else
					if(CLK & SHIFT_Enable) DOUT <= { DOUT[width-2:0], SHIFTIN };	
					
end
			

    assign SHOUT  = DOUT[width-1];
endmodule


Что я делаю не так? Или мне надо выкинуть WVF, и перелезать на моделсим или что там еще?
Проект я сделаю и без верилога, собственно, я его уже и сделал, просто хочу разобраться.. с верилогом :)

Спасибо.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Skrrmrchoh.

Что не так с моим кодом на Verilog? 2 мес. 3 нед. назад #7805

  • Meteor
  • Meteor аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 18
Не силен в верилоге, но меня смущает вот какой момент
В списке чувствительности перечислены все сигналы (тактовый, загрузки и очистки).
Мне кажется это неверным.
Обычно делаю (вхдл) в списке чувствительных один тактовый сигнал, а всякие служебные (загрузка, сброс, сдвиг и т.п.) записываются с каждым тактом в свои триггеры и по их состоянию происходит изменение состояний.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Что не так с моим кодом на Verilog? 2 мес. 2 нед. назад #7806

Да нет, я это не сам придумал, я в книжках такое вычитал.. Что-то вроде "Всегда указывайте в списке чувствительности все сигналы.".. Сейчас я остановился на варианте с синхонными LOAD и CLEAR, просто ставлю уровень и клокаю регистр когда надо.. Наверное, оно и правильнее так..
Спасибо.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Что не так с моим кодом на Verilog? 2 мес. 2 нед. назад #7807

  • Meteor
  • Meteor аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 18
Книги это правильно, только в них зачастую подразумевают асинхронный проект (без тактирования) и поэтому в списке чувствительности оказываются все сигналы.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.213 секунд
Работает на Kunena форум