memory - 在设计 8 x 32 内存时,当块后端口映射导致未知输出时,2d 信号导致生成块
问题描述
请帮助我,我正在尝试使用结构建模开发 8 x 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
解决方案
推荐阅读
- c++ - 查找字符串长度的简单程序
- java-8 - 将对象列表 {string, list-of-strings} 转换为字符串流,如“main1 sub1”、“main1 sub2”、“main2 sub3”
- vue.js - 如何在不重置分页的情况下刷新 b-table 组件?
- html - 有没有办法在 Nginx 中显示 HTML 代码而不是执行它?
- mysql - 在 Laravel 6 中搜索
- java - 在paintComponent中使用for循环是否安全?
- javascript - 如何正确使用 d3.js 拖动?
- react-native - React Native 中的二维码扫描器和 Webview
- json - jq:从平面键创建 JSON 对象
- r - R while:仅改变 data.frame 中不匹配条件的组