Почему 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), и я не могу быть уверен, как это будет синтезироваться. Если это невозможно, я надеюсь, что сборка будет аварийной, но сборка может привести к неожиданным результатам.

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

Итак, второе, что вам нужно сделать, это проверить ваши предупреждения. Инструмент синтеза будет жаловаться на вещи, и он может включать ядовитое предупреждение о некоторых сигналах, с которыми вы работаете. Если говорят, что один из сигналов, с которыми вы работаете (проверьте эти три сигнала в вашем заявлении на присваивание), всегда находится на высоком уровне или всегда на низком уровне, у вас может быть состояние, которое означает, что вы не можете писать, или вы можете ' читать или оба. Это приведет к тому, что оперативная память не будет выведена. Нет смысла делать память, которая не умеет писать, верно? Вы всегда будете читать нули, поэтому я просто подключу шину данных к нулю для вас и с этим покончим.

Другие вопросы по тегам