2d сигнал приводит к генерации блока, когда порт отображается после того, как блок ведет к неизвестному выходу при проектировании памяти 8 на 32 - PullRequest
0 голосов
/ 25 февраля 2019

Пожалуйста, помогите мне, я пытаюсь создать 8 × 32-битную память для чтения / записи с использованием структурного моделирования.Я разработал следующие модули

0) output_array_types (пакет)

1) register_32_bit

2) dmux_1by8

3) mux_8by1 (ширина 32 бита))

4) xor_1bit (не относится к моей проблеме)

5) data_memory_2pow3_32 (здесь возникает моя проблема)

Все модули были протестированы независимо, и все они работаюткроме основного файла (5-й), из-за некоторого отсутствия понимания синтаксиса vhdl, mux_8by1, используемый в основном файле, дает неизвестный вывод для входного сигнала 2d (который содержит все 8 значений регистра памяти), из которого предполагается мультиплексорвыбрать строку на основе адреса, указанного в строке выбора, чтобы получить значение этой строки в качестве выходных данных.

Я приложил код и вывод ниже.Пожалуйста, помогите, где в основном файле я не так, я особенно сомневаюсь в "unit11" в основном файле.

заранее спасибо

output_array_types.vhd

library ieee;

use ieee.std_logic_1164.all;

package output_array_types is

    type op_arr is array(0 to 7) of STD_LOGIC;
    type op_arr_32bit is array(0 to 7) of STD_LOGIC_VECTOR(31 downto 0);

end package output_array_types;

register_32_bit.vhd

library ieee;

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity register_32_bit is
    port(
        rst: in STD_LOGIC;
        enable: in STD_LOGIC;
        load: in STD_LOGIC;
        data_in: in STD_LOGIC_VECTOR(31 downto 0);
        data_out: out STD_LOGIC_VECTOR(31 downto 0)
    );
end register_32_bit;

architecture behavioral of register_32_bit is

begin
     process(rst,enable,load)
     begin
          if (rst = '0') then
                data_out<=STD_LOGIC_VECTOR(to_unsigned(0, 32));
          elsif (enable = '1') then
                if (load = '1') then
                      data_out<=data_in;
                end if;
          end if;
     end process;
end behavioral;

dmux_1by8.vhd

library ieee;

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

use work.output_array_types.all;

entity dmux_1by8 is
    port(data_in: in STD_LOGIC;
        sel: in STD_LOGIC_VECTOR(2 downto 0);
        data_out: out op_arr
    );
end dmux_1by8;

architecture behavioral of dmux_1by8 is
begin
    process(sel)
    begin
        data_out<= (others =>'0');
        data_out(to_integer(unsigned(sel)))<= data_in;
    end process;
end behavioral;

mux_8by1.vhd

library ieee;

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

use work.output_array_types.all;

entity mux_8by1 is
    port(data_in: in op_arr_32bit;
        sel: in STD_LOGIC_VECTOR(2 downto 0);
        data_out: out STD_LOGIC_VECTOR(31 downto 0)
    );
end mux_8by1;

architecture behavioral of mux_8by1 is

begin
    process(sel)
    begin
        data_out<= data_in(to_integer(unsigned(sel)));
    end process;
end behavioral;

xor_1bit.vhd

library ieee;

use ieee.std_logic_1164.all;

entity xor_1bit is
    port(op: in STD_LOGIC_VECTOR(1 downto 0);
        result: out STD_LOGIC
    );
end xor_1bit;

architecture behavioral of xor_1bit is
begin
    process(op)
    begin
        if(op = "00") then
        result<= '0';
        elsif(op = "01") then
        result<= '1';
        elsif(op = "10") then
        result<= '1';
        elsif(op = "11") then
        result<= '0';
        end if;
    end process;
end behavioral;

data_memory_2pow3_32.vhd

library ieee,work;

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.output_array_types.all;


entity data_memory_2pow3_32 is
    port(mem_write: in STD_LOGIC := '1';
        mem_read: in STD_LOGIC := '0';
        address: in STD_LOGIC_VECTOR(31 downto 0) := (others => '0');
        write_data: in STD_LOGIC_VECTOR(31 downto 0) := (others => '0');
        read_data: out STD_LOGIC_VECTOR(31 downto 0);
        mem_rst: in STD_LOGIC := '1'
    );
end data_memory_2pow3_32;

architecture structural of data_memory_2pow3_32 is
    component register_32_bit is
    port(
        rst: in STD_LOGIC;
        enable: in STD_LOGIC;
        load: in STD_LOGIC;
        data_in: in STD_LOGIC_VECTOR(31 downto 0);
        data_out: out STD_LOGIC_VECTOR(31 downto 0)
    );
    end component;

    component dmux_1by8 is
    port(data_in: in STD_LOGIC;
        sel: in STD_LOGIC_VECTOR(2 downto 0);
        data_out: out op_arr
    );
    end component;

    component mux_8by1 is
    port(data_in: in op_arr_32bit;
        sel: in STD_LOGIC_VECTOR(2 downto 0);
        data_out: out STD_LOGIC_VECTOR(31 downto 0)
    );
    end component;

    component xor_1bit is
    port(op: in STD_LOGIC_VECTOR(1 downto 0);
        result: out STD_LOGIC
    );
    end component;


signal dmux_1by8_out : op_arr;
signal mux_8by1_in : op_arr_32bit;
signal read_xor_write: STD_LOGIC;
signal mux_8by1_out: STD_LOGIC_VECTOR(31 downto 0);
alias address_0to2 is address(2 downto 0);

begin
    unit0: xor_1bit port map(op(0) => mem_write, op(1) => mem_read, result => read_xor_write);

    unit1: dmux_1by8 port map(data_in => mem_write, sel => address_0to2, data_out => dmux_1by8_out);

    unit: for i in 0 to 7 generate
        unit2to9: register_32_bit port map(rst => mem_rst ,enable => read_xor_write ,load => dmux_1by8_out(i),data_in => write_data,data_out => mux_8by1_in(i));
        end generate;

    --Till here everything works, after this when the mux_8by1_in (2d signal
    --array) is mapped to the mux_8by1 below, the output read_data 
    --turns out to be unknown whereas there's no problem in mux_8by1 module 
    --when tested independently. Hence there must be some erroneous mapping 
    --being performed here.

    unit11: mux_8by1 port map(data_in => mux_8by1_in, sel => address_0to2, data_out => read_data);

end structural;

[1 [вывод получен в modelsim]]: https://i.stack.imgur.com/McvV4.png

[2 [схема архитектуры памяти, которую я использую]]: https://i.stack.imgur.com/hJb7n.jpg

...