Перейти к содержанию
    

Xilinx Spartan3E

 

Можно ли написать модель двухпортовой блочной памяти RAMB_s9_s18 на verilog (режиме "WRITE-FIRST"), а не использовать его как примитив кристалла? нужно для инициализации из файла.

Изменено пользователем OgRe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Xilinx Spartan3E

 

Можно ли написать модель двухпортовой блочной памяти RAMB_s9_s18 на verilog (режиме "WRITE-FIRST"), а не использовать его как примитив кристалла? нужно для инициализации из файла.

Я думаю можно. Для этого используйте соответствующий темплейт из ISE или Актива и все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думаю можно. Для этого используйте соответствующий темплейт из ISE или Актива и все.

в темплейте(и xst user guide) есть варианты описаний, когда оба порта совпадают по размерности адреса и данных( вся сложность в том. что два порта обращаются к общему пространству, но при этом у них разная размерность((

Изменено пользователем OgRe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

ps: такую тему я уже поднимал, поищите в архивах, может там будет что интересного...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что мешает изменить в соответствующем темплере разрядность? Просто задавайте ее отдельно для каждого порта, а не используйте одну и ту же для обоих, только нада учитывать, что менять ее можно в кратное 2 число раз, при этом так же меняя в соответствующее число раз разрядность шины данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

`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 не получится ничего :(

Изменено пользователем OgRe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проблемы не там где указанны, а в отношении адресов и данных по портам.

К примеру:

порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных.

Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно.

Произвольные соотношения между портами недопустимы. :)

Изменено пользователем rand

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проблемы не там где указанны, а в отношении адресов и данных по портам.

К примеру:

порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных.

Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно.

Произвольные соотношения между портами недопустимы. :)

вы лучше скажите как описать пространство куда обращаются порты, [15:0] RAM [2047:0] ? тогда как к нему обращаться отдельно с порта А и с порта Б, то что вы сказали понятно...

Изменено пользователем OgRe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проблемы не там где указанны, а в отношении адресов и данных по портам.

К примеру:

порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных.

Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно.

Произвольные соотношения между портами недопустимы. :)

 

Круто.

2 разряда адреса и 64 разряда данных – это память 4*8 = 32 байта,

а 32 разряда адреса и 4 разряда данных – это 2048 Мбайт памяти (2^32 * 0,5 байт)!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Круто.

2 разряда адреса и 64 разряда данных – это память 4*8 = 32 байта,

а 32 разряда адреса и 4 разряда данных – это 2048 Мбайт памяти (2^32 * 0,5 байт)!

:biggrin: :a14: жжете =) Там, воможно, все будет сходиться за счет разрядов для контроля по четности...

Изменено пользователем OgRe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

порт а имеет шину адреса 8 разрядов и 16 разрядов шину данных.

Тогда для порта б допустимо поставить адрес- 2,4,8,16,32 разряда при шине данных- 64,32,16,8 и 4 разряда соответственно.

это шутка такая? :blink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сорри, последний пост исал на ходу :)

А если серьезно, то вот немного переделанный код для синтеза 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сорри, последний пост исал на ходу :)

А если серьезно, то вот немного переделанный код для синтеза 2х портовой блочной памяти, с одним портом read-first,а вторым write-first:

не то... :glare: синтезируется распределенная (distributed ) память на регистрах, лутах и блочных RAM меньшей емкости...нужно, чтоб в процессе синтеза использовалась блочная (block )память RAMB_s9_s18..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И что это работает? По идее не должно, т.к. при работе с портом А считывается/записывается только младший байт памяти, а инкрементирование адреса приводит к переходу на следующие два байта.

Таким образом портом А используется память через байт, да и адреса [10:0] не влезают (т.к. размер примитива 2K = 2 байта*1024).

Т.е. в вашем случае после синтеза должно использоваться два примитива: причем порт B будет работать только с нижней половиной памяти, а порт А обращаться к памяти через байт!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно, у меня синтезируется именно блочная память. Проверьте свои настройки синтезатора, вполне возможно, что у Вас на закладке 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.

Изменено пользователем rand

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...