[an error occurred while processing this directive]
Двухпортовку я списал прямо из описания на XST:
(«Телесистемы»: Конференция «Языки описания аппаратуры (VHDL и др.))

миниатюрный аудио-видеорекордер mAVR

Отправлено zlyh 20 октября 2006 г. 18:25
В ответ на: Ответ: отправлено <font color=gray>darkniisiis</font> 20 октября 2006 г. 15:38

Инициализацией для железа не задавался. Моя инициализация только для моделирования.
Но синтезит двухпортовку чётко. Вместо этой компоненты появляктся блокрам. Всё в докуменах хорошо изложено.
darkniisiis, подозреваю что считывание из памяти тоже надо внести под клок.

-----------------------------------------
-- Dual port (Xilinx BLOCK) RAM.
----------------------------------------

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity BlkRAMDP is
generic(DataWidth_g : in positive := 32;
AdrWidth_g : in positive := 10
);
port (
ClkA : in std_logic;
ADRA : in unsigned(AdrWidth_g-1 downto 0);
WEA : in std_logic;
DIA : in unsigned(DataWidth_g-1 downto 0);

ClkB : in std_logic;
ADRB : in unsigned(AdrWidth_g-1 downto 0);
REB : in std_logic;
DOB : out unsigned(DataWidth_g-1 downto 0)
);
end entity BlkRAMDP;

architecture BlkRAMDP_arch of BlkRAMDP is

subtype datwidth_t is unsigned(DataWidth_g-1 downto 0);
constant ramdepth_c : positive := 2**AdrWidth_g;
type ram_t is array (ramdepth_c-1 downto 0) of datwidth_t;

function ArrInit
(AdrWidth : in positive;
DataWidth : in positive)
return ram_t is
constant ramdepth_c : positive := 2**AdrWidth;
variable RAM : ram_t := (ram_t'RANGE => (datwidth_t'RANGE => '0'));
begin
for i in 0 to ramdepth_c-1 loop
RAM(i) := TO_UNSIGNED(i, DataWidth);
end loop;
return RAM;
end function ArrInit;

constant RAMinit_c : ram_t := ArrInit(AdrWidth_g, DataWidth_g);
--signal RAM : ram_t := (ram_t'RANGE => (datwidth_t'RANGE => '0'));
signal RAM : ram_t := RAMinit_c;

begin

writeA_p: process (ClkA) is
begin
if rising_edge(ClkA) then
if (WEA = '1') then
RAM(TO_INTEGER(ADRA)) <= DIA;
end if;
end if;
end process writeA_p;

readB_p: process (ClkB) is
begin
if rising_edge(ClkB) then
if (REB = '1') then
DOB <= RAM(TO_INTEGER(ADRB));
end if;
end if;
end process readB_p;

end architecture BlkRAMDP_arch;


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание