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

Подсобите пожалуйста примером ПЗУ на VHDL (адреса 4..0) (выходные биты 10..0) - 32 11_ти разрядных числа.

 

Спасибо.

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


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

открываем ISE. Далее жмакаем на лампочку (Language Templates). Выбираем VHDL - FPGA - Spartan - ROM. Смотрим примеры.

 

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


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

Подсобите пожалуйста примером ПЗУ на VHDL (адреса 4..0) (выходные биты 10..0) - 32 11_ти разрядных числа.

 

Спасибо.

 

можно вот так например:

 

process(addr)
begin
  case addr is
    when "00000" => data <= "...";
    when "00001" => data <= "...";
    .
    .
    .
    when "11111" => data <= "...";
    when others => data <= "...";
  end case;
end process;

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

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


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

Спасибо.

 

Виноват. Вопрос был не полный.

 

Сам понимаю, что спрашиваю ерунду, но авось..

Можно ли на VHDL написать ПЗУ которая бы при компиляции загружала в себя данные () из файла?

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


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

Спасибо.

 

Виноват. Вопрос был не полный.

 

Сам понимаю, что спрашиваю ерунду, но авось..

Можно ли на VHDL написать ПЗУ которая бы при компиляции загружала в себя данные () из файла?

Вы ответ от PDA видели?

А почему на лампочку не жмакнули?

Лампочки - они полезные, там даже такой пример есть:

-- The following code will infer a Single port Block RAM and initialize it using a FILE

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


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

Видел. Спасибо.

Но к сожалению у меня ISE нет (придется поставить)

Пытаюсь сделать то же в Quartus9.

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


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

Edit/Insert Template/VHDL/Full Designs/RAMs and ROMs/Single-Port ROM

 

Спасибо. Нашел.

 

Это место

 

-- Declare the ROM signal and specify a default value. Quartus II

-- will create a memory initialization file (.mif) based on the

-- default value.

 

signal rom : memory_t := init_rom;

 

не совсем понятно.

 

Допустим у меня есть готовый файл (например test.hex) с данными в HEX формате. как прописать его загрузку в ROM?

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


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

Подсобите пожалуйста примером ПЗУ на VHDL (адреса 4..0) (выходные биты 10..0) - 32 11_ти разрядных числа.

 

Спасибо.

Посмотрите может это поможет

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


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

Посмотрите может это поможет

 

Спасибо. Хороший пример.

Попробую ROM (не RAM) на файле сделать по подобию.

 

Уже не первый раз сталкиваюсь с тем, что приходится применять стандартные функции VHDL типа (CONV_INTEGER и т. п.)

Функции рабтают. Наверняка всяких разных функций много. Но ни разу ни в сети ни в справочниках VHDL не встречал собранного в одном месте перечня VHDL функций (типа Win MSDN).

В Q они присутствуют разбросанные по всему хелпу. Иногда случайно узнаешь о какой то функции...

 

Есть ли вообще где ниудь такой перечень с описанием? Ведь многие из них работают везде и в Q и в ISE.

 

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

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


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

Здесь можно почитать о пакете NUMERIC_STD.

NUMERIC_STD

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


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

Может это Вам поможет, но в Quartus'е она не будет работать, т.к. она не синтезируема. Должно быть что-то вроде этого:

 

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use IEEE.std_logic_textio.all;
use std.textio.all;

entity ROM is
port(CLK: in std_logic;
	 CE: in std_logic;
	 ADDR: in std_logic_vector(addr_size - 1 downto 0);
	 Q: out std_logic_vector(2*data_size - 1 downto 0));
end entity ROM;

architecture RTL_ROM of ROM is
type ROM_TYPE is array(0 to 2**addr_size - 1) of std_logic_vector(2*data_size - 1 downto 0);

-- Функция инициализации памяти из файла: --
function INIT_ROM(constant filename: string) return ROM_TYPE is -- Входным параметром является строковая переменная названия файла
	file initfile: text open read_mode is filename; -- Открытие файла filename для чтения
	variable fline: line;
	variable ROM: ROM_TYPE := (others => (others => 'U')); -- Память
begin
	for i in ROM_Type'range loop
		readline(initfile, fline);
		hread(fline, ROM(i));
	end loop;
	return ROM;
end function INIT_ROM;
-- Файл шестнадцатиричный, для двоичного файла использовать read вместо hread--

signal ROM_BANK: ROM_TYPE:= INIT_ROM(init_file); -- Инициализация памяти

begin

process
	begin
		wait until (rising_edge(CLK));
			if (CE = '1') then
				Q <= ROM_BANK(TO_INTEGER(UNSIGNED(ADDR)));
			end if;
end process;

end RTL_RAM;

 

Если вы хотите в квартусе проининциализировать ROM, то просто берите компонент и подключайте mif-файл (пример для RAM, для ROM он схожий):

 

Объявление компонента:

component lpm_ram_dp
generic(intended_device_family: string;
		lpm_indata: string;
		lpm_outdata: string;
		lpm_file: string;
		lpm_rdaddress_control: string;
		lpm_type: string;
		lpm_width: NATURAL;
		lpm_widthad: NATURAL;
		lpm_wraddress_control: string;
		rden_used: string;
		use_eab: string);
port(rdclken: in std_logic;
	 rdclock: in std_logic;
	 wren: in std_logic;
	 wrclken: in std_logic;
	 wrclock: in std_logic;
	 q: out std_logic_vector (lpm_width - 1 downto 0);
	 data: in std_logic_vector (lpm_width - 1 downto 0);
	 rdaddress: in std_logic_vector (lpm_widthad - 1 downto 0);
	 wraddress: in std_logic_vector (lpm_widthad - 1 downto 0));
end component;

 

Подключение компонента:

RAM_1: lpm_ram_dp
	generic map(intended_device_family => "APEX20KE",
				lpm_indata => "REGISTERED",
				lpm_outdata => "REGISTERED",
				lpm_file => "Data.mif",
				lpm_rdaddress_control => "REGISTERED",
				lpm_type => "LPM_RAM_DP",
				lpm_width => data_size,
				lpm_widthad => addr_size,
				lpm_wraddress_control => "REGISTERED",
				rden_used => "FALSE",
				use_eab => "ON")
	port map(rdclken => RCE,
			 rdclock => CLK,
			 wren => WE,
			 wrclken => WCE,
			 wrclock => CLK,
			 data => D,
			 rdaddress => ADDR_RD,
			 wraddress => ADDR_WR,
			 q => Q);

 

mif-файл (пример):

WIDTH=64;
DEPTH=32;

ADDRESS_RADIX=UNS;
DATA_RADIX=BIN;

CONTENT BEGIN
-------------------- RAM --------------------
0  :    0000000000000000000000000000000000000000000000000111111111111111;
1  :    0000000000000000001100010101100100000000000000000111011000011010;
2  :    0000000000000000010110110001000100000000000000000101100111110010;
3  :    0000000000000000011101101011010000000000000000000010111111100010;
4  :    0000000000000000011111111111110011111111111111111111111001101011;
5  :    0000000000000000011101010111101111111111111111111100110100110010;
6  :    0000000000000000010110001101000011111111111111111010001111010100;
7  :    0000000000000000001011100110100111111111111111111000100010110110;
8  :    1111111111111111111111001101011011111111111111111000000000001010;
9  :    1111111111111111110010111011111111111111111111111000101100100111;
10  :    1111111111111111101000101011110011111111111111111010100001010101;
11  :    1111111111111111100010000010010111111111111111111101001100010001;
12  :    1111111111111111100000000001011100000000000000000000010011000000;
13  :    1111111111111111100010111100111100000000000000000011010110110010;
14  :    1111111111111111101010010111111000000000000000000101111001010111;
15  :    1111111111111111110101001000110100000000000000000111100001100110;
16  :    0000000000000000000001100101010000000000000000000111111111010111;
17  :    0000000000000000001101110010000100000000000000000111001110000100;
18  :    0000000000000000010111110110011100000000000000000101010101010101;
19  :    0000000000000000011110001110110100000000000000000010100111110100;
20  :    0000000000000000011111111100000011111111111111111111100000010111;
21  :    0000000000000000011100101101001111111111111111111100011101110010;
22  :    0000000000000000010101000010010111111111111111111001111110001100;
23  :    0000000000000000001010000111010111111111111111111000011010010000;
24  :    1111111111111111111101101000001011111111111111111000000001011010;
25  :    1111111111111111110001100000100011111111111111111000110111100001;
26  :    1111111111111111100111101000010011111111111111111010110100001101;
27  :    1111111111111111100001100001001011111111111111111101100100001100;
28  :    1111111111111111100000000111101100000000000000000000101100010001;
29  :    1111111111111111100011101001101100000000000000000011101101100000;
30  :    1111111111111111101011100100001100000000000000000110001010000000;
31  :    1111111111111111110110101000111100000000000000000111101001100110;
END;

 

А так пользуйтесь советом gin

 

P.S. mif-файл лучше всего генерить в Matlab'e

 

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


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

P.S. mif-файл лучше всего генерить в Matlab'e

 

Файл создается с помощью матлабовских скриптов или есть отдельная утилита?

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


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

Файл создается с помощью матлабовских скриптов или есть отдельная утилита?

есть еще s-record, умеет конвертировать кучу форматов, в т.ч. mif

http://srecord.sourceforge.net/

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


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

есть еще s-record, умеет конвертировать кучу форматов, в т.ч. mif

http://srecord.sourceforge.net/

 

Отличная штука, спасибо. Пригодится=)

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


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

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

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

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

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

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

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

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

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

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