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

хранение чисел

Столкнулся с такой проблеммой: сделал pn-последовательность (кристал Xilinx Virtex XCV300) на 11 регистрах для нужной последовательности необходимо знать рекурентную формулу и 11 разрядное слово для детектора кода. Все отлично работает, но чтобы каждый раз не искать какую нужно рекурентную формулу и слово для определенной последовательности, я решил хранить таблицу значений в кристалле. Попытки не увеньчались успехом, так как я никогда неработал с блочнойпамятью. Помогите!!! где хранить и как эти данне в ПЛИСЕ 2046X16.

Вот мои попытки.

первая:

entity tablic is

port (clk : in std_logic;

adr : in std_logic_vector(10 downto 0);

do : out std_logic_vector(15 downto 0));

end tablic;

architecture syn of tablic is

signal adr_int: INTEGER range 0 to 2046;

 

begin

adr_int <= CONV_INTEGER(adr);

process (adr_int)

begin

case adr_int is

 

 

when (1)=> do <="0001000010000000";

when (2)=> do <="0000100010000000";

when (3)=> do <="0001100010000000";

when (4)=> do <="0011100010000000";

when (5)=> do <="0000011010000000";

....

....

when others => NULL;

end case;

end process;

 

 

 

Вторая:

 

type ram_type is array (2046 downto 0) of std_logic_vector (15 downto 0);

signal RAM : ram_type;

RAM(conv_integer(1)) <= "0001000010000000";

RAM(conv_integer(2)) <= "0000100010000000";

RAM(conv_integer(3)) <= "0011100010000000";

......

......

......

begin

do <= RAM(conv_integer(adr));

end syn;

 

 

 

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

Но при моделированиии (modelsim5.7) они все работаю.

 

 

 

Вт

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


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

В корегене создаешь массив на блочной памяти с нужными параметрами и пользуешся :). Описание там есть.

 

P.S. Сам наступал на подобные грабли :)

А то, что долго разводила, так это не помещался сгенеренный код (она же все эти массивы на триггерах сделала :)) и пыталась его оптимизировать.

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


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

Столкнулся с такой проблеммой: сделал pn-последовательность (кристал Xilinx Virtex XCV300) на 11 регистрах для нужной последовательности необходимо знать рекурентную формулу и 11 разрядное слово для детектора кода. Все отлично работает, но чтобы каждый раз не искать какую нужно рекурентную формулу и слово для определенной последовательности, я решил хранить таблицу значений в кристалле. Попытки не увеньчались успехом, так как я никогда неработал с блочнойпамятью. Помогите!!! где хранить и как эти данне в ПЛИСЕ 2046X16.

Я использую блочную память как ROM, т.е. инитиализирую BlockRAM. Для этого необходимо подключить библиотеку примитивов. Делается это следующим образом:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

library UNISIM;
use UNISIM.VComponents.all;

Entity ROM_from_RAM is
port(
 clk : in std_logic;
 ena : in std_logic;
 rst : in std_logic;
 addr : in std_logic_vector(8 downto 0);
 DOR : out std_logic_vector(7 downto 0)
 );
end ROM_from_RAM;

Architecture Struct of ROM_from_RAM is

attribute BOX_TYPE : string;

component RAMB4_S8
generic( INIT_00 : bit_vector );
port (
    DI   : in STD_LOGIC_VECTOR (7 downto 0);
    EN   : in STD_ULOGIC;
    WE   : in STD_ULOGIC;
    RST  : in STD_ULOGIC;
    CLK  : in STD_ULOGIC;
    ADDR    : in STD_LOGIC_VECTOR (8 downto 0);
    DO   : out STD_LOGIC_VECTOR (7 downto 0)
    );
end component;

attribute BOX_TYPE of RAMB4_S8 : component is "BLACK_BOX";

Begin

init_RAMb4_S8 : RAMb4_S8
generic map (INIT_00 =>
x"1F1E1D1C1B1A191817161514131211100F0E0D0C0B0A09807766554433221110")
port map (
    DI => "00000000",
    EN => ena,
    WE => '0',
    RST => rst,
    CLK => clk,
    ADDR => addr,
    DO => DOR
    );
 
end Struct;

INIT_00 это инитиализация первых 256 бит в hex.

В вашем случае я бы использовал RAMb4_S16. Инитиализировать можно с помощью 16 векторов INIT_00 - INIT_0F. В вашем случае нужно инитиализировать половину.

Подробне об этом аттрибуте читайте Constraints Guide - init_xx section.

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


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

entity spblockram is 
port (clk : in std_logic; 
 we  : in std_logic; 
 a   : in std_logic_vector(4 downto 0); 
 di  : in std_logic_vector(3 downto 0); 
 do  : out std_logic_vector(3 downto 0)); 
end spblockram; 

architecture syn of spblockram is 

type ram_type is array (31 downto 0) of std_logic_vector (3 downto 0); 
signal RAM : ram_type; 
signal read_a : std_logic_vector(4 downto 0); 

begin 
process (clk) 
begin 
 if (clk'event and clk = '1') then  
     if (we = '1') then 
   RAM(conv_integer(a)) <= di; 
     end if; 
     read_a <= a; 
 end if; 
end process; 

do <= RAM(conv_integer(read_a));

end syn;

 

Взято из синтезируемых примитивов. А вообще по BRAM можно посмотреть тут

http://forum.electronix.ru/index.php?showtopic=3666

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


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

Привет всем! После того как мне подсказали сделать CoreGenом я вот что сделал:

Создал CoreGEn'ом Single Port Block Memory размером Width=16 Depth=2048 и забил данными файл ram.coe. Соединение блоков проекта провожу в схемном редакторе, вот там и вставил блок который сгенерил CoreGen (wer.xco), соединил его с другими блоками post-833-1117779572.png, при этом пороверка Check Schematic не выдает ошибок. Но при размещении и разводке оказалось, что блок сгенерированный CoreGen'ом не соединяется со всей схемой, а только соединяетс только вход тактовой частотыpost-833-1117779519.png. Это хорошо видно при Synthesize в View RTL Schematic.

 

Такой вопрос, как мне всетаки соединить выводы блока сделанного coregenом с моей схемой????

 

Пробовал присоединить ручками, таже история!!!!

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

 

entity RAM_M is

port (

addr: IN std_logic_VECTOR(10 downto 0);

clk: IN std_logic;

dout: OUT std_logic_VECTOR(15 downto 0));

end RAM_M;

 

 

architecture Behavioral of RAM_M is

 

component wer

port (

addr: IN std_logic_VECTOR(10 downto 0);

clk: IN std_logic;

dout: OUT std_logic_VECTOR(15 downto 0));

end component;

 

attribute fpga_dont_touch: string;

attribute fpga_dont_touch of wer: component is "true";

attribute syn_black_box : boolean;

attribute syn_black_box of wer: component is true;

 

begin

your_instance_name : wer

port map (

addr => addr,

clk => clk,

dout => dout);

 

end Behavioral;

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


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

http://forum.electronix.ru/index.php?showtopic=3666&st=15

3 е сообщение с низу, про то как правильно делать РАМ на ХДЛ

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


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

Забил я с этим Coregen'ом и решил написать кодом, по подсказкам пользователей посмотрел в Constraints Guide и вот что написал:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

 

entity rominfr is

port ( CLK : in std_logic;

addr : in std_logic_vector(10 downto 0);

data : out std_logic_vector(15 downto 0)

);

 

end rominfr;

architecture syn of rominfr is

type rom_type is array ( 0 to 2047) of std_logic_vector (15 downto 0);

constant ROM : rom_type :=

(

"0000000000000000",

"0000000000000000",

.

..

..

"0111011100101001",

"1001001000001001",

"1010101011101001",

"1111111110001001",

"0000000000001001"

);

 

begin

 

process (clk)

begin

if (CLK'event and CLK='1') then

data <= ROM(conv_integer(addr));

end if;

end process;

end syn;

 

Потом вставил этот модуль в схему свою, и вроде память подключилась и моделируется.

Но трасировщик не подключил один вывод блока памяти.

Running DRC.

WARNING:DesignRules:332 - Blockcheck: Dangling BLKRAM output. Pin DOA0 of comp XLXI_781_Mrom__n00011_inst_ramb_2 is not connected.

DRC detected 0 errors and 1 warnings.

Такой вопрос: почему?????

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


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

Потом вставил этот модуль в схему свою, и вроде память подключилась и моделируется.

Но трасировщик не подключил один вывод блока памяти.

Running DRC.

WARNING:DesignRules:332 - Blockcheck: Dangling BLKRAM output. Pin DOA0 of comp  XLXI_781_Mrom__n00011_inst_ramb_2 is not connected.

DRC detected 0 errors and 1 warnings.

Такой вопрос: почему?????

хмм так это вас нужно спросить по чему ? он же пишет черным по белому :

Болтающийся вывод BLKRAM. вывод DOA0 компонента ... не подключен.

ИМХО ошибка не в рам а в подключении ее к вашей схеме

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


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

Все!!! Наконец-то нашел причину, просто у меня блок памяти подключался к другому, в котором один разряд данных не использовался. Так вот из-за этого и была ошибка, как только не нужный разряд вывел на улицу(пин), все отлично.

Теперь буду ждать , когда запрограммирую, очень интересно, как будет работать память???? это мой первый проект с памятью:)))

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


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

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

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

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

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

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

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

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

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

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