2013-12-01 3 views
4

Я пытаюсь сделать буфер для хранения 16, 16-разрядных инструкций для небольшого дизайна процессора.Объявление массива внутри объекта в VHDL

Мне нужен способ загрузить инструкции в буфер из моего тестового стенда. Поэтому я хотел использовать массив std_logic_vectors для этого. Тем не менее, я получаю синтаксическую ошибку, и я не уверен, почему (или если мне разрешено делать это в VHDL, если на то пошло).

Ошибка синтаксиса в строке, где я объявляю instructions

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 




entity instruction_buffer is 
    port 
    (
    reset    : in std_logic; 
    instructions  : in array(0 to 15) of std_logic_vector(15 downto 0); 
    instruction_address : in std_logic_vector(3 downto 0); 
    clk     : in std_logic; 
    instruction_out  : out std_logic_vector(15 downto 0) 
    ); 
end instruction_buffer; 

Я пытался делать так, как хорошо, но затем я получаю синтаксические ошибки в моем отображении порта сущности говоря мне, что std_logic_vector неизвестный тип. Я клянусь, синтаксические ошибки VHDL являются менее значимыми, чем C хаха

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

package instructionBuffer is 
    type instructionBuffer is array(0 to 15) of std_logic_vector (15 downto 0); 
end package instructionBuffer; 

entity instruction_buffer is 
    port 
    (
    instruction_address : in std_logic_vector(3 downto 0); 
    clk     : in std_logic; 
    instruction_out  : out std_logic_vector(15 downto 0) 
    ); 
end instruction_buffer; 

ответ

5

Я получил это работает:

В один файл у меня есть следующие:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

package instruction_buffer_type is 
    type instructionBuffer is array(0 to 15) of std_logic_vector (15 downto 0); 
end package instruction_buffer_type; 

, а затем в другом у меня есть:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

use work.instruction_buffer_type.all; 

entity instruction_buffer is 
    port 
    (
    instruction_address : in std_logic_vector(3 downto 0); 
    instructions  : in instructionBuffer; 
    clk     : in std_logic; 
    instruction_out  : out std_logic_vector(15 downto 0) 
    ); 
end instruction_buffer; 

Это настолько очевидно, что этот язык был правительственным проектом. Это слишком избыточно.

+1

Это не избыточно, это потому, что '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' См. Здесь: http://stackoverflow.com/a/19858069/106092. Вы все равно можете сохранить все в одном файле, просто убедитесь, что у вас есть необходимые пункты библиотеки в * для каждого устройства *. –

5

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

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

package instruction_buffer_type is 
constant INSTRUCTION_BUFFER_ADDRESS : integer := 4; --bits wide 
constant INSTRUCTION_BUFFER_DATA : integer := 16; --bits wide 
type instructionBuffer is array(0 to 2**INSTRUCTION_BUFFER_ADDRESS -1) of std_logic_vector (INSTRUCTION_BUFFER_DATA -1 downto 0); 
end package instruction_buffer_type; 

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

use work.instruction_buffer_type.all; 

entity instruction_buffer is 
    port 
    (
    instruction_address : in std_logic_vector(INSTRUCTION_BUFFER_ADDRESS-1 downto 0); 
    instructions  : in instructionBuffer; 
    clk     : in std_logic; 
    instruction_out  : out std_logic_vector(INSTRUCTION_BUFFER_DATA-1 downto 0) 
    ); 
end instruction_buffer; 
Смежные вопросы