Почему Xilinx ISE не выводит блок оперативной памяти?
Как следует из заголовка, у ISE возникают проблемы с выводом блока RAM из моего кода.
wire we;
reg hold = 0;
reg start = 0;
reg [12:0] addr = 0;
reg [23:0] command = 0;
reg [7:0] RAM [8191 : 0];
reg [7:0] rx_data_buffer = 0;
assign we = new_rx_data && !hold && start;
always@(posedge clk) begin
new_tx_data <= 1'b0;
if(!tx_busy && hold && !new_tx_data) begin
new_tx_data <= 1'b1;
addr <= addr + 1'b1;
tx_data_buffer <= RAM[addr];
if(addr == 13'd8191)
hold <= 0;
end
else if(new_rx_data && !hold) begin
addr <= addr + 1'b1;
command <= {command[15:0], rx_data};
if(addr == 13'd8191)
hold <= 1;
if(start)
led <= rx_data;
end
if(we)
RAM[addr] <= rx_data;
if(command == 24'h242424) //$$$ in ASCII
start <= 1;
end
Я пришел к выводу, что корень проблемы - сигнал разрешения записи для моей оперативной памяти. Если я установлю его на VCC, написав
if(1'b1)
RAM[addr] <= rx_data;
ISE выводит оперативную память без проблем. Тем не менее, это не мое намерение. Я хочу, чтобы сигнал разрешения записи был
assign we = new_rx_data && !hold && start;
Независимо от того, какой регистр я назначаю "мы", ISE говорит мне, что это будет выводить распределенную оперативную память. Кто-нибудь имел дело с этим вопросом раньше?
1 ответ
У вас есть пара вещей, которые, вероятно, необходимо решить. Я вижу, вы используете new_rx_data для вашего назначения мы. Я не вижу его назначенным в вашем RTL. Это плавает? или вход?
Адр назначается в IF и ELSEIF. ELSE нет, так что, на мой взгляд, это означает, что он не назначается при определенных условиях. Может быть, это просто сохраняет ценность, но опять же, я не предпочитаю это делать.
Другое - это то, что вы назначаете с использованием неблокирующих назначений и, возможно, назначаете одну и ту же переменную дважды (см. New_tx_data), и я не могу быть уверен, как это будет синтезироваться. Если это невозможно, я надеюсь, что сборка будет аварийной, но сборка может привести к неожиданным результатам.
Сказав это, вы должны исправить эти вещи, чтобы убедиться, что ваши результаты моделирования соответствуют реальным результатам. Вы симулятор, который говорит, что нечетные назначения в порядке, и инструмент физического синтеза, который решает проблему по-другому, оба результата, вероятно, будут отличаться.
Итак, второе, что вам нужно сделать, это проверить ваши предупреждения. Инструмент синтеза будет жаловаться на вещи, и он может включать ядовитое предупреждение о некоторых сигналах, с которыми вы работаете. Если говорят, что один из сигналов, с которыми вы работаете (проверьте эти три сигнала в вашем заявлении на присваивание), всегда находится на высоком уровне или всегда на низком уровне, у вас может быть состояние, которое означает, что вы не можете писать, или вы можете ' читать или оба. Это приведет к тому, что оперативная память не будет выведена. Нет смысла делать память, которая не умеет писать, верно? Вы всегда будете читать нули, поэтому я просто подключу шину данных к нулю для вас и с этим покончим.