Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Симуляция счётчика в ModelSim
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
demsp
Подскажите, как запустить счетчик, чтобы вместо красных линий (нулей) были зелёные линии
Код
module count (input clk, output reg [1:0]counter);
always @(posedge clk)
counter <= counter + 1;
endmodule


Test bench
Код
module top;
   reg clk;
   wire [1:0] counter;
count tcount (clk, counter);
initial
  begin
    clk = 0;
    forever #10 clk = !clk;
  end
endmodule

Нажмите для просмотра прикрепленного файла
OM-S
Задайте начальное значение счетчику (обнулите).
Вы же сигналу clk в тестбенче задали начальное значение перед инверсией.
demsp
Спасибо. А как это сделать? Если написать
Код
module top;
   reg clk;
   wire [1:0] counter;
count tcount (clk, counter);
initial
  begin
    clk = 0;
    forever #10 clk = !clk;
    counter=0;
end
endmodule

то компилятор выдаёт ошибку Error: C:/.../tcount.v(9): (vlog-2110) Illegal reference to net "counter".

Наверное, надо делать счётчик с загрузкой и загружать значение "ноль"
OM-S
Да, конечно, нужно сделать синхонную загрузку или обнуление (что вам нужно по заданию) счетчика.
Делаете дополнительный вход (reset, например) и по нему обнуляете.

А если совсем по простому, то можно попробовать так (по крайней мере в sv)
Код
module count (input clk,
output reg [1:0]counter = 0);
always @(posedge clk)
counter <= counter + 1;
endmodule


[/quote]
Nieve
Асинхронный сброс

Код
module count
(
input clk_i,
input reset_i,
output out_o
);

reg rst_rg;
reg [2:0] cnt;

always @(posedge clk_i)
     begin
          rst_rg <= reset_i;
     end

always @(posedge clk_i or negedge rst_rg)
     begin
          if (!rst_rg) cnt <= 3'b0;
          else cnt <= cnt + 1'b1;
     end

assign out_o = cnt[0]; // Just an example
endmodule

Flip-fl0p
Цитата
Подскажите, как запустить счетчик, чтобы вместо красных линий (нулей) были зелёные линии

Quartus знает, что при включении питания регистры инициализируются нулями. А вот Modelsim про это не знает, и инициализирует регистры неопределенным значением.
Вывод: в файле описания счетчика принудительно проинициализировать регистры.
iosifk
Цитата(Nieve @ May 29 2018, 21:56) *
Асинхронный сброс

Даже слишком асинхронный, очень даже слишком, чтобы его другим предлагать...
Откуда такое откопали?
Nieve
Еще давно, когда только начинал изучать Verilog, коллега поделился мудростью. Применял подобную схему в своих проектах, никогда проблем не возникало.


iosifk
Цитата(Nieve @ May 29 2018, 22:54) *
Еще давно, когда только начинал изучать Verilog, коллега поделился мудростью. Применял подобную схему в своих проектах, никогда проблем не возникало.

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

Flip-fl0p
Цитата(Nieve @ May 29 2018, 22:54) *
Еще давно, когда только начинал изучать Verilog, коллега поделился мудростью. Применял подобную схему в своих проектах, никогда проблем не возникало.

Значит Вы очень везучий человек biggrin.gif .
andrew_b
Цитата(iosifk @ May 29 2018, 22:38) *
Даже слишком асинхронный, очень даже слишком, чтобы его другим предлагать...
Откуда такое откопали?
Всегда так делали. А в чём, собственно, проблемы?
У асинхронного сброса есть одно неустанимое преимущество: для него не нужен клок. В отличие от.
iosifk
Цитата(andrew_b @ May 30 2018, 07:55) *
Всегда так делали. А в чём, собственно, проблемы?
У асинхронного сброса есть одно неустанимое преимущество: для него не нужен клок. В отличие от.

А просто взять шаблон простейшего счетчика из учебника или из того же Моделсима без отдельного триггера для сигнала сброс, слабо было?
Marat Zuev
Цитата(iosifk @ May 30 2018, 07:09) *
А просто взять шаблон простейшего счетчика из учебника или из того же Моделсима без отдельного триггера для сигнала сброс, слабо было?
Он его, Иосиф Григорьевич, "недосинхронизировал" ))
Спасибо за всю серию в общем и за статью "Краткий курс HDL. Часть 10. Несколько слов о «сбросе»" в частности )
Nieve
Цитата(Marat Zuev @ May 30 2018, 23:01) *
Он его, Иосиф Григорьевич, "недосинхронизировал" ))
Спасибо за всю серию в общем и за статью "Краткий курс HDL. Часть 10. Несколько слов о «сбросе»" в частности )

И где же тут "недосинхронизация" ?
Flip-fl0p
Цитата(Nieve @ May 31 2018, 07:15) *
И где же тут "недосинхронизация" ?

Приходит асинхронный сброс на триггер.
И загоняет его в метастабильное состояние.
И этот нестабильный сброс с выхода триггера сбрасывает счетчик.
Или не сбрасывает.
Или недосбрасывает.
Как повезет.

Если в проекте в верхнего уровня есть reset bridge - то данный триггер не несет никакого смысла.
Если в проекте в верхнего уровня нет reset bridge - то данный триггер не несет никакого смысла.
Nieve
Не совсем. Сначала триггер синхронизируется по тактовой частоте, а только потом уже используется для асинхронного сброса.
Flip-fl0p
Цитата(Nieve @ May 31 2018, 07:42) *
Не совсем. Сначала триггер синхронизируется по тактовой частоте, а только потом уже используется для асинхронного сброса.

Тогда он не нужен совсем...
Выход с reset bridge делает асинхронный сброс синхронным тактовой. Больше никаких дополнительных триггеров не нужно.
P.S. Вы хоть читали статью "Краткий курс HDL. Часть 10. Несколько слов о «сбросе»"
andrew_b
Цитата(Flip-fl0p @ May 31 2018, 07:37) *
Приходит асинхронный сброс на триггер.
И загоняет его в метастабильное состояние.
Эм, может, я чего-то пропустил в этой жизни? Где это написано?
Flip-fl0p
Цитата(andrew_b @ May 31 2018, 08:08) *
Эм, может, я чего-то пропустил в этой жизни? Где это написано?

Так вот была предложена такая схема сброса:
Код
always @(posedge clk_i)
     begin
          rst_rg <= reset_i;
     end


Если сигнал reset_i - внешний и асинхронен тактовой, то триггер rst_rg перейдет в метастабильное состояние.
И соответственно применять выход rst_rg применять как асинхронный сброс - чревато проблемами.
А если сброс был синхронизирован раньше, то зачем вообще применять триггер rst_rg ?
Nieve
Цитата(Flip-fl0p @ May 31 2018, 04:44) *
Тогда он не нужен совсем...
Выход с reset bridge делает асинхронный сброс синхронным тактовой. Больше никаких дополнительных триггеров не нужно.
P.S. Вы хоть читали статью "Краткий курс HDL. Часть 10. Несколько слов о «сбросе»"

Да, причем в оригинале.
Скажу лишь одно, применял подобную схему во многих проектах (FPGA, ASIC) и никогда проблем со сбросом не наблюдалось. Спасибо за Ваше уточнение, а я обязательно проанализирую Ваше замечание.

Цитата(andrew_b @ May 31 2018, 05:08) *
Эм, может, я чего-то пропустил в этой жизни? Где это написано?

Насколько я понял, тут имеется в виду ситуация, когда сигнал сброса формируется по одной частоте, а схема работает по другой. В таком случае, после подачи сигнала сброса на триггер, он действительно может "свалиться" в метастабильное состояние.
andrew_b
Цитата(Nieve @ May 31 2018, 08:31) *
Насколько я понял, тут имеется в виду ситуация, когда сигнал сброса формируется по одной частоте, а схема работает по другой. В таком случае, после подачи сигнала сброса на триггер, он действительно может "свалиться" в метастабильное состояние.
Это странно. Сброс на то и сброс, чтобы переводить триггер в заведомо известное стабильное состояние. А вот снятие сброса в окрестности фронта клока может устроить метастабильность, тут я согласен.
Поэтому часто делают так: подача сброса асинхронно, снятие сброса синхронно.
Быстрый гуглинг: http://chipverification.blogspot.com/2008/...nous-reset.html
iosifk
Цитата(Marat Zuev @ May 31 2018, 01:01) *
Спасибо за всю серию в общем и за статью "Краткий курс HDL. Часть 10. Несколько слов о «сбросе»" в частности )

Вам спасибо, за то что читаете.
И если захотите обсудить, то могу еще кое-что рассказать "инженерное, чисто по жизни"... По скайпу...
Maverick
ТС почему Вы не хотите пользоваться описание из темплате:

Код
// Quartus Prime Verilog Template
// Binary counter

module binary_counter
#(parameter WIDTH=64)
(
    input clk, enable, reset,
    output reg [WIDTH-1:0] count
);

    // Reset if needed, or increment if counting is enabled
    always @ (posedge clk or posedge reset)
    begin
        if (reset)
            count <= 0;
        else if (enable == 1'b1)
            count <= count + 1;
    end

endmodule


???
Flip-fl0p
Код
ТС почему Вы не хотите пользоваться описание из темплате:

Могу предположить потому-что ему не нужен был изначально асинхронный сброс. Но нужна была начальная установка регистрам, для того, чтобы запускалось моделирование в Modelsim
iosifk
Цитата(Flip-fl0p @ May 31 2018, 12:02) *
Код
ТС почему Вы не хотите пользоваться описание из темплате:

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

А отсюда какой вывод?
Проще было взять "обычное шаблонное" описание с асинхронным сбросом, как это привел Маверик. В симуляторе не задумываясь использовать Сброс, подогнав его в тестбенче под такты. А в железе, если этот Сброс не нужен, то на самом верху приписать ему неактивное значение и компилятор его сожрет. При этом все делается совершенно без ошибок и не плодятся лишние версии описания...
Правда тогда нам всем нечего будет обсуждать, увы sad.gif
demsp
Да, спасибо, в реальной схеме сброс вообще не нужен, но в симуляции использую сброс для инициализации регистров нулями
Flip-fl0p
Цитата(demsp @ Jun 5 2018, 09:42) *
Да, спасибо, в реальной схеме сброс вообще не нужен, но в симуляции использую сброс для инициализации регистров нулями

Я бы не был таким категоричным. Например FPGA фирмы Actel не умеют инициализировать триггеры нужным значением(во всяком случае у них были такие FPGA). Там без начального сброса никуда....
А вообще советую ознакомиться: http://www.kit-e.ru/articles/circuit/2009_1_96.php
des333
Мода на асинхронный сброс не проходит sm.gif
sazh
Цитата(demsp @ Jun 5 2018, 09:42) *
Да, спасибо, в реальной схеме сброс вообще не нужен, но в симуляции использую сброс для инициализации регистров нулями



Код
`timescale 1 ns / 1 ps
module ct
(
input             clk,
output [1:0] counter
);

reg [1:0] counter_rg = 2'b00;

always @(posedge clk)
begin
counter_rg <= counter_rg + 1'b1;
end

assign counter = counter_rg;

endmodule

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.