这不是关于实际创建具有inout端口的verilog模块。我发现了很多帖子。
我坚持的是,如果我有一个带有inout端口的blackbox模块,那就说它定义为
module blackbox(inout a, in b, in c)
我想在不同的模块中实例化它,比如
module myModule(input reg inReg, output wire outWire)
blackbox(outWire);
如何使用inReg驱动黑盒,并在不同时间在outWire上输出?我不知道连接一个并断开另一个的方法。这显然过于简单了。我真正拥有的是下面,但它更复杂。
module sram_control(
input wire HCLK,
input wire [20:0] HADDR,
input wire HWRITE,
input wire [1:0] HTRANS,
input wire [7:0] HWDATA,
output reg [7:0] HRDATA
);
parameter IDLE_PHASE = 2'b00;
parameter WRITE_PHASE = 2'b01;
parameter READ_PHASE = 2'b10;
parameter IDLE = 2'b00;
parameter NONSEQ = 2'b10;
parameter READ = 1'b0;
parameter WRITE = 1'b1;
reg current_state, next_state;
wire CE, WE, OE;
reg [20:0] A;
wire [7:0] DQ;
reg [7:0] DQ_tmp1;
wire [7:0] DQ_tmp2;
async the_mem(.CE_b(CE), .WE_b(WE), .OE_b(OE), .A(A), .DQ(DQ));
always @(posedge HCLK) begin
if(current_state == IDLE_PHASE) begin
next_state <= HTRANS == NONSEQ? (HWRITE == WRITE? WRITE_PHASE : READ_PHASE) : IDLE_PHASE;
A <= HADDR;
end
else if(current_state != IDLE_PHASE) begin
if(HTRANS == NONSEQ) begin
if(HWRITE == WRITE) begin
next_state <= WRITE_PHASE;
end
else begin
next_state <= READ_PHASE;
end
end
else next_state <= IDLE_PHASE;
end
// we never get here
else next_state <= IDLE_PHASE;
end
always@(posedge HCLK) begin
if(current_state == READ_PHASE) HRDATA <= DQ;
end
assign CE = current_state != IDLE_PHASE? 1 : 0;
assign WE = current_state != IDLE && HWRITE == WRITE? 1 : 0;
assign OE = current_state != IDLE_PHASE? 1 : 0;
always@(posedge HCLK) current_state <= next_state;
endmodule
我需要的是一种在我想写入时将HWDATA分配给异步模块的方法,当我想从异步中读取时,我需要一种方法将异步模块的输出分配给HRDATA。
答案 0 :(得分:2)
正如你所说,这不是一个Verilog问题,这是一个逻辑设计问题。
您需要实现一个三态驱动程序来驱动DQ
:
assign DQ = WE ? 8'bz : HWDATA;
(假设您在写作时WE
为1'b0
)。
一般情况下,我会避免IC / FPGA中的三态逻辑,因为当多个驱动器驱动总线时不仅存在明显的问题,如果没有任何驱动器也会出现问题总线(一些门获得浮动输入)。 IC设计还存在其他问题。但是,大概在这种情况下你没有选择;大概你没有设计模块async
。 (如果你这样做 - 取出inout
。)