bratok-gl 0 7 апреля, 2005 Опубликовано 7 апреля, 2005 · Жалоба Столкнулся с такой проблеммой: сделал 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) они все работаю. Вт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TriD 0 7 апреля, 2005 Опубликовано 7 апреля, 2005 · Жалоба В корегене создаешь массив на блочной памяти с нужными параметрами и пользуешся :). Описание там есть. P.S. Сам наступал на подобные грабли :) А то, что долго разводила, так это не помещался сгенеренный код (она же все эти массивы на триггерах сделала :)) и пыталась его оптимизировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rok 0 7 апреля, 2005 Опубликовано 7 апреля, 2005 · Жалоба Столкнулся с такой проблеммой: сделал 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
anatol1983 0 8 апреля, 2005 Опубликовано 8 апреля, 2005 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bratok-gl 0 3 июня, 2005 Опубликовано 3 июня, 2005 · Жалоба Привет всем! После того как мне подсказали сделать CoreGenом я вот что сделал: Создал CoreGEn'ом Single Port Block Memory размером Width=16 Depth=2048 и забил данными файл ram.coe. Соединение блоков проекта провожу в схемном редакторе, вот там и вставил блок который сгенерил CoreGen (wer.xco), соединил его с другими блоками , при этом пороверка Check Schematic не выдает ошибок. Но при размещении и разводке оказалось, что блок сгенерированный CoreGen'ом не соединяется со всей схемой, а только соединяетс только вход тактовой частоты. Это хорошо видно при 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 3 июня, 2005 Опубликовано 3 июня, 2005 · Жалоба http://forum.electronix.ru/index.php?showtopic=3666&st=15 3 е сообщение с низу, про то как правильно делать РАМ на ХДЛ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bratok-gl 0 6 июня, 2005 Опубликовано 6 июня, 2005 · Жалоба Забил я с этим 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. Такой вопрос: почему????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 июня, 2005 Опубликовано 6 июня, 2005 · Жалоба Потом вставил этот модуль в схему свою, и вроде память подключилась и моделируется. Но трасировщик не подключил один вывод блока памяти. 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. Такой вопрос: почему????? <{POST_SNAPBACK}> хмм так это вас нужно спросить по чему ? он же пишет черным по белому : Болтающийся вывод BLKRAM. вывод DOA0 компонента ... не подключен. ИМХО ошибка не в рам а в подключении ее к вашей схеме Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bratok-gl 0 6 июня, 2005 Опубликовано 6 июня, 2005 · Жалоба Все!!! Наконец-то нашел причину, просто у меня блок памяти подключался к другому, в котором один разряд данных не использовался. Так вот из-за этого и была ошибка, как только не нужный разряд вывел на улицу(пин), все отлично. Теперь буду ждать , когда запрограммирую, очень интересно, как будет работать память???? это мой первый проект с памятью:))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться