OgRe 0 3 мая, 2007 Опубликовано 3 мая, 2007 (изменено) · Жалоба Xilinx Spartan3E Можно ли написать модель двухпортовой блочной памяти RAMB_s9_s18 на verilog (режиме "WRITE-FIRST"), а не использовать его как примитив кристалла? нужно для инициализации из файла. Изменено 3 мая, 2007 пользователем OgRe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба Xilinx Spartan3E Можно ли написать модель двухпортовой блочной памяти RAMB_s9_s18 на verilog (режиме "WRITE-FIRST"), а не использовать его как примитив кристалла? нужно для инициализации из файла. Я думаю можно. Для этого используйте соответствующий темплейт из ISE или Актива и все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OgRe 0 3 мая, 2007 Опубликовано 3 мая, 2007 (изменено) · Жалоба Я думаю можно. Для этого используйте соответствующий темплейт из ISE или Актива и все. в темплейте(и xst user guide) есть варианты описаний, когда оба порта совпадают по размерности адреса и данных( вся сложность в том. что два порта обращаются к общему пространству, но при этом у них разная размерность(( Изменено 3 мая, 2007 пользователем OgRe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAZZI 1 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба описывал память с разной размерностью адресса и данных на разных портах, хотел перевод из последовательной в параллельную сделать, в итоге синтезатор выдавал на триггерах и никак это в блочную память не получилось, т.ч. пользуйтесь примитивом, но если получится, то скиньте описание сюда, это будет всем интересно. ps: такую тему я уже поднимал, поищите в архивах, может там будет что интересного... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rand 0 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба А что мешает изменить в соответствующем темплере разрядность? Просто задавайте ее отдельно для каждого порта, а не используйте одну и ту же для обоих, только нада учитывать, что менять ее можно в кратное 2 число раз, при этом так же меняя в соответствующее число раз разрядность шины данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OgRe 0 3 мая, 2007 Опубликовано 3 мая, 2007 (изменено) · Жалоба `timescale 1ns / 1ns // // Write-First Mode (template 1) // module ram (clka, wea, ena, addra, dia, doa, dipa, dopa, clkb, web, enb, addrb, dib, dob,dipb,dopb ); //-Control Inputs, PortA input clka; input wea; input ena; input [10:0] addra; //-Data Input & parity PortA input [7:0] dia; input dipa; //-Data Output & parity PortA- output reg [7:0] doa; //------ output dopa; /******************************************* ********************************************/ reg [7:0] RAM_A [2047:0]; <=ПРОБЛЕМА ТУТ ///////////////////////////////////////////// //---------------------- //-Control Inputs, PortB input clkb; input web; input enb; input [9:0] addrb; //-Data Input & parity PortB input [15:0] dib; input [1:0] dipb; //-Data Output & parity PortB- output reg [15:0] dob; output [1:0] dopb; /******************************************* ********************************************/ reg [15:0] RAM_B [1023:0]; <=и ТУТ ///////////////////////////////////////////// //storage place reg [15:0] RAM [2047:0]; //reg [] //------------------------ //portA Behavior description always @(posedge clka) begin if (ena) begin if (wea) begin RAM_A[addra] <= dia; doa <= dia; end else doa <= RAM_A[addra]; end end //portB Behavior description always @(posedge clkb) begin if (enb) begin if (web) begin RAM_B[addrb] <= dib; dob <= dib; end else dob <= RAM_B[addrb]; end end endmodule вот код, после синтеза получается два блок RAM-a (RAM_s9 и RAM_S18). rand не получится ничего :( Изменено 3 мая, 2007 пользователем OgRe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rand 0 3 мая, 2007 Опубликовано 3 мая, 2007 (изменено) · Жалоба проблемы не там где указанны, а в отношении адресов и данных по портам. К примеру: порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных. Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно. Произвольные соотношения между портами недопустимы. :) Изменено 3 мая, 2007 пользователем rand Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OgRe 0 3 мая, 2007 Опубликовано 3 мая, 2007 (изменено) · Жалоба проблемы не там где указанны, а в отношении адресов и данных по портам. К примеру: порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных. Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно. Произвольные соотношения между портами недопустимы. :) вы лучше скажите как описать пространство куда обращаются порты, [15:0] RAM [2047:0] ? тогда как к нему обращаться отдельно с порта А и с порта Б, то что вы сказали понятно... Изменено 3 мая, 2007 пользователем OgRe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_P 0 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба проблемы не там где указанны, а в отношении адресов и данных по портам. К примеру: порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных. Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно. Произвольные соотношения между портами недопустимы. :) Круто. 2 разряда адреса и 64 разряда данных – это память 4*8 = 32 байта, а 32 разряда адреса и 4 разряда данных – это 2048 Мбайт памяти (2^32 * 0,5 байт)! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OgRe 0 3 мая, 2007 Опубликовано 3 мая, 2007 (изменено) · Жалоба Круто. 2 разряда адреса и 64 разряда данных – это память 4*8 = 32 байта, а 32 разряда адреса и 4 разряда данных – это 2048 Мбайт памяти (2^32 * 0,5 байт)! :a14: жжете =) Там, воможно, все будет сходиться за счет разрядов для контроля по четности... Изменено 3 мая, 2007 пользователем OgRe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных. Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно. это шутка такая? :blink: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rand 0 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба сорри, последний пост исал на ходу :) А если серьезно, то вот немного переделанный код для синтеза 2х портовой блочной памяти, с одним портом read-first,а вторым write-first: `timescale 1ns / 1ns // // Write-First Mode (template 1) // module ramm (clka, wea, ena, addra, dia, doa, clkb, web, enb, addrb, dib, dob ); //-Control Inputs, PortA input clka; input wea; input ena; input [10:0] addra; //-Data Input & parity PortA input [7:0] dia; //-Data Output & parity PortA- output reg [7:0] doa; //------ /******************************************* ********************************************/ // reg [7:0] RAM_A [2047:0]; <=ПРОБЛЕМА ТУТ ///////////////////////////////////////////// //---------------------- //-Control Inputs, PortB input clkb; input web; input enb; input [9:0] addrb; //-Data Input & parity PortB input [15:0] dib; //-Data Output & parity PortB- output reg [15:0] dob; /******************************************* ********************************************/ // reg [15:0] RAM_B [1023:0]; <=и ТУТ ///////////////////////////////////////////// //storage place reg [15:0] RAM [2047:0]; //reg [] //------------------------ //portA Behavior description always @(posedge clka) begin if (ena) begin if (wea) begin RAM[addra] <= dia; doa <= RAM[addra]; end else doa <= RAM[addra]; end end //portB Behavior description always @(posedge clkb) begin if (enb) begin if (web) begin RAM[addrb] <= dib; dob <= dib; end else dob <= RAM[addrb]; end end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OgRe 0 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба сорри, последний пост исал на ходу :) А если серьезно, то вот немного переделанный код для синтеза 2х портовой блочной памяти, с одним портом read-first,а вторым write-first: не то... :glare: синтезируется распределенная (distributed ) память на регистрах, лутах и блочных RAM меньшей емкости...нужно, чтоб в процессе синтеза использовалась блочная (block )память RAMB_s9_s18.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_P 0 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба И что это работает? По идее не должно, т.к. при работе с портом А считывается/записывается только младший байт памяти, а инкрементирование адреса приводит к переходу на следующие два байта. Таким образом портом А используется память через байт, да и адреса [10:0] не влезают (т.к. размер примитива 2K = 2 байта*1024). Т.е. в вашем случае после синтеза должно использоваться два примитива: причем порт B будет работать только с нижней половиной памяти, а порт А обращаться к памяти через байт! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rand 0 3 мая, 2007 Опубликовано 3 мая, 2007 (изменено) · Жалоба Странно, у меня синтезируется именно блочная память. Проверьте свои настройки синтезатора, вполне возможно, что у Вас на закладке HDL Option принудительно выбрат тип память LUT. P.s. Alexandr будете смеяться, но это действительно работает в ISE. При попытке построения нормальной конструкции для first-read по порту А: always @(posedge clka) if (ena)begin if (wea) RAM[addra] <= dia; doa <= RAM[addra]; end идет принудительное размещение памяти на LUT. Изменено 3 мая, 2007 пользователем rand Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться