2015-03-11 3 views
4

Я новичок в FPGA. Я делал несколько простых тестов, и я нашел проблему, которую я не совсем понимаю.VHDL целочисленный диапазон включительно? Разница в FPGA против моделирования

У меня есть источник тактовой частоты 50 МГц.

У меня сигнал определяется как:

SIGNAL ledCounter : integer range 0 to 25000000 := 0; 

Когда ledCounter достигает 25000000 Я переключение светодиода и сброс счетчика. Это отлично работает непосредственно на FPGA.

IF (rising_edge(CLK)) THEN 
    ledCounter <= ledCounter + 1; 

    IF (ledCounter = 25000000) THEN 
     ledCounter <= 0; 
     toggle <= not toggle; 
     LED(0) <= toggle; 
    END IF; 
END IF; 

При работе внутри ModelSim я получаю ошибку, когда счетчик достигает 25000000. Для того, чтобы запустить в симуляторе я должен определить диапазон, как:

SIGNAL ledCounter : integer range 0 to 25000001 := 0; 

Кто-нибудь есть какие-либо понять, почему это происходит? Код работает на FPGA колодец, но не будет работать в симуляторе без указанной выше модификации.

EDIT: Ошибка модели не описана: не может продолжаться из-за фатальной ошибки. Последовательность вызовов HDL. Остановлен на C: /Users/robert/Documents/fpga/testsim/test.vhd 20 Технологическая линия__17

+0

Возможно, вы пытаетесь увеличить счетчик за пределами 25000000 в моделировании? Это, вероятно, приведет к ошибке за пределами границ в симуляции, но может привести к разному поведению (например, обертыванию) в аппаратном обеспечении. – Josh

+1

Если вы разместите точную ошибку, которую вы получите от ModelSim, это поможет людям более эффективно ответить на ваш вопрос. (Скорее всего, вы каким-то образом увеличиваете счетчик вне пределов, но это просто предположение, основанное на личном опыте, не видя сообщение об ошибке.) – wjl

+0

Я обновил код, чтобы включить приращение. Это очень простая программа. Я не думаю, что я увеличиваю предел. Кроме того, на FPGA светодиод успешно переключается, когда ledCounter = 25000000, поэтому я уверен, что нет никаких обворовов или чего-либо еще. @Josh – RobC

ответ

6

Это происходит потому, что перед компарадионом происходит линия ledCounter < = ledCounter + 1. Даже если значение ledCounter на самом деле не достигнет 25000001, поскольку оно переопределено следующими операторами, на данный момент это запланировано, чтобы достичь этого, вызывая ошибку моделирования. Вы можете решить эту проблему легко перемещая приращение в другое отделение:

IF (rising_edge(CLK)) THEN 
    IF (ledCounter = 25000000) THEN 
     ledCounter <= 0; 
     toggle <= not toggle; 
     LED(0) <= toggle; 
    ELSE 
     ledCounter <= ledCounter + 1; 
    END IF; 
END IF; 

Таким образом, ledCounter никогда не планируется быть 25000001 и не будет происходить никаких ошибок. Обратите внимание, что оба кода ведут себя точно так же.

+0

Спасибо! Это фиксировало симуляцию. – RobC

+2

IEEE Std 1076-2008, 10.5.2.2 Выполнение простого оператора присваивания, пункт 6: «Для выполнения простого оператора присваивания формы сигнала, цель которого имеет скалярный тип, сначала оценивается форма волны с правой стороны. Это также ошибка, если значение любого выражения выражения в форме волны не относится к подтипу цели. " – user1155120

Смежные вопросы