【问题标题】:Multiple Bi-directional buses in verilogVerilog中的多条双向总线
【发布时间】:2017-11-24 04:59:54
【问题描述】:

我正在尝试在 Verilog 测试台中模拟 CAN 总线。我知道 CAN 网络中的每个节点都需要 1 条双向总线。如果许多总线试图同时在总线中写入一个值会发生什么? 0 的主导值会获胜还是会产生一些错误?我正在考虑的代码是这样的:

//First node
CAN_HIGH = (read) ? 'bz : DATA_NODE_A;
//Second node
CAN_HIGH = (read) ? 'bz : DATA_NODE_B;

如果节点A写1,节点B写0,CAN_HIGH的值会不会是0?

【问题讨论】:

  • 我认为在这种情况下您会在合成器上收到多源错误。

标签: verilog can-bus bidirectional


【解决方案1】:

一般来说,如果你只是驱动一个net类型,即来自多个来源的wire,具有相同的值,结果将是你驱动的值。如果值不同,则结果将为 xz 是一个特例,是最弱的值,会被覆盖。

wire bus;
assign bus = en1 ? val1 : `z;
assign bus = en2 ? val2 : `z;

如果en1, en2 两者都关闭,则总线的值为z

如果 en1en2 ,但不是都启动,总线将被分配相应的值(1 或 2)。

如果en1en2都为高电平,那么如果val1 == val2,总线将获得val1/val2的值,否则为x

现在,在 verilog 中,您可以定义诸如分配强度之类的东西,它是不可综合的,但可以用于某些情况的行为建模,或者在测试台中。这将告诉 verilog 哪个作业应该在比赛中获胜。 verilog 有几个级别的强度,您可以在文档中找到它。这是一个例子:

wire bus;
assign (strong0, weak1) bus = en1 ? val1 : `z;
assign bus = en2 ? val2 : `z;

在上面的例子中,如果 en1 和 en2 都很高,并且值不同,则第一个赋值将具有更强的 '0' 但更接近于 '1',因此 val1 将在结果值中提供 '0' 而 assignment2 将提供'1'。您可以使用不同的强度组合。但是,如果强度相同,它的行为将与第一个示例相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多