Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Изменение содержимого ROM без перекомпиляции проекта (ISE)
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
BSACPLD
Когда я работал с Quartus, то для обновления содержимого ROM было достаточно выполнить команду Update Memory Initialization File.
Как сделать то же самое в ISE?
Dmitriyspb
Цитата(BSACPLD @ Feb 27 2013, 13:07) *
Когда я работал с Quartus, то для обновления содержимого ROM было достаточно выполнить команду Update Memory Initialization File.
Как сделать то же самое в ISE?


К сожалению в ISE одним кликом не обойтись. Необходимо зайти в настройки ROM и указать новый путь к файлу с содержимым, а потом заново сгенерить ROM.
dsmv
data2mem - обновляет содержимое памяти непосредственно в bit файле
BSACPLD
Цитата(Dmitriyspb @ Feb 27 2013, 13:49) *
К сожалению в ISE одним кликом не обойтись. Необходимо зайти в настройки ROM и указать новый путь к файлу с содержимым, а потом заново сгенерить ROM.

Но ведь в данном случае получается полная перекомпиляция проекта, а это не удовлетворяет условиям поставленной задачи.

Цитата(dsmv @ Feb 27 2013, 14:04) *
data2mem - обновляет содержимое памяти непосредственно в bit файле

А можно немного поподробнее.
И как быть если память сделана не с помощью Coregen, а описана на Verilog с инициализацией через readmemh?
Dmitriyspb
Цитата(BSACPLD @ Feb 27 2013, 14:24) *
Но ведь в данном случае получается полная перекомпиляция проекта, а это не удовлетворяет условиям поставленной задачи.


А можно немного поподробнее.
И как быть если память сделана не с помощью Coregen, а описана на Verilog с инициализацией через readmemh?


Я конечно мог сильно отстать от жизни, но как вы планируете из менить содержимое памяти и не перекомпелировать проект?!
Нет разницы между тем каким образом была создана память.... перекомпелировать проект в любом случае придётся.
Если память писанная на veriloge, то необходимо заменить файл с содержимым памяти, а потом попросить ise вновь скомпилировать проект.
В итоге содержимое памяти будет изменено. А как иначе еще?
BSACPLD
Цитата(Dmitriyspb @ Feb 27 2013, 14:45) *
Я конечно мог сильно отстать от жизни, но как вы планируете из менить содержимое памяти и не перекомпелировать проект?!
Нет разницы между тем каким образом была создана память.... перекомпелировать проект в любом случае придётся.
Если память писанная на veriloge, то необходимо заменить файл с содержимым памяти, а потом попросить ise вновь скомпилировать проект.
В итоге содержимое памяти будет изменено. А как иначе еще?

В Quartus это делается путём изменения уже сгенерённых файлов.
Для каждой памяти создаётся mif файл в котором хранится образ памяти.
При генерации файла прошивки mif файлы вставляются в соответствующее место в sof и pof файлах.
Для изменения содержимого памяти достаточно обновить mif файлы и заново сгенерить sof и pof.
Т.е. не нужно перекомпилировать весь проект.

Мой вопрос состоит в том, как сделать то же самое в ISE.
klop
Цитата(Dmitriyspb @ Feb 27 2013, 14:45) *
Я конечно мог сильно отстать от жизни, но как вы планируете из менить содержимое памяти и не перекомпелировать проект?!
Нет разницы между тем каким образом была создана память.... перекомпелировать проект в любом случае придётся.
Если память писанная на veriloge, то необходимо заменить файл с содержимым памяти, а потом попросить ise вновь скомпилировать проект.
В итоге содержимое памяти будет изменено. А как иначе еще?


Еще раз - Data2Mem. Меняются биты в битстриме для конфигурации. Все работает.
vladec
По поводу data2mem, то он обновляет содержимое памяти непосредственно в битовом потоке (bit файл) без перекомпиляции проекта. Скачайте материал по Picobleze3 на Spartan3 у Xilinx, там дан этот тулз и описано как с ним работать.
Dmitriyspb
Цитата(vladec @ Feb 27 2013, 15:09) *
По поводу data2mem, то он обновляет содержимое памяти непосредственно в битовом потоке (bit файл) без перекомпиляции проекта. Скачайте материал по Picobleze3 на Spartan3 у Xilinx, там дан этот тулз и описано как с ним работать.

Так я никогда не делал. Дальше перехожу на сторону слушателей=)
BSACPLD
Про Data2Mem прочитал, но я так и не понял, как создавать *.bmm файл.
Допустим у меня есть вот такая память:
CODE

module program_ram
#(
parameter ADDR_WIDTH = 12,
parameter DATA_WIDTH = 16,
parameter INIT_FILE = "init_file.ver"
)
(
input clock_a,
input clock_b,
input addressstall_a,
input addressstall_b,
input [ADDR_WIDTH-1:0] address_a,
input [ADDR_WIDTH-1:0] address_b,
input [DATA_WIDTH-1:0] data_a,
input [DATA_WIDTH-1:0] data_b,
input wren_a,
input wren_b,
input enable_out_a,
input enable_out_b,
input aclr_out_a,
input aclr_out_b,
output reg [DATA_WIDTH-1:0] q_a,
output reg [DATA_WIDTH-1:0] q_b
) ;

reg [ADDR_WIDTH-1:0] address_reg_a ;
wire [ADDR_WIDTH-1:0] address_mux_a ;
reg [ADDR_WIDTH-1:0] address_reg_b ;
wire [ADDR_WIDTH-1:0] address_mux_b ;
reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0] /* synthesis syn_ramstyle = "no_rw_check" */ ;

integer i ;


initial begin
$readmemh (INIT_FILE, mem) ;

address_reg_a <= 0 ;
address_reg_b <= 0 ;
q_a <= 0 ;
q_b <= 0 ;
end


assign address_mux_a = (addressstall_a)? address_reg_a:address_a ;

always @(posedge clock_a) begin
address_reg_a <= address_mux_a ;
if (wren_a) mem[address_mux_a] <= data_a ;
end

always @(posedge clock_a or posedge aclr_out_a) begin
if (aclr_out_a) q_a <= 0 ;
else if (enable_out_a) q_a <= mem[address_reg_a] ;
end


assign address_mux_b = (addressstall_b)? address_reg_b:address_b ;

always @(posedge clock_b) begin
address_reg_b <= address_mux_b ;
if (wren_b) mem[address_mux_b] <= data_b ;
end

always @(posedge clock_b or posedge aclr_out_b) begin
if (aclr_out_b) q_b <= 0 ;
else if (enable_out_b) q_b <= mem[address_reg_b] ;
end


endmodule

Как мне создать для неё *.bmm файл?
Alex77
Я не гигант в ПЛИСах, но есть понятие (для Xilinx) память на BRAM и "распределённая".
так вот в BRAM содержимое памяти можно менять без компиляции всего проекта, а вот в случае с "распределённой" "затруднительно".
vladec
Если Вы читали тот материал по Picoblaze, то там указано, что bmm файл формируется из базы проекта - файла ncd при помощи утилиты pb_bmm.exe (pb_bmm %1.bmm %2.ncd). Это просто. Сложнее Вам будет создать .mem файл (файл содержимого памяти), для Picoblaze он создается ассемблером, а Вы можете попробовать сделать его либо в ассемблере, написав соответствующий исходный файл, либо создать в Коргенераторе .coe файл и отредактировать его нужным образом текстовым редактором.
BSACPLD
Цитата(vladec @ Feb 28 2013, 11:34) *
Если Вы читали тот материал по Picoblaze, то там указано, что bmm файл формируется из базы проекта - файла ncd при помощи утилиты pb_bmm.exe (pb_bmm %1.bmm %2.ncd). Это просто. Сложнее Вам будет создать .mem файл (файл содержимого памяти), для Picoblaze он создается ассемблером, а Вы можете попробовать сделать его либо в ассемблере, написав соответствующий исходный файл, либо создать в Коргенераторе .coe файл и отредактировать его нужным образом текстовым редактором.

А можно привести конкретные ссылки?
И где брать этот pb_bmm.exe? В папке с ISE14.1 его нет.
И что такого особенного в mem файле? Насколько я понял из UG658, mem файл имеет точно такой же формат как и файл для инициализации памяти на Verilog. Или это не одно и то же?
Я попробовал создать bmm файл вручную, как это описано в UG658, но при его использовании Data2MEM портит данные в bit файле.
Проверял я это следующим образом:
1. Сгенерил bit файл (test_cpu_1.bit).
2. Поменял два байта в файле инициализации памяти.
3. Пересобрал проект (test_cpu.bit).
4. Сравнил старый и новый файлы - они отличаются в 7 местах.
5. Обновил файл test_cpu_1.bit через Data2MEM - различие в 17 местах.
BSACPLD
С mem файлом разобрался. 08.gif
Теперь осталось разобраться с автоматической генерацией bmm файла.
vladec
Скачиваете у Xilinx материал по Пикоблейз3 ищите папку DATA2MEM_assistance и в ней все есть. Сам bmm, как я понимаю, позволяет найти в битовом потоке позицию с которой начинается блок нужной Вам памяти.
Дмитрий Мазунин
Всегда инициализируем брам в битстриме (зашиваем загрузчик).
BMM - карта брамов.
bitinit -p xc6slx75 ../system.mhs -bm ./system_bd.bmm -bt ./prepare_sys.bit -o ./download_sdk.bit -lp ../../../../IPlib/hw -pe microblaze_0 ../SDK/SDK_Projects/loader/Debug/loader.elf


BSACPLD
Цитата(Дмитрий Мазунин @ Mar 1 2013, 14:39) *
Всегда инициализируем брам в битстриме (зашиваем загрузчик).
BMM - карта брамов.
bitinit -p xc6slx75 ../system.mhs -bm ./system_bd.bmm -bt ./prepare_sys.bit -o ./download_sdk.bit -lp ../../../../IPlib/hw -pe microblaze_0 ../SDK/SDK_Projects/loader/Debug/loader.elf

Ну и какое отношение это имеет к моему вопросу о том, откуда брать bmm файл?

Цитата(vladec @ Mar 1 2013, 08:38) *
Скачиваете у Xilinx материал по Пикоблейз3 ищите папку DATA2MEM_assistance и в ней все есть. Сам bmm, как я понимаю, позволяет найти в битовом потоке позицию с которой начинается блок нужной Вам памяти.

pb_bmm.exe не работает с RAMB36 (Virtex-6).
vladec
На сколькоя я знаю, для Virtex6 Xilinx пока что такую штуку еще не сделал
Дмитрий Мазунин
Цитата(BSACPLD @ Mar 3 2013, 04:17) *
Ну и какое отношение это имеет к моему вопросу о том, откуда брать bmm файл?


BMM файл формируется при сборке системы автоматически. Лежит в каталоге system.
BSACPLD
Цитата(Дмитрий Мазунин @ Mar 4 2013, 09:49) *
BMM файл формируется при сборке системы автоматически. Лежит в каталоге system.

Это только для microblaze, для памяти, описанной на Verilog, BMM файл не создаётся.

Цитата(vladec @ Mar 4 2013, 09:20) *
На сколькоя я знаю, для Virtex6 Xilinx пока что такую штуку еще не сделал

В общем, у Xilinx как всегда всё через одно место.
Пришлось написать tcl скрипт для извлечения необходимой информации из ncd файла.
Скрипт и тестовый проект во вложении - может быть, кому-нибудь пригодятся.
Для RAMB36 пока есть небольшой глюк - скрипт не отрабатывает последние 8 байт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.