2015-05-09 460 views
0

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

qSTD_LOGIC信号,我试图按如下初始化:

signal q : STD_LOGIC := '0'; 

然而,当我运行使用的ModelSim程序它显示的U一个值,好象它是未分配的。如果我在ModelSim中运行时强制冻结'0'q的信号,那么它就起作用。

是否只有这样才能在行为描述开始时检查值并将其设置为'0'(如果未指定)?

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

我会发布我的代码,但我不想冒学术诚信违规,因为这是一个学校项目。

+0

别的什么东西开车Q?请注意,如果初始值为'0'并且有驱动器驱动'U',则这两个值将解析为'U'。 (如果你不明白,请阅读有关解析功能)。 –

+0

那么,我将一个D触发器组件的输出'q'映射到问题中指定的'q'。你是这个意思吗? –

+2

是的,那是你的问题。您需要清除触发器中的'U',可以通过重置或'0'或'1'计时。 –

回答

0

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

正如在评论中提到的,您可以通过在复位时指定一个值来解决这个问题 - 这是相当标准的做法 - 或者用一个初始化输出(q)的值计时。

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