Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
------------------------ram.vhd---------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_unsigned.all;
entity ram is
port(
we : in STD_LOGIC;
clk : in STD_LOGIC;
di : in STD_LOGIC_VECTOR(31 downto 0);
a : in STD_LOGIC_VECTOR(19 downto 0);
do : out STD_LOGIC_VECTOR(31 downto 0)
);
end ram;
--}} End of automatically maintained section
architecture ram of ram is
type membuf is array (0 to 65535) of std_logic_vector(31 downto 0);
signal buf : membuf;
begin
process(clk)
variable addr : integer;
begin
if clk'event and clk='1' then
addr:=Conv_integer(a);
if we='1' then
buf(addr)<=di;
do<=X"00000000";
else
do<=buf(addr);
end if;
end if;
end process;
end ram;
------------------------ram_TB.vhd------------------------------------
library ieee;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
-- Add your library and packages declaration here ...
entity ram_tb is
end ram_tb;
architecture TB_ARCHITECTURE of ram_tb is
-- Component declaration of the tested unit
component ram
port(
we : in std_logic;
clk : in std_logic;
di : in std_logic_vector(31 downto 0);
a : in std_logic_vector(19 downto 0);
do : out std_logic_vector(31 downto 0) );
end component;
-- Stimulus signals - signals mapped to the input and inout ports of tested entity
signal we : std_logic;
signal clk : std_logic;
signal di : std_logic_vector(31 downto 0);
signal a : std_logic_vector(19 downto 0);
-- Observed signals - signals mapped to the output ports of tested entity
signal do : std_logic_vector(31 downto 0);
-- Add your code here ...
signal cnt : std_logic_vector(31 downto 0);
-- signal data : std_logic_vector(7 downto 0);
signal rst : std_logic;
begin
-- Unit Under Test port map
UUT : ram
port map (
we => we,
clk => clk,
di => di,
a => a,
do => do
);
-- Add your stimulus here ...
process
begin
clk<='1'; wait for 50ns;
clk<='0'; wait for 50ns;
end process;
process(rst, clk)
begin
if rst='1' then cnt<=X"00000000";
else
if clk'event and clk='1' then
cnt<=cnt+1;
end if;
end if;
end process;
a(19)<='0';
a(18 downto 0)<=cnt(18 downto 0);
we<=not cnt(19);
di<=cnt;
process
begin
rst<='1';
wait for 10ns;
rst<='0';
wait;
end process;
end TB_ARCHITECTURE;
configuration TESTBENCH_FOR_ram of ram_tb is
for TB_ARCHITECTURE
for UUT : ram
use entity work.ram(ram);
end for;
end for;
end TESTBENCH_FOR_ram;
----------------------------------------------------------------------
При запуске симуляции в ActiveHDL 7.2, памяти на всё это безобразие выделяется чуть меньше 10 мегабайт. В то же время ActiveHDL 6.3 выделяет 347 мегабайт. Разница в 35 раз !!! В те же 35 раз разница в скорости. Не в пользу 7.2 к сожалению. В то же время проект, которым я занимаюсь на работе (кусок достаточно сложной железки на Virtex 2) прекрасно загрузился в симулятор (уже timing model !), заняв около 32 мегабайт, что вполне разумно, и был просимулирован за вполне разумное время. Памяти выделяется чуть меньше чем это делает 6.3, а считает примерно с одинаковой скоростью. Это конечно не может не радовать. Но как тогда быть с первым проектом, где моделировалась чудовищная RAM ??? Короче не понимаю я толком, работает у меня оно или нет... Очень прошу, попытайтесь этот проект прогнать у себя. И если у кого есть волшебная таблетка, прошу, поделитесь ! А то после того как aldec перестал давать полные 20-дневные лицензии, борьба с ним сильно осложнилась...