Jump to content

    
Sign in to follow this  
demsp

Симуляция счётчика в ModelSim

Recommended Posts

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

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

post-102435-1527611175_thumb.png

Share this post


Link to post
Share on other sites

Задайте начальное значение счетчику (обнулите).

Вы же сигналу clk в тестбенче задали начальное значение перед инверсией.

Share this post


Link to post
Share on other sites

Спасибо. А как это сделать? Если написать

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".

 

Наверное, надо делать счётчик с загрузкой и загружать значение "ноль"

Edited by demsp

Share this post


Link to post
Share on other sites

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

Делаете дополнительный вход (reset, например) и по нему обнуляете.

 

А если совсем по простому, то можно попробовать так (по крайней мере в sv)

module count (input clk, 
output reg [1:0]counter = 0);
always @(posedge clk) 
counter <= counter + 1; 
endmodule

 

 

Share this post


Link to post
Share on other sites

Асинхронный сброс

 

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

 

Share this post


Link to post
Share on other sites
Подскажите, как запустить счетчик, чтобы вместо красных линий (нулей) были зелёные линии

Quartus знает, что при включении питания регистры инициализируются нулями. А вот Modelsim про это не знает, и инициализирует регистры неопределенным значением.

Вывод: в файле описания счетчика принудительно проинициализировать регистры.

Share this post


Link to post
Share on other sites

Еще давно, когда только начинал изучать Verilog, коллега поделился мудростью. Применял подобную схему в своих проектах, никогда проблем не возникало.

 

 

 

Share this post


Link to post
Share on other sites
Еще давно, когда только начинал изучать Verilog, коллега поделился мудростью. Применял подобную схему в своих проектах, никогда проблем не возникало.

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

Вот видимо и ваш коллега тоже любит через Альпы и шаблоны ему не указ...

 

 

Share this post


Link to post
Share on other sites
Еще давно, когда только начинал изучать Verilog, коллега поделился мудростью. Применял подобную схему в своих проектах, никогда проблем не возникало.

Значит Вы очень везучий человек :biggrin: .

 

Share this post


Link to post
Share on other sites
Даже слишком асинхронный, очень даже слишком, чтобы его другим предлагать...

Откуда такое откопали?

Всегда так делали. А в чём, собственно, проблемы?

У асинхронного сброса есть одно неустанимое преимущество: для него не нужен клок. В отличие от.

Share this post


Link to post
Share on other sites
Всегда так делали. А в чём, собственно, проблемы?

У асинхронного сброса есть одно неустанимое преимущество: для него не нужен клок. В отличие от.

А просто взять шаблон простейшего счетчика из учебника или из того же Моделсима без отдельного триггера для сигнала сброс, слабо было?

 

Share this post


Link to post
Share on other sites
А просто взять шаблон простейшего счетчика из учебника или из того же Моделсима без отдельного триггера для сигнала сброс, слабо было?
Он его, Иосиф Григорьевич, "недосинхронизировал" ))

Спасибо за всю серию в общем и за статью "Краткий курс HDL. Часть 10. Несколько слов о «сбросе»" в частности )

 

Share this post


Link to post
Share on other sites
Он его, Иосиф Григорьевич, "недосинхронизировал" ))

Спасибо за всю серию в общем и за статью "Краткий курс HDL. Часть 10. Несколько слов о «сбросе»" в частности )

И где же тут "недосинхронизация" ?

Share this post


Link to post
Share on other sites
И где же тут "недосинхронизация" ?

Приходит асинхронный сброс на триггер.

И загоняет его в метастабильное состояние.

И этот нестабильный сброс с выхода триггера сбрасывает счетчик.

Или не сбрасывает.

Или недосбрасывает.

Как повезет.

 

Если в проекте в верхнего уровня есть reset bridge - то данный триггер не несет никакого смысла.

Если в проекте в верхнего уровня нет reset bridge - то данный триггер не несет никакого смысла.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this