2016-10-27 2 views
0

У меня есть module, в котором хранится растровое изображение разных символов, которое я планирую использовать для отображения текста на матрице. В настоящее время битмап заполнен файлом инициализации памяти, и этот файл передается как parameter (я подтвердил, что это работает в Quartus и ModelSim).Использование массива параметров для генерации модулей

Для того чтобы иметь реальную таблицу поиска для всех символов, я хотел сделать отдельный module, который содержит экземпляры всех растровых изображений и выбирает правильный, основанный на символьном коде. Эти битмап-копии создаются в блоке generate, и они берут правильное имя файла из массива. Однако ModelSim это не нравится. Мой код выглядит следующим образом:

module mem_char_disp_lib(
    output logic pixel, 
    input logic [4:0] x, 
    input logic [5:0] y, 
    input logic [6:0] code, 
    input logic clk 
); 
    localparam CHAR_NUM = 26; 
    logic [CHAR_NUM-1:0] alphabet; 

    const var [CHAR_NUM-1:0] BITMAPS = { 
     "/mem/char/A.hex", 
     "/mem/char/B.hex", 
     "/mem/char/C.hex", 
     // ... a lot more declarations here... 
     "/mem/char/X.hex", 
     "/mem/char/Y.hex", 
     "/mem/char/Z.hex" 
    }; 

    genvar i; 
    generate 
     for (i=0; i<CHAR_NUM; i=i+1) begin : mem_char_disp_blocks 
      mem_char_disp #(.BITMAP(BITMAPS[i])) block (
       .pixel(alphabet[i]), 
       .x, .y, .clk, 
       .code(i), 
       .data(1'b0), 
       .write_en(1'b0) 
      ); 
     end 
    endgenerate 

    always_comb 
     pixel = alphabet[code]; 

endmodule 

Ошибка ModelSim дает мне это:
The expression for a parameter actual associated with the parameter name ('BITMAP') for the module instance ('block') must be constant. (со ссылкой на линии внутри цикла for)

Я не знаю, почему это не работает. На аппаратном уровне кажется, что я просто делаю много копий модуля и слегка настраиваю каждый с постоянным параметром, известным во время компиляции. Есть ли какой-то базовый синтаксис, который мне не хватает?


Edit: Я также попытался следующий код, который, кажется, дают ошибку времени выполнения:

for (i=0; i<CHAR_NUM; i=i+1) begin : mem_char_disp_blocks 
    parameter [CHAR_NUM-1:0] BITMAPS = { 
     "/mem/char/A.hex", 
     // more elements... 
     "/mem/char/Z.hex" 
    }; 
    mem_char_disp #(.BITMAP(BITMAPS[i])) block (
     .pixel(alphabet[i]), 
     .x, .y, .clk, 
     .code(i), 
     .data(1'b0), 
     .write_en(1'b0)); 
end 

Ошибка Module parameter 'BITMAP' not found for override. (Одна из этих ошибок для каждой из сгенерированных модулей; CHAR_NUM.) Это не имеет для меня смысла, так как экземпляр одного файла напрямую работает просто (например, mem_char_disp #(.BITMAP("/mem/char/A.hex") block /* ... */).

ответ

2

A const переменная не является константой - это переменная write-once, которая инициализируется во время выполнения при передаче переменной. Вам потребуется parameter или localparam, чтобы назначить другому параметру, который был обнаружен в вашем обновлении. Кроме того, необходимо зафиксировать размеры массива

parameter bit [1:15*8] BITMAPS[26] = { 
     "/mem/char/A.hex", // 15 8-bit chars 
     // more elements... 
     "/mem/char/Z.hex" // 26 elements 
    }; 

не может помочь вам с вашей последней ошибкой, не видя объявление модуля mem_char_disp

+0

Оказывается, проблемы со второй ошибкой была с моей компиляцией сценарий; тестовые узлы в модуле 'mem_char_disp' работали, но они не были в модуле' mem_char_disp_lib'. Спасибо! –

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