<bit half-byte byte ...> доступ к памяти в 32-битной памяти с помощью verilog - PullRequest
0 голосов
/ 31 января 2012

Это моя синтезируемая модель памяти в Verilog.

    module memory(
        output reg [31:0] data_out,
        input [31:0] address,
        input [31:0] data_in, 
        input write_enable,
        input clk
    );
        reg [31:0] memory [0:255];

        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
            data_out <= memory[address];
        end

    endmodule

Например:

memory[32'h10] содержит 0xAAAAAAAA

Я просто хочу записать один байт данных 0xFF в память address 0x10, чтобы

memory[32'h10] содержит 0xFFAAAAAA

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

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012
  1. Вы объявили только 256 слов 32-разрядных, но ваша адресная шина имеет 32-разрядную ширину, что позволяет использовать до 2 ^ 32 слов 32-разрядных. Возможно, вы захотите уменьшить ширину адресной шины до 8 бит, чтобы она соответствовала количеству объявленных вами слов.

  2. Для ПЛИС Xilinx я использую инструмент CORE Generator, чтобы создать один или несколько блоков BlockRAM нужной ширины и глубины. BlockRAM имеют возможность поддержки отдельных разрешений байтов.

  3. Этот код может работать, но я не пробовал

    module memory (
        output reg [31:0] data_out,
        input [7:0] address,
        input [31:0] data_in, 
        input [3:0] write_enable,
        input clk
    );
    
    reg [31:0] memory [0:255];
    
    reg [31:0] memory_in = 0; // wire reg
    
    always @* begin : combinational_logic
        memory_in = memory[address];
        if (write_enable[3])
            memory_in[31:24] = data_in[31:24];
        if (write_enable[2])
            memory_in[23:16] = data_in[23:16];
        if (write_enable[1])
            memory_in[15:8] = data_in[15:8];
        if (write_enable[0])
            memory_in[7:0] = data_in[7:0];
    end
    
    always @(posedge clk) begin : sequential_logic
        if (|write_enable) begin
            memory[address] <= memory_in;
        end
        data_out <= memory[address];
    end
    

    endmodule

1 голос
/ 01 февраля 2012

Что такое «хороший путь», зависит от вашей цели синтеза.Если это FPGA, вы должны учитывать, что побитный доступ для записи больших объемов памяти, как правило, не очень хорошая идея.Это, возможно, предотвратит отображение памяти на ресурсы ОЗУ, что значительно увеличит затраты на маршрутизацию.

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

...