2015-07-24 7 views
0

Я довольно новичок в программировании Verilog/FPGA, и я пытаюсь реализовать UART. Мой источник основан на учебнике fpga4fun.com. Мой код выглядит следующим образом:Утверждение при запуске синтеза для Verilog UART

module async_transmitter(
    input clk, 
    input TxD_start, 
    input [7:0] TxD_data, 
    output TxD, 
    output TxD_busy 
); 

parameter ClkFrequency = 25000000; // 25MHz 
parameter Baud = 115200; 

generate 
    if(ClkFrequency<Baud*8 && (ClkFrequency % Baud!=0)) ASSERTION_ERROR PARAMETER_OUT_OF_RANGE("Frequency incompatible with requested Baud rate"); 
endgenerate 

// ... do something more 

endmodule 

Данные значения являются значениями по умолчанию, которые включены в учебник. Но когда я пытаюсь синтезировать код, он всегда терпит неудачу при условии if.

Для async_receiver я получаю тот же результат:

module async_receiver(
    input clk, 
    input RxD, 
    output reg RxD_data_ready = 0, 
    output reg [7:0] RxD_data = 0, 
    output RxD_idle, // asserted when no data has been received for a while 
    output reg RxD_endofpacket = 0 // asserted for one clock cycle when a packet has been detected (i.e. RxD_idle is going high) 
); 

parameter ClkFrequency = 25000000; // 25MHz 
parameter Baud = 115200; 

parameter Oversampling = 8; 

generate 
    if(ClkFrequency<Baud*Oversampling) ASSERTION_ERROR PARAMETER_OUT_OF_RANGE("Frequency too low for current Baud rate and oversampling"); 
    if(Oversampling<8 || ((Oversampling & (Oversampling-1))!=0)) ASSERTION_ERROR PARAMETER_OUT_OF_RANGE("Invalid oversampling value"); 
endgenerate 


// ... do something more 

endmodule 

PlanAhead говорит мне, что оба, если условия были выполнены на стороне приемника. Но, например, когда я вычисляю Oversampling * Baud (8 * 115200) = 921600, который на самом деле меньше 25000000. Любая идея, что я делаю неправильно здесь?

+0

Какая ошибка вы получаете во время синтеза? – wilcroft

+0

Он говорит мне: «[HDLCompiler 24] ASSERTION_ERROR ожидает 0 аргументов», потому что МОДУЛЬ ASSERTION был определен без каких-либо аргументов, чтобы в случае необходимости мог вынести ошибку утверждения. Модуль ASSERTION_ERROR определяется как «module ASSERTION_ERROR(); endmodule« Он включен в пример с сайта fpga4fun.com ... – Nrgyzer

ответ

0

У вас есть определение модуля для ASSERTION_ERROR, то это было бы моим первым предположением.

Я пробовал HDL на Quartus 13.0sp1, используя те же параметры, и у меня нет ошибок - в настоящее время у меня нет ISE/PlanAhead, поэтому он может быть изолирован от этого. Я могу подтвердить, что генерация «работает» правильно, уменьшая ClkFrequency или увеличивая Baud. Дважды проверьте, что у вас есть правильные значения, и что они не переписываются каким-либо модулем, создающим async_transmitter.

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

+0

Я, наконец, решил проблему, прокомментировав эту строку, и все работает нормально. Спасибо за ваше предложение :) – Nrgyzer

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