如何写入同一模块的inout端口和从inout端口读取?

Fat*_*ons 3 verilog inout

这与实际创建带有inout端口的verilog模块无关。我找到了很多关于此的帖子。

我所坚持的是,如果我有一个带有inout端口的黑盒模块,可以说它的定义像

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
Run Code Online (Sandbox Code Playgroud)

我需要的是一种当我要向异步模块写入时将HWDATA分配给异步模块的方法,而当我想从异步中读取时,需要一种将异步模块的输出分配给HRDATA的方法。

Kar*_*hah 5

对于所有inout端口,您可以随时读取数据。但是,为了驱动该网络,通常使用三态缓冲区。原因是同一网络可能与多个模块共享,并且由于网络处于打开状态inout,因此为了消除多个驱动程序之间的冲突,使用了三态缓冲区。

在此处输入图片说明

对于上面相同的图像,这是代码。

assign io = t ? i : 1'bz; // To drive the inout net
assign o = io; // To read from inout net
Run Code Online (Sandbox Code Playgroud)


Mat*_*lor 2

正如你所说,这不是一个Verilog问题,这是一个逻辑设计问题。

您需要实现一个三态驱动程序来驱动DQ

assign DQ = WE ? 8'bz : HWDATA;
Run Code Online (Sandbox Code Playgroud)

(假设WE1'b0当你正在写的时候)。

一般来说,我会避免IC/FPGA 中使用三态逻辑,因为不仅当多个驱动器驱动总线时存在明显的问题,而且如果没有任何驱动器驱动总线(某些门获得浮动输入),这也是一个问题。IC设计还存在进一步的问题。然而,在这种情况下你可能别无选择;想必你没有设计模块async。(如果你这样做了 - 取出inout。)