2016-12-01 71 views
0

这不是关于实际创建带inout端口的verilog模块。有很多我发现的帖子。如何写入inout端口并从同一模块的inout端口读取?

我所坚持的就是,如果我有一个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 

[email protected](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; 
[email protected](posedge HCLK) current_state <= next_state; 
endmodule 

我需要的是HWDATA分配给异步模块时,我想写信给它一个方式,我需要一种方法来分配异步模块HRDATA的输出时,我想从读异步。

回答

0

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

你需要实现三态司机开车DQ

assign DQ = WE ? 8'bz : HWDATA; 

(假设WE1'b0当你正在做一个写)。

一般我会避免三态逻辑内部的IC/FPGA,因为不仅存在当多于一个驱动器驱动总线的明显的问题,这也是一个问题,如果没有驱动总线(一些门获得浮动输入)。 IC设计还存在其他问题。但是,大概你在这种情况下没有选择;想必你没有设计模块async。 (如果你这样做 - 取出inout。)

+0

事实证明,我已经做到了这一点,并认为这是我的问题,当它不是。不过,感谢一群人向我展示了我实际上正在看错我认为是我的问题的地方。 – FatherOfNations

1

对于所有inout端口,您可以随时读取数据。但是为了驱动这个网络,通常使用三态缓冲器。原因是相同的网络可能与多个模块共享,并且由于网络为inout类型,为了消除多个驱动程序的冲突,使用三态缓冲区。

enter image description here

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

assign io = t ? i : 1'bz; // To drive the inout net 
assign o = io; // To read from inout net 
+0

请标记为答案,如果这篇文章对你有帮助。 :) –