作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解在 SystemVerilog 中应如何定义引脚。
我有:
dataBus
ramController
模块,可以在其 ioData
引脚上发送或接收数据。ramController
的顶级模块(例如准备一个显示缓冲区)vgaController
,主要从 ramController
接收数据,但也有一个命令模式,允许使用 dataBus
上的数据对其进行配置ramController
中的 ioData
引脚是双向的,但也需要是三态的,以便 ramController
可以“关闭”总线”,当 dataBus
被用来向 vgaController
module RAMController(
inout wire[15 : 0 ] ioData,
..
);
..
logic [15 : 0 ] ioDataCopy;
assign ioData = ( chipSelect ) ? ioDataCopy : 16'hzzzzzzzzzzzzzzzz;
即使 vgaController 从不写入数据总线,它的引脚是否需要 inout 才能输入或 HiZ?
module VGAController(
inout wire [15 : 0 ] iData;
);
..
logic [15 : 0 ] iDataCopy = 0;
assign iData = ( chipSelect ) ? iDataCopy : 16'bzzzzzzzzzzzzzzzz;
dataBus
只是顶层模块中的一组连线值吗?
module Top(
..
);
..
wire [15 : 0 ] dataBus;
我可能完全错了。有人可以帮我定义一个包含共享同一总线的多个模块的系统吗?
最佳答案
如果没有可重现的例子,很难说你做的是对还是错。但是,您的某些断言基本上是正确的。我假设您的 dataBus
与 Controller 级别的 ioData
相同。在这种情况下,如果两个 Controller 都在“top”中实例化并正确连接,那么您应该已经准备就绪。您必须确保总线始终只有一个驱动程序,以便“chipSelect”防止总线的多个驱动。
因此,这是一个演示上述内容的示例。
module Top();
wire [15 : 0 ] dataBus;
logic[1:0] select;
RAMController rc(.ioData(dataBus), .chipSelect(select == 1 ? 1 : 0));
VGAController vc(.ioData(dataBus), .chipSelect(select == 2 ? 1 : 0));
always @*
$display("%0t select: %b, data: %b", $time, select, dataBus);
initial begin
select = 0;
#1 select = 1;
#1 select = 0;
#1 select = 2;
#1 select = 0;
#1 $finish;
end
endmodule
module RAMController(
inout wire[15 : 0 ] ioData,
input logic chipSelect
//...
);
logic [15 : 0 ] ioDataCopy = 1;
assign ioData = ( chipSelect ) ? ioDataCopy : 'z;
endmodule
module VGAController(
inout wire[15 : 0 ] ioData,
input logic chipSelect
//...
);
logic [15 : 0 ] ioDataCopy = 2;
assign ioData = ( chipSelect ) ? ioDataCopy : 'z;
endmodule
结果:
0 select: 00, data: xxxxxxxxxxxxxxxx
0 select: 00, data: zzzzzzzzzzzzzzzz
1 select: 01, data: zzzzzzzzzzzzzzzz
1 select: 01, data: 0000000000000001
2 select: 00, data: 0000000000000001
2 select: 00, data: zzzzzzzzzzzzzzzz
3 select: 10, data: zzzzzzzzzzzzzzzz
3 select: 10, data: 0000000000000010
4 select: 00, data: 0000000000000010
4 select: 00, data: zzzzzzzzzzzzzzzz
为了更加详细,您可以使用 tri
定义而不是 wire
。它们之间没有区别,但是使代码更具可读性,恕我直言。
tri [15:0] dataBus;
...
tri [15:0] ioData;
关于verilog - 如何在 SystemVerilog 中定义共享同一数据总线的多个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64311746/
我正在为一项新业务设计一个系统,并且处于一个独特的“全权委托(delegate)”位置。 与所有企业一样,它计划持续很长时间并发展到不确定的规模。 是否值得全力以赴开发一个具有显式数据和服务总线的完整
我是一名优秀的程序员,十分优秀!