2016-12-01 5 views
0

실제로 inout 포트가있는 Verilog 모듈을 만드는 것이 아닙니다. 내가 찾은 수많은 게시물이 있습니다. 나는 내가 입출력 포트가있는 블랙 박스 모듈이있는 경우의 그것Inout 포트에 쓰고 동일한 모듈의 Inout 포트에서 읽는 방법은 무엇입니까?

module blackbox(inout a, in b, in c)

같이 정의 말한다하게 그리고

같은 다른 모듈에서 인스턴스화하려면, IS에 붙어 무엇

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 포트의 경우 언제든지 데이터를 읽을 수 있습니다. 그러나 그물을 운전하기 위해서는 일반적으로 tri state buffer가 사용됩니다. 그 이유는 동일한 네트워크가 여러 모듈과 공유 될 수 있고 네트워크가 inout 유형이기 때문에 여러 드라이버의 충돌을 제거하기 위해 트라이 상태 버퍼가 사용됩니다. 상기와 동일한 이미지를위한

enter image description here

여기 코드이다.

+0

이 게시물이 도움이 되었다면 답변으로 표시하십시오. :) –