Vhdl 端口映射内存组件不工作

Vhdl 端口映射内存组件不工作,vhdl,Vhdl,我使用的是Quartus II,我需要用128x1B的8个组件创建一个256 x 4B(1KB)的内存,但我不是vhdl中的乞丐 以下是使用MegaWizard Quartus II插件创建的128x1B组件(问题不在这里): LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY altera_mf; USE altera_mf.all; ENTITY RAM_128B_MegaWizard IS PORT ( address

我使用的是Quartus II,我需要用128x1B的8个组件创建一个256 x 4B(1KB)的内存,但我不是vhdl中的乞丐

以下是使用MegaWizard Quartus II插件创建的128x1B组件(问题不在这里):

LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY altera_mf;
USE altera_mf.all;

ENTITY RAM_128B_MegaWizard IS
PORT
(
    address     : IN STD_LOGIC_VECTOR (6 DOWNTO 0);
    clock       : IN STD_LOGIC  := '1';
    data        : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
    wren        : IN STD_LOGIC ;
    q       : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END RAM_128B_MegaWizard;

ARCHITECTURE SYN OF ram_128b_megawizard IS

SIGNAL sub_wire0    : STD_LOGIC_VECTOR (7 DOWNTO 0);

COMPONENT altsyncram
GENERIC (
    clock_enable_input_a        : STRING;
    clock_enable_output_a       : STRING;
    intended_device_family      : STRING;
    lpm_hint        : STRING;
    lpm_type        : STRING;
    numwords_a      : NATURAL;
    operation_mode      : STRING;
    outdata_aclr_a      : STRING;
    outdata_reg_a       : STRING;
    power_up_uninitialized      : STRING;
    widthad_a       : NATURAL;
    width_a     : NATURAL;
    width_byteena_a     : NATURAL
);
PORT (
        wren_a  : IN STD_LOGIC ;
        clock0  : IN STD_LOGIC ;
        address_a   : IN STD_LOGIC_VECTOR (6 DOWNTO 0);
        q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
        data_a  : IN STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END COMPONENT;

BEGIN
q    <= sub_wire0(7 DOWNTO 0);

altsyncram_component : altsyncram
GENERIC MAP (
    clock_enable_input_a => "BYPASS",
    clock_enable_output_a => "BYPASS",
    intended_device_family => "Cyclone II",
    lpm_hint => "ENABLE_RUNTIME_MOD=NO",
    lpm_type => "altsyncram",
    numwords_a => 128,
    operation_mode => "SINGLE_PORT",
    outdata_aclr_a => "NONE",
    outdata_reg_a => "UNREGISTERED",
    power_up_uninitialized => "FALSE",
    widthad_a => 7,
    width_a => 8,
    width_byteena_a => 1
)
PORT MAP (
    wren_a => wren,
    clock0 => clock,
    address_a => address,
    data_a => data,
    q_a => sub_wire0
);

END SYN;
我知道这是不完整的,但无论我做什么,编译都会给我同样的错误。即使开始和结束架构之后的部分只是

1.1: RAM_128B_MegaWizard port map
        (Clock, En(0), Address(depth-4 downto 0), data(width-1 downto 24), dOut0(width-1 downto 24));
同样的事情也会发生


我知道端口映射不能在进程内部使用,但是带有进程的组件(128x1B)也不能进行端口映射?我如何组合这些组件来实现我想要的功能?

在我看来,通过引用进行端口映射时遇到了问题。以下是您正在实例化的组件:

address     : IN STD_LOGIC_VECTOR (6 DOWNTO 0);
clock       : IN STD_LOGIC  := '1';
data        : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
wren        : IN STD_LOGIC ;
q       : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
因此,如果您是通过引用进行的,您应该具有以下实例化:

 inst_1_1 : RAM_128B_MegaWizard port map
    (Address(depth-4 downto 0), Clock, data(width-1 downto 24), En(0), dOut0(width-1 downto 24));
注意信号的位置。这就是为什么我更喜欢显式端口映射,这样会减少错误


此外,我不确定对实例化名称有什么限制,但1.1对我来说似乎不是一个好名字。尝试以字母开头且只有下划线而没有句点的内容。

标签必须是标识符。这些导致错误(10500)VHDL。。。错误

基本标识符:

 basic_identifier ::=
     letter  { [ underline ] letter_or_digit }

 letter_or_digit ::=  letter | digit

 letter ::=  upper_case_letter | lower_case_letter
 extended_identifier ::=
    \ graphic_character { graphic_character } \
或扩展标识符:

 basic_identifier ::=
     letter  { [ underline ] letter_or_digit }

 letter_or_digit ::=  letter | digit

 letter ::=  upper_case_letter | lower_case_letter
 extended_identifier ::=
    \ graphic_character { graphic_character } \
在您的情况下,标签(1.1、1.2等)需要以字母开头,这有点像Russel在他的回答中附带说明的,除了在端口接口中实例化它们的位置关联不正确之外


解决这两个问题。

谢谢你发现了第一个错误,我自己也应该看到的。真正的问题是实例化名称,正如您也指出的。我现在有其他问题,我应该能够解决,但那个问题已经解决了。再次感谢