【问题标题】:VHDL Initialize std_logicVHDL 初始化 std_logic
【发布时间】:2015-05-09 18:49:39
【问题描述】:

我正在编写一个顺序计数器,它由一系列使用 D 触发器组件的单计数器组件组成。在单计数器中,我需要从 '0' 的初始值开始 q,但我在初始化时遇到了问题。

q 是一个STD_LOGIC 信号,我尝试将其初始化如下:

signal q : STD_LOGIC := '0';

但是,当我使用 ModelSim 运行程序时,它显示的值是 U,就好像它没有被分配一样。如果我在 ModelSim 中运行时强制将 '0' 的信号冻结为 q,那么它可以工作。

完成此操作的唯一方法是检查行为描述开头的值并将其设置为'0'(如果未分配)吗?

如果我使用BIT 而不是STD_LOGIC,则一切正常。

我会发布我的代码,但我不想冒违反学术诚信的风险,因为这是针对学校项目的。

【问题讨论】:

  • 还有什么驱动 Q 吗?请注意,如果初始值为0 并且有驱动程序驱动“U”,则这两个值解析为“U”。 (如果你不明白这一点,请阅读解析函数)。
  • 好吧,我将输出 q 从 D 触发器组件映射到问题中指定的 q。这是你的意思吗?
  • 是的,这是你的问题。您需要清除触发器中的“U”,方法是重置它,或者输入“0”或“1”。

标签: vhdl modelsim


【解决方案1】:

这适用于 BIT 而不是 STD_LOGIC 的原因是因为 BIT 有两个值“1”和“0”(没有值表示未初始化),而 STD_LOGIC 有 9 个值,其中一个是“U”,它是常说“这个值还没有设置”。

正如在 cmets 中提到的,您可以通过在复位时分配一个值(这是相当标准的做法)或输入一个值来初始化输出 (q) 来解决这个问题。

如果您想知道为什么信号声明中的初始化不起作用,那是因为并非所有综合工具都会承认这种初始化,而 ModelSim 就是其中之一。当您将其放在 FPGA 上时,Quartus 确实会确认这种初始化,但 Lattice Diamond 或 Xilinx ISE 可能不会,但由于大多数设备都提供了 POR(上电复位),如果您包含复位条件,q 将始终为已初始化,因此最好这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多