У меня есть 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 /* ... */
).
Оказывается, проблемы со второй ошибкой была с моей компиляцией сценарий; тестовые узлы в модуле 'mem_char_disp' работали, но они не были в модуле' mem_char_disp_lib'. Спасибо! –