std_logic或std_ulogic?


24

似乎世界已经决定了std_logic(和std_logic_vector)是表示VHDL中位的默认方式。替代方法是std_ulogic,但无法解决。

这让我感到惊讶,因为通常情况下,您不是在描述公共汽车,所以您不需要多个驱动程序,也不需要解析信号。这样做的好处std_ulogic是,如果您有多个驱动程序,编译器会提前警告您。

问题:这仅仅是文化/历史问题,还是使用std_logic的技术原因?


3
“世界”是错误的。聪明的工程师使用std_ulogic是因为它具有正确的语义。
wjl

@wjl我将其解释为“这是文化/历史问题”。您在下面的回答比这里的评论更有帮助。
菲利普

我先写了评论,然后认为留下更具体的答案会更合适。对不起,我想这听起来有些浮躁。但是我的评论是直截了当的,因为大多数人开始使用std_logic是因为他们是通过这种方式学习的,然后过了一会儿他们开始对std_ulogic感到疑惑,然后查找它,意识到它的语义,然后转换为它。=)
wjl 2011年

Answers:


16

Std_logic是std_ulogic的子类型,并且恰好具有一个额外的属性:如果有多个驱动程序,则可以解决。

无论采用哪种惯例,std_ulogic都是用于需要9值逻辑的未解析信号的正确类型。(通常,使用“位”甚至更正确-例如,在某些没有“ X”或“ U”之类的FPGA体系结构上)。

基本上,最好的办法是为作业使用正确的类型。人们往往会在模仿别人看到的别人惯用的风格时散布坏习惯,却不理解为什么。


8
该体系结构可能没有“ U”,但是像发现它那样进行仿真通常很有用,因为您会发现错误的初始化。为“最好的事情+1”是正确的工作类型,但我们倾向于学习“最好的” :)
Martin Thompson

8

我的历史是这样的:

我一直(大约在1999 IIRC时)就开始使用std_ulogic*-出于您所描述的原因,这是正确的做法。

然后,我必须连接到一堆向导生成的供应商IP,这些IP std_logic在整个接口上都有。这意味着在端口映射(用于_vector元素)上进行了转换,我变得懒惰并转移到using std_logic*

但是,我似乎很少犯“双重驱动”错误,因此我没有std_ulogic像我想的那样错过太多。drivers当我偶尔需要时,Modelsim的命令使查找“谁在驾驶什么”变得非常容易。


是的,IP内核(尤其是从Verilog自动转换的东西)倾向于使用std_logic。您的答案似乎表明原因主要是“文化/历史”。
菲利普

您无需在端口上的std_logic和std_ulogic之间进行转换。您是说必须在std_logic_vector和std_ulogic_vector之间转换吗?
wjl

@wjl:对不起,是的,这就是我的意思。我将更新帖子。
马丁·汤普森

AFAIK,std_logic和std_ulogic具有相同的基本类型,因此它们是分配兼容的。因此,不需要手动转换。
2014年

@val:这就是WJL说(我同意) -但*vector端口部分仍然需要转换
马丁汤普森

4

IIRC建议使用著名的“重用方法论手册” std_logic(_vector),因此公司等中的方法学组可能会以(强制性)编码指南的形式进一步传播这种信息。就个人而言,请std_ulogic在可能的情况下使用+1 。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.