2017-02-22 40 views
-1

Я разработал простой счетчик. Код ниже.Дифференциал между симуляцией и синтезами верилога всегда блокирует

input sig; 
reg [3:0] cnt; 
always @(sig) begin 
    if(sig) 
     cnt = cnt + 1; 
end 

Моделирование с помощью Modelsim работает правильно. Я реализовал код на fpga (Spartan 6 by ise 14.7), когда sig высок, счетчик постоянно подсчитывается !!!? извините за мой плохой английский.

ответ

3

Вы говорите, что симуляция на Modelsim «работает правильно», но не указывайте, как вы определяете «правильно». Я имитировал его, и ничего интересного не происходит вообще: cnt остается на 4'bx, потому что у вас нет механизма для его инициализации. Я бы предположил, что вы намереваетесь cnt для увеличения на каждом переднем фронте sig. Это происходит, если вы инициализируете cnt (см закомментированы код):

https://www.edaplayground.com/x/4zXf

Однако, в то время как этот код может быть синтезирован, это не синхронным дизайна, и поэтому он синтезирует глупость (сумматор и четыре защелки). Предполагая, что вы действительно требуют cnt прирастить на каждом нарастающем фронте sig, вы должны увеличивать эту конструкцию синхронно:

always @(posedge sig) 
    cnt <= cnt + 1; 

Это синтезируют в сумматор и четырех D-типа флип-флоп.

Нормально сбросить счетчик, поскольку в противном случае в реальном оборудовании счетчик будет иметь неизвестное значение (отсюда 4'bx в симуляции). Вы можете уйти с инициализацией cnt в FPGA:

reg [3:0] cnt = 4'b0; 

но вы можете рассмотреть сигнал сброса вместо:

always @(posedge sig, posedge reset) 
    if(reset) 
    cnt <= 4'b0; // or some other reset value 
    else 
     cnt <= cnt + 1; 

Я обеспокоен ваше наименование sig; большинство людей назвали бы это clk или clock или что-то подобное. Это название говорит о том, что вы, возможно, не знакомы с синхронным дизайном. Если это так, вы должны узнать об этом, а также прочитать этот ответ here.