7

これは、inout ポートを使用して verilog モジュールを実際に作成することではありません。それについて私が見つけたたくさんの投稿があります。

私が行き詰まっているのは、入出力ポートを備えたブラックボックスモジュールがある場合、次のように定義されているとしましょう

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 に割り当てる方法が必要です。

4

2 に答える 2

7

すべてのinoutポートについて、いつでもデータを読み取ることができます。しかし、そのネットを駆動するために、一般にトライステートバッファが使用されます。その理由は、同じネットが複数のモジュールで共有される可能性があるためです。ネットはオンinoutタイプであるため、複数のドライバーの競合を解消するために、トライステート バッファーが使用されます。

ここに画像の説明を入力

上記の同じ画像のコードは次のとおりです。

assign io = t ? i : 1'bz; // To drive the inout net
assign o = io; // To read from inout net
于 2016-12-04T09:25:32.037 に答える
2

おっしゃる通り、これは Verilog に関する質問ではなく、ロジック設計に関する質問です。

を駆動するには、トライステート ドライバーを実装する必要がありますDQ

assign DQ = WE ? 8'bz : HWDATA;

WE(書き込みを行っていると仮定し1'b0ます)。

一般に、IC/FPGA内のトライステート ロジックは避けます。これは、複数のドライバーがバスを駆動する場合に明らかな問題があるだけでなく、バ​​スを駆動するものがない (一部のゲートがフローティング入力を取得する) 場合にも問題になるためです。また、IC 設計にはさらに問題があります。ただし、おそらくこの場合、選択の余地はありません。おそらくあなたはモジュールを設計していませんasync。(もしそうなら - を取り出してinoutください。)

于 2016-12-01T09:43:18.813 に答える