关于Verilog中的inout数据类型,求助啊
时间:10-02
整理:3721RD
点击:
inout数据类型的赋值总是不对。
比如rom_data[7:0],mode[1:0]都为输入信号,IO[7:0]为inout信号,
always@ (posedge clk)
begin
if(!reset)
begin
无关紧要的东西
end
else
begin
case(mode)
2'b00 :
IO[7:0]<=rom_data[7:0];
......
endcase
end
end
怎么仿真的时候IO赋值根本就不是rom_data的值啊,是怎么回事啊,难道inout还有别的什么赋值方式?
比如rom_data[7:0],mode[1:0]都为输入信号,IO[7:0]为inout信号,
always@ (posedge clk)
begin
if(!reset)
begin
无关紧要的东西
end
else
begin
case(mode)
2'b00 :
IO[7:0]<=rom_data[7:0];
......
endcase
end
end
怎么仿真的时候IO赋值根本就不是rom_data的值啊,是怎么回事啊,难道inout还有别的什么赋值方式?
先把rom_data[7:0] 赋给一个reg型变量,如IO_reg[7:0]
然后assign IO = IO_reg;
试试啊,看看行不行 2# fslrayman
如果这样的话,我后面还有别的时刻还有读取IO的内容啊,这样还能够读吗?
比如ram_data[7:0]<=IO[7:0];
你那样的话就是把IO当成输出了吧,没有考虑到IO的输入功能吧
111111111111111111
IO口是双向口,需要一个方向选通信号oEN
一般是
assign port_io = oEN ? 1'bz : port_o;
assign port_i = port_io;
所以你还应该有选通信号的register
楼上正解
我觉得对于HDL语言设计时一定要先明白它综合后对应的硬件逻辑电路。对于inout型,并不要简单理解为一种数据类型,综合后它要对应一个硬件电路。因此“小富人”同学的HDL描述有道理。只有再加上门控信号,才能实现inout功能 呵呵
试试 buffer 类型?
搞清楚为什么要用IO。
恩,谢谢,已经搞定。真的是这样的,怎么以前看书的时候没看到过这样的玩意啊,呵呵
恩,要对应硬件来理解,谢谢了
同意小富人的看法
最好还是别设置buffer,
双向inout信号关键是要有选通信号,在输出时,将其值设为高阻态。
小富人的解释很好啊
