为什么VHDL在Sumulation中工作,而在Virtex 5设备上不工作

为什么VHDL在Sumulation中工作,而在Virtex 5设备上不工作,vhdl,xilinx,Vhdl,Xilinx,我花了一整天的时间试图解决以下问题。我正在构建一个小型平均多通道示波器,我有以下用于存储信号的模块: IEEE库; 使用IEEE.std_logic_1164.all; 使用IEEE.std_logic_unsigned.all; 使用IEEE.numeric_std.all; 实体存储是 港口 ( 时钟输入:在标准逻辑中; 复位:在标准逻辑中; 元素_in:标准_逻辑中; 数据输入:标准逻辑向量(11到0); 地址:标准逻辑向量(9到0); add:在标准逻辑中--add='1'表示添加到R

我花了一整天的时间试图解决以下问题。我正在构建一个小型平均多通道示波器,我有以下用于存储信号的模块:


IEEE库;
使用IEEE.std_logic_1164.all;
使用IEEE.std_logic_unsigned.all;
使用IEEE.numeric_std.all;
实体存储是
港口
(
时钟输入:在标准逻辑中;
复位:在标准逻辑中;
元素_in:标准_逻辑中;
数据输入:标准逻辑向量(11到0);
地址:标准逻辑向量(9到0);
add:在标准逻辑中--add='1'表示添加到RAM
--add='0'表示写入RAM
转储:在标准逻辑中;
元素输出:输出标准逻辑;
数据输出:输出标准逻辑向量(31到0)
);
终端存储;
存储的rtl体系结构是
组件bram是
港口
(
clk:标准逻辑中;
我们:在标准逻辑中;
en:标准逻辑;
地址:标准逻辑向量(9到0);
di:标准逻辑向量(31到0);
do:输出标准逻辑向量(31到0)
);
端部元件;
类型状态为(st_startwait、st_add、st_write);
信号当前状态:状态:=st\U startwait;
信号下一个状态:状态:=st\U startwait;
信号启动:标准逻辑;
信号we:std_逻辑;
信号en:std_逻辑;
信号di:std_逻辑_向量(31向下至0);
信号do:std_逻辑_向量(31向下至0);
信号数据:标准逻辑向量(11到0);
开始
ram:bram端口图
(
时钟=>时钟输入,
我们=>我们,
en=>en,
地址=>addr,
di=>di,
do=>do
);
过程(时钟输入、复位、启动)
开始
如果上升沿(clk_in),则
如果(重置='1'),则

当前状态下面列出了一些需要解决的初始问题


存储
实体中的
进程(当前状态、启动、转储)
用于实现组合元件(门),但信号(端口)
中的数据不在灵敏度列表中

这很可能导致模拟和合成之间的差异 行为,因为模拟通常只对 灵敏度列表,其中综合将实施组合设计和 对所有使用的信号作出反应,但可能会发出灵敏度不完全的警告 列出或推断闩锁。如果您使用的是VHDL-2008,那么use可以使用
(所有)
的灵敏度列表,以使工艺灵敏度适用于所有使用的 信号,否则需要手动添加缺失的信号


进程(当前状态、启动、转储)
中的
案例当前状态为

当其他=>…
时,因此合成工具可能已经给了您一个警告 关于推断的闩锁。当其他=>
使用并将过程驱动的所有信号分配给相关值


use
子句列出:

use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;
但这两种方法不应同时使用,因为它们声明了一些 例如,在这两种语言中声明了相同标识符的
无符号
。自从 RAM使用的是
std\u logic\u unsigned
删除
数字标准的使用
。对于新代码,我建议使用
数字标准


此外,存储中的
过程(clk\u in、reset、start)
实体实现了 顺序元件(触发器)仅对
时钟单元的上升沿敏感,因此
灵敏度列表中的最后两个信号
…,reset,start)
是不必要的,
但不会引起问题。

描述预期条件和实际结果会有所帮助。编辑。。。还是添加测试台更好?如果纠正以下问题不能解决问题,请添加测试台。感谢这些建议。我将清理设计并再次测试。当我了解更多信息时,将更新页面。非常感谢!将数据_添加到灵敏度列表中破坏了模拟,所以现在我知道该怎么做了。我应该注意到这一点。除了勾选答案(我是新的@stack exchange),我如何给你评分?我也计划张贴固定的设计,所以这是一个教训,其他人。谢谢更新。关于堆栈溢出(SO)的反馈,只需标记答案,就像你做的那样,如果与一个简短的精确的事实更新有关,那么就如你所做的那样;这就是每个人变得更聪明和快乐的全部条件。欢迎来到SO。
library IEEE;

use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity bram is
    port
    (
        clk  : in  std_logic;
        we   : in  std_logic;
        en   : in  std_logic;
        addr : in  std_logic_vector(9 downto 0);
        di   : in  std_logic_vector(31 downto 0);
        do   : out std_logic_vector(31 downto 0)
    );
end bram;

architecture rtl of bram is
    type ram_type is array (0 to 999) of std_logic_vector (31 downto 0);
    signal buf : ram_type;
begin
    process(clk, en, we)
    begin
        if rising_edge(clk) then
            if en = '1' then
                if we = '1' then
                    buf(conv_integer(addr)) <= di;
                else
                    do <= buf(conv_integer(addr));
                end if;
            end if;
        end if;
    end process;
end rtl;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;