【问题标题】:Implementing ROM in xilinx ( vhdl )在 xilinx (vhdl) 中实现 ROM
【发布时间】:2013-07-10 19:53:08
【问题描述】:

我正在尝试实现一个 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 ;

测试台文件:

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 ; 

错误是:

ERROR:Simulator:29 - at 0 ns : in rom_tb(tb), file D:/VHDLPrograms/Tb/ROM/rom_tb.vhd:实体rom到的默认端口映射 component rom 将组件的 INTEGER 类型的本地端口地址连接到 实体的 std_logic_vector 类型端口。

【问题讨论】:

  • 我刚刚使用 ISE 14.4 和 ISim 构建了您在新 Xilinx 项目中的代码,但无法重现您的问题。
  • 表示它正在工作。你得到输出了吗?
  • 好的!行为模拟正在运行,但路由后模拟不起作用。
  • 我在 modelsim 10.2 上测试了你的 tb,它工作正常。但是,我收到以下警告:“警告:[4] rom_tb.vhd(26): (vcom-1207) 抽象文字和标识符之间必须有分隔符。”。

标签: vhdl xilinx


【解决方案1】:

检查您在上面发布的(良好的)测试台实际上是您正在模拟的那个。

如果您使用 Xilinx 工具为您的 ROM 等 VHDL 实体生成测试平台,它会自动将您的所有端口数据类型转换为 std_logic[_vector],因此在您修复它之前生成的测试平台将无法工作。您报告的错误听起来好像您的项目中有多个“rom_tb”文件。如果这不是问题,请尝试“重新运行所有”或“项目/清理项目文件”,然后“重新运行所有”以消除所有文件的过时编译版本。

编辑:路由后模拟有相反的问题。整数端口已由 synth/P&R 进程转换为 std_logic_vector。一种解决方案是创建一个包装文件,该文件看起来像您的“Rom”实体,但架构将地址端口转换为“unsigned”,然后是“std_logic_vector”,并将其传递给 ROM 的 post-PAR 版本。

最好运行一次或两次 PAR 后模拟,以增强对工具的信心,但这不应该是例行公事。通常情况下,行为仿真和 PAR 后静态时序分析就足够了,除非您正在寻找工具错误(不正确的综合)或异步逻辑(跨时钟域)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多