sherr 0 5 апреля, 2010 Опубликовано 5 апреля, 2010 (изменено) · Жалоба создаю в BRAM (xc3s-50an) RAM 32768*1, Пытаюсь ее проинициализировать : module sram32_1 ( input wire clkm , input wire we , input wire [14:0] addr, input wire din, output wire dout ); // signal declaration reg ram [32767:0]; reg [14:0] addr_reg; // body initial $readmemd("xilinx_NEG_4k.hex",ram); always @(posedge clkm) begin if (we) // write operation ram [addr] <= din; addr_reg <= addr; end // read operation assign dout = ram[addr_reg]; endmodule Файл HEX точно соответствует размеру массива (4096 байт) - файл прилагаюxilinx_NEG_4k.zip После синтеза и заливки ничего ожидаемого не происходит - содержимое файла не выводится (на экран) Более того - выводится странный ворнинг : Node <sram32/Mram_ram2> of sequential type is unconnected in block <pong>. - хотя все адреса памяти обвязаны а ее общий обьем = 2 блока BRAM. Подскажите, что не так (до подключения памяти видеотест работал на реальном железе) - может файл не такой ? На всякий случай прикладываю остальные модули синхрогенератор module hvsg(clk, clk25, vga_h_sync, vga_v_sync, inDisplayArea, CounterX, CounterY); input clk; output vga_h_sync, vga_v_sync; output inDisplayArea; output [9:0] CounterX; output [9:0] CounterY; output clk25; ////////////////////////////////////////////////// reg clk25; always @(posedge clk)// VGA clock clk25 = ~(clk25); reg [9:0] CounterX; reg [9:0] CounterY; wire CounterXmaxed = (CounterX==799); always @(posedge clk25) begin if (CounterXmaxed) CounterX <= 0; else CounterX <= CounterX + 1; end always @(posedge clk25) begin if(CounterXmaxed) begin if(CounterY == 520) CounterY <= 0; else CounterY <= CounterY + 1; end end и основной модуль module pong(clk, vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B, Ledcont); input clk; output vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B, Ledcont; wire inDisplayArea; wire [9:0] CounterX; wire [9:0] CounterY; hvsg syncgen(.clk(clk),.clk25(clk25), .vga_h_sync(vga_h_sync), .vga_v_sync(vga_v_sync), .inDisplayArea(inDisplayArea), .CounterX(CounterX), .CounterY(CounterY)); sram32_1 sram32(.clkm(clkm), .we(we), .addr(addr), .din(din), .dout(dout)); reg [9:0] Timer1; wire clk1 = (vga_v_sync == 0); assign addr = {CounterY[8:2],CounterX[9:2]}; // do pixels 4*4 assign we = 0;// RAM as ROM assign din = 0; assign clkm = clk; reg Ledcont; // control LED always @( posedge clk1) // slow counter Timer1 <= Timer1 + 1; reg vga_R,vga_G,vga_B; always @(posedge clk ) begin vga_G <= dout & inDisplayArea;// memory to pixels vga_R <= Timer1[6] & inDisplayArea; vga_B <= Timer1[8]& inDisplayArea; Ledcont <= Timer1[8]; end endmodule p.s. извините, что так длинно :rolleyes: Изменено 5 апреля, 2010 пользователем sherr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 5 апреля, 2010 Опубликовано 5 апреля, 2010 · Жалоба Новую тему, по-моему, зря создали Вы немного невнимательны: - Файл HEX точно соответствует размеру массива (4096 байт) массив вы объявили у себя как 32768x1, чувствуете разницу? посмотрите еще раз пример.. - файл с хексами, а вы считываете их как десятичные - readmemd -> -||-h И отладку с помощью тестбенчей Вам придется освоить, если не хотите вечно делать один проект --------- может много критики, но так получилось.. главное - не бросайте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sherr 0 13 апреля, 2010 Опубликовано 13 апреля, 2010 · Жалоба Отвечаю сам себе - при такой разрядности памяти только $readmemb , причем файл должен быть строго следующего вида: 0 1 1 0 1 ..... и строго байт- в - байт нужного размера, дополнительный глюк был простой и глупый - при включении в код модуля нижнего уровня надо обьявлять в верхнем модуле входящие шины , а отдельные проводники - не обязательно, так компилятор вместо того чтобы вопить об ошибке, урезает шину до одного провода и ограничивается невнятным предупреждением. И отладку с помощью тестбенчей Вам придется освоить, если не хотите вечно делать один проект может много критики, но так получилось.. главное - не бросайте Тестбенчи начал осваивать, спасибо за поддержку, не брошу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 14 апреля, 2010 Опубликовано 14 апреля, 2010 · Жалоба не проще ли вам сделать память с 16-ти разрядными данными - reg [15:0] ram [2047:0]; использовать readmemh, и не переделывать входной файл Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 · Жалоба Здравствуйте! Чтоб новую тему не создвать сюда вопрос задам. Как инициализировать массив reg [3:0] sin [0:15]; Если для симуляции можно: initial begin sin[0] = 4'b0000; sin[1] = 4'b0001; sin[2] = 4'b0010; ... sin[15] = 4'b0111; end А для синтеза? Сколько вариантов есть и какие? (я так понимаю можно через $readmemb, в Simlify по крайней мере, как выше описано) Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 (изменено) · Жалоба Знаю только что в чистом Verilog можно сделать начальную инициализацию массива регистров через readmemx, или установить их при сбросе типа always @(posedge CLK) if (RESET) begin SIN_6K[0] <= 10'b0_000_111_111; SIN_6K[1] <= 10'b0_001_101_100; SIN_6K[2] <= 10'b0_001_111_111; SIN_6K[3] <= 10'b0_001_101_100; end По идее должен быть и способ иницилизации по типу иницилизации регистров - reg [3:0] ff = 0; Возможно в SV добавили такую возможность Изменено 22 апреля, 2010 пользователем Putnik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 (изменено) · Жалоба Как инициализировать массив reg [3:0] sin [0:15]; Обсуждалось уже много раз на форуме, поищите. Ну или воспользуйтесь хелпом, очень хорошие примеры на ISE есть, просто ваши начальные значения будут записаны в файле в двоичном или 16-ричном виде. А в функции readmemb (или h) указывается тупо путь к файлу (.txt) где и хранятся эти значения, единстенное, не забывайте что в файле должно быть строго 2 в степени n значений прописано, даже если вы будете использовать меньшее кол-во значений. Данная конструкция будет использоваться и для синтеза и для моделирования. Пост 35 посмотрите http://electronix.ru/forum/index.php?showt...dmemb&st=30 Изменено 22 апреля, 2010 пользователем bogaev_roman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Putnik 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 · Жалоба Во всех верилоговских примерах инициализация массивов только через readmemx, что мне впрочем всегда хватало. Но Djony1987 спрашивает про альтернативные способы, типа им приведенного, где для небольших массивов или массивов иницилизируемых нулевыми значениями не надо дополнительных файлов делать, в SV может это и сделали, видел похожее в его стандарте для структур, но пока не разобрался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 · Жалоба для небольших массивов или массивов иницилизируемых нулевыми значениями не надо дополнительных файлов делать Тогда через цикл for для его конкретного примера sin <= i; А вот если зависимости значения элемента массива от его номера нет, то только через файл или вручную для каждого конкретного элемента. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 · Жалоба По идее должен быть и способ иницилизации по типу иницилизации регистров - reg [3:0] ff = 0; Я так сразу попробовал. Ошибку пишет, и в Active-HDL, и в Modelsim. Знаю только что в чистом Verilog можно сделать начальную инициализацию массива регистров через readmemx, или установить их при сбросе типа Первое посмотрю. Второе не желательно - хотелось бы записать 1 раз в начале и все. Во всех верилоговских примерах инициализация массивов только через readmemx, что мне впрочем всегда хватало. Но Djony1987 спрашивает про альтернативные способы, типа им приведенного, где для небольших массивов или массивов иницилизируемых нулевыми значениями не надо дополнительных файлов делать, в SV может это и сделали, видел похожее в его стандарте для структур, но пока не разобрался А SV это что? SystemVerilog? я если честно не знаю. Обсуждалось уже много раз на форуме, поищите. Ну или воспользуйтесь хелпом, очень хорошие примеры на ISE есть, просто ваши начальные значения будут записаны в файле в двоичном или 16-ричном виде. А в функции readmemb (или h) указывается тупо путь к файлу (.txt) где и хранятся эти значения, единстенное, не забывайте что в файле должно быть строго 2 в степени n значений прописано, даже если вы будете использовать меньшее кол-во значений. Данная конструкция будет использоваться и для синтеза и для моделирования. Пост 35 посмотрите http://electronix.ru/forum/index.php?showt...dmemb&st=30 Спасибо за ссылку! Просинтезировал в Simlify. Вроде норм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 (изменено) · Жалоба Я так сразу попробовал. Ошибку пишет, и в Active-HDL, и в Modelsim Так правильно делает, что ругается, у Вас двумерный массив, откуда он знает, что именно вы хотите обнулить - разряды элемента или конкретные элементы. Тут если по тупому, то обнуление (инициализация в самом начале) будет выглядеть как reg [3:0] sin_0=4'b0000; reg [3:0] sin_1=4'b0001; reg [3:0] sin_2=4'b0010; ... reg [3:0] sin_15=4'b1111; Ну и работать соответственно придется уже не с элементами массива, а с регистрами. А по другому только через память или цикл. Поправьте меня, пожалуйста, если я неправ... Изменено 22 апреля, 2010 пользователем bogaev_roman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 · Жалоба Я делал генератор синуса косинуса, вначале я задал полностью все значения синуса, косинуса в кейсе: В итоге на кристалле заняло: --------------------------------------- Resource Usage Report for sin_cos3 Mapping to part: xc6vlx75tlff484-1l Cell usage: FD 22 uses GND 1 use MUXCY_L 21 uses RAMB18E1 1 use VCC 1 use XORCY 21 uses LUT1 22 uses I/O ports: 9 I/O primitives: 9 IBUFG 1 use OBUF 8 uses BUFG 1 use I/O Register bits: 0 Register bits not including I/Os: 22 (0%) RAM/ROM usage summary Block Rams : 1 of 156 (0%) Global Clock Buffers: 1 of 32 (3%) Number of unique control sets: 1 C(Clk1x_c), CLR(GND), PRE(GND), CE(VCC) : 22 Total load per clock: sin_cos3|Clk1x: 23 Mapping Summary: Total LUTs: 22 (0%) Mapper successful! Process took 0h:00m:01s realtime, 0h:00m:01s cputime Потом я записал только 1/4 периода (через $readmemb), а остальное получал через них: --------------------------------------- Resource Usage Report for sin_cos5 Mapping to part: xc6slx16csg225-2 Cell usage: FD 30 uses GND 1 use MUXCY_L 21 uses VCC 1 use XORCY 21 uses LUT1 22 uses LUT2 1 use LUT6 6 uses I/O ports: 9 I/O primitives: 9 IBUFG 1 use OBUF 8 uses BUFG 1 use I/O Register bits: 0 Register bits not including I/Os: 30 (0%) Global Clock Buffers: 1 of 16 (6%) Number of unique control sets: 1 C(Clk1x_c), CLR(GND), PRE(GND), CE(VCC) : 30 Total load per clock: sin_cos5|Clk1x: 30 Mapping Summary: Total LUTs: 29 (0%) Mapper successful! Process took 0h:00m:01s realtime, 0h:00m:01s cputime Во втором случа он вообще BRAM не использовал как я понял, почему так? Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 (изменено) · Жалоба Во втором случа он вообще BRAM не использовал как я понял, почему так? А он синтезатор умный, зараза, массив маленький и использование брам нерационально с точки зрения ксайлинкса, он его на регистрах по идее должен был сделать. Если хотите все-таки брам использовать, то можете в настройках покапаться, там есть пункт принудительного использования в похожих конструкциях ну или в самом верилоге указатель поставить, чтоб синтезатор данную конструкцию сразу в блочную память пихал (щас сходу и не вспомню как это пишется). Изменено 22 апреля, 2010 пользователем bogaev_roman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Djony1987 0 22 апреля, 2010 Опубликовано 22 апреля, 2010 · Жалоба А он синтезатор умный, зараза, массив маленький и использование брам нерационально с точки зрения ксайлинкса, он его на регистрах по идее должен был сделать. Если хотите все-таки брам использовать, то можете в настройках покапаться, там есть пункт принудительного использования в похожих конструкциях ну или в самом верилоге указатель поставить, чтоб синтезатор данную конструкцию сразу в блочную память пихал (щас сходу и не вспомню как это пишется). Спасибо! Поищу, а то вроде хотел сэкономить объем, а в итоге больше оказалось :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DanilinS 4 10 февраля, 2023 Опубликовано 10 февраля, 2023 · Жалоба Если массив мелкий и есть достаточно много свободного места - его целесообразнее на регистрах сделать. Быстрее работать будет. Тем более BRAM обычно "дефицитный" ресурс, его часто стараются беречь. Ибо не хватает. Вот синтезатор и старается. Не заморачивайся с этим. Пока ресурсы (по памяти и регистры) с избытком - синтезатор сделает оптимальным образом. А вот когда чип будет "под упор" - тогда и зарывайся в это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться