-
kolyan
-
Автор темы
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 0
-
-
|
Я понимаю, что можно в железо лить и не париться, но симулировать - удобней. И не надо тестер логических уровней доставать, все на картинке и сразу.
Сейчас, вложенных модулей - нет, но не работает.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от kolyan.
|
-
Meteor
-
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 18
-
-
-
-
|
Есть еще одна особенность между квартусом и моделсимом.
Дело в том, что моделсим - "зануда" - и когда делается счетчик, подобно Вашему count<=count+1, да еще с отсутствием начальной инициализации или сигнала сброса - он (моделсим) начинет выкобениваться, мол "а какое мне значение вывести если вы не сказали с какого числа мне начинать счет?".
Железяка тем отличается, что начав считать не с нуля, очень быстро дойдет до "истинного" начала и на выходе получится желаемый результат.
Рекомендация простая:
1) ввести сигнал сброса и в начале моделирования обнулить счетчик и регистры;
2) в самом начале (с верилогом не дружу) написать что счетчик равен нулю.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Meteor.
|
-
kolyan
-
Автор темы
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 0
-
-
|
Спасибо, попробую. Только, непонятно (пока), как это сделать.
Видимо:
@поискать надо что тут написать. Но, тут - разберусь.
Начальные параметры меня давно беспокоили, но я думал, что они тупо - нули (Т.к., нигде акцентов - нет на такой важный момент). Надо будет еще почитать что-то.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от kolyan. Причина: Дополнил
|
-
kolyan
-
Автор темы
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 0
-
-
|
Да, Вы были абсолютно правы.
Жаль, что поблагодарить можно только один раз.
Сделал некий фиктивный ресет и все полетело.
always @( posedge clock ) begin
if ( reset ) begin
count <= 25'd0;
res <= 7'd0;
end else begin
Но стало еще веселей.
Т.е., он симулирует два шага и помирает...
`timescale 1 ns/ 1 ps
module test_vlg_tst();
reg clock;
reg reset;
wire [7:0] data_out;
test i1 (
.clock(clock),
.data_out(data_out),
.reset(reset)
);
initial begin
clock = 0;
reset = 0;
$display("Running testbench");
end
always begin
#10 clock = ~clock;
end
initial begin
#20 reset = ~reset;
#20 reset = ~reset;
end
initial begin
#300 $stop;
end
endmodule
ЗЫ
Да, вместо ресета еще прокатывает такая конструкция:
reg first_step;
always @( posedge clock ) begin
if ( first_step ) begin
count <= 25'd0;
res <= 7'd0;
first_step <= 0;
end else begin
...
Но, пока ресет оставил для опытов.
ЗЫЫ
В любом случае, огромное СПАСИБО. Яб никогда не догадался, что он от меня хочет. :)))
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от kolyan. Причина: Опечатка
|
-
Meteor
-
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 18
-
-
-
-
|
Могу порекомендовать поступить следующим образом: выведите состояние счетчика в отдельные порт и прогоните симуляцию. Мне несколько непонятна Ваша конструкция
case(count)
bla bla bla
end case;
Не очень понимаю когда должно происходить увеличение другого счетчика res. Когда count>0, или как?
В любом случае, вывод состояния count даст возможность посмотреть считает ли счетчик на каждом такте.
На всякий случай, прежде чем что-то делать, наведите курсор на окошко с временной диаграммой, нажмите кнопку мыши на ВД, а затем попробуйте нажать кнопку минус - она уменьшает масштаб. Может Вы банально не видите продолжение. Если моделсим останавливается он высказывает свое недовольство в окне transcript.
Когда Вы увидите что граница отображения уже явно близка к середине экрана, в transcript наберите run 100 (или любое другое значение) времянка должна дополнительно отработать указанное время.
И еще, напоследок, я при отработки в моделсиме пользуюсь do файлами. пример можно в скрине узреть. Его достоинство, что после всех манипуляций с компилированием я просто набираю команду
do имя_файла.do
В нем можно задать и время работы и какую часть отобразить по окончанию симуляции.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
kolyan
-
Автор темы
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 0
-
-
|
>Мне несколько непонятна Ваша конструкция
>case(count)
>bla bla bla
>end case;
Это - фигня. Я так понял, что if-ы в ПЛИС дурной тон и все кейсами пользуются (если возможно).
Это равносильно
if ( count == 25'b0000000000000000000000001 ) begin // тут уменьшил, чтоб не симулировать много. Двух тактов для понимания (не глазами) достаточно.
res <= res+1; // По переполнению, само обнулится и сначала начнет. :))))) В этом железо лучше софта.
end
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от kolyan.
|
-
Meteor
-
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 18
-
-
-
-
|
kolyan пишет: Я так понял, что if-ы в ПЛИС дурной тон и все кейсами пользуются (если возможно).
Все не так)))
Что ифы, что кейсы они синтезируются одинаково и в последующем проявляются в виде мультиплексоров. Тут больше дело либо привычки, либо предпочтений.
Во всяком случае я пользуюсь обоими типами, но на vhdl.
Что касается Вашего кода - долго ждать когда отработается 2^25 степени состояний. В данном варианте, ожидания не оправданы и результат действительно скорее будет получен в железе.
Но вдруг Вам придется отлаживать какую-нибудь более сложную обработку (подсчет контрольных сумм и т.п.) тут моделсим станет незаменим - всегда сможете создать файл с результатами исполнения задачи и проверить либо вручную, либо в какой-либо программе (матлаб, лабвью и т.д.)
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Meteor.
|
-
kolyan
-
Автор темы
-
Не в сети
-
Осваиваюсь на форуме
-
-
Сообщений: 31
-
Спасибо получено: 0
-
-
|
В общем, разобрался.
Очень удивило, что внутри case нельзя обнулить регистр, от которого этот кейс зависит.
Вот так вот (Вдруг, кто-то столкнется, чтоб ответ был), работает как надо и в железе и в симуляторе.
always @( posedge clock ) begin
if ( reset || count == COUNT_FULL ) begin
count <= 25'd0;
res <= 7'd0;
end else begin
case ( count )
COUNT_EVENT: res <= res+1;
COUNT_FULL: res <= 7'd0;
endcase
data_out <= ~res;
count <= count+1;
end
end
Так не работало (он не обнулялся, а тупо считал дальше):
case ( count )
COUNT_EVENT: res <= res+1;
COUNT_FULL: begin res <= 7'd0; count <= 25'd0 end
endcase
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 1.123 секунд