Подтвердить что ты не робот

Лучший способ кодирования ОЗУ в Verilog

Какой код лучше писать в ОЗУ?

  • назначение data_out внутри блока always:

    module memory(
        output reg [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
            data_out <= memory[address];
        end
    
    endmodule
    
  • назначение data_out с помощью инструкции assign:

    module memory(
        output [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
        end
    
        assign data_out = memory[address];
    
    endmodule
    

Любые рекомендации?

4b9b3361

Ответ 1

Это зависит от ваших требований.

  • Это регистрирует выход вашей памяти. Если вы синтезируете это на воротах, у вас будет еще 16 триггеров, чем в случае 2. Это означает, что вы используете немного больше области. Это также означает, что ваш выход будет иметь меньшую задержку распространения относительно часов, чем случай 2. Кроме того, выходные данные будут недоступны до следующего тактового цикла.

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

Вам нужно решить, какой из них использовать в соответствии с вашими требованиями.

Третий вариант - использовать сгенерированное ОЗУ, которое является жестким макросом. Это должно обладать областью, мощностью и, возможно, временными преимуществами в обоих случаях 1 и 2.

Ответ 2

чтобы добавить к инструментальному ответу - если вы используете метод асинхронного чтения (случай 2), он не будет отображаться в блоке ОЗУ в FPGA, так как блоки RAM на всех основных архитектурах, о которых я знаю, имеют синхронное чтение.

Ответ 3

Обе формы действительны в зависимости от типа конвейерной линии, которую вы хотите. Я всегда рекомендую следовать правилам кодирования Xilinx RAM - это хороший способ убедиться, что код синтезируется в правильные конструкции FGPA.

Например, ваш пример 1 будет синтезирован в Xilinx BRAM (т.е. выделенный Block Ram), так как он синхронно читается, и ваш пример 2 будет синтезироваться в Xilinx Distributed Ram (так как это асинхронное чтение).

См. рекомендации по кодированию в документе Xilinx UG901 (Руководство пользователя Vivado Design Suite) в разделе "Методы кодирования ОЗУ HDL". Он также имеет хорошее описание разницы между синхронным чтением и асинхронным чтением для ОЗУ.

Ответ 4

Во второй программе произошла ошибка компиляции, поскольку мы не можем "присвоить" значение "Reg". Это приведет к ошибке: " Регистрация незаконна в левой части непрерывного назначения