我正在尝试实现一个rom模块并为它构建一个测试平台。 rom.vhd的检查语法显示'正确',它也显示'正确'测试平台文件,但是当我点击simluate时它显示一些错误。
以下是显示的代码和错误。
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
----------------
entity rom is
port ( clk : in std_logic ;
address : in integer range 0 to 15 ;
data_out : out std_logic_vector( 7 downto 0 )) ;
end entity ;
------------------
architecture arch of rom is
signal reg_address : integer range 0 to 15 ;
type memory is array ( 0 to 15 ) of std_logic_vector( 7 downto 0 ) ;
constant myrom : memory := (
2 => "11111111" , --255
3 => "11010101" ,
4 => "01101000" ,
6 => "10011011" ,
8 => "01101101" ,
9 => "00110111" ,
others => "00000000" ) ;
begin
process(clk)
begin
if( clk'event and clk = '1' ) then
reg_address <= address ;
end if ;
end process ;
---------------
data_out <= myrom(reg_address) ;
end architecture ;
testbench文件:
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
----------------
entity rom_tb is
end entity ;
-----------------------
architecture tb of rom_tb is
component rom is
port ( clk : in std_logic ;
address : in integer range 0 to 15 ;
data_out : out std_logic_vector( 7 downto 0 )) ;
end component ;
--------------------------
signal clk_tb : std_logic := '0' ;
signal address_tb : integer := 0 ;
signal data_out_tb : std_logic_vector( 7 downto 0 ) ;
--------------------------
begin
dut : rom port map (
clk => clk_tb ,
address => address_tb ,
data_out => data_out_tb ) ;
------------------
clk_tb <= not clk_tb after 20ns ;
address_tb <= 1 after 30ns ,
2 after 60ns ,
3 after 90ns ,
4 after 120ns ,
5 after 150ns ,
6 after 180ns ,
7 after 210ns ,
8 after 240ns ,
9 after 270ns ,
10 after 300ns ,
11 after 330ns ,
12 after 360ns ,
13 after 390ns ,
14 after 420ns ,
15 after 450ns ;
end architecture ;
错误是:
错误:模拟器:29 - 0 ns:在rom_tb(tb)中,文件 D:/VHDLPrograms/Tb/ROM/rom_tb.vhd:实体rom的默认端口映射 component rom连接组件的INTEGER类型本地端口地址 std_logic_vector实体的类型端口。
答案 0 :(得分:3)
检查您上面发布的(好)测试台实际上是您正在模拟的测试台。
如果您使用Xilinx工具为您的ROM之类的VHDL实体生成测试平台,它会自动将您的所有端口数据类型转换为std_logic [_vector],以便生成的测试平台在您修复之前不会工作。您报告的错误听起来好像有多个&#34; rom_tb&#34;文件在你的项目中。如果那不是问题,那么试试&#34;重新运行所有&#34;或&#34;项目/清洁项目文件&#34;然后&#34;重新运行所有&#34;消除所有文件的过时编译版本。
编辑:路线后模拟有相反的问题。整数端口已由合成器/ P&amp; R进程转换为std_logic_vector。一种解决方案是创建一个看起来像你的&#34; Rom&#34;实体,但架构将地址端口转换为&#34; unsigned&#34;然后&#34; std_logic_vector&#34;,并将其传递给ROM的后PAR版本。
最好一次或两次运行后PAR模拟,以获得对工具的信心,但这不应该是常规的。通常情况下,行为模拟和后PAR静态时序分析是足够好的,除非您追逐工具错误(不正确的合成)或异步逻辑(跨越时钟域)。