如何更改这些模块以便通信是双向的(inout)?

问题描述 投票:0回答:1

我只是不确定如何修改代码。我知道我需要添加一个inout端口,但我不知道该怎么做。我看过多个教程,但我无法弄清楚。

module mem(
  input  logic clk, we ,               // write enable bit, active low
  input  logic [n-1:0] in ,
  input  logic [m-1:0] addr ,
  output logic [n-1:0] out ) ;
  parameter n = 1, m = 1, k = 1 << m ; //data width, address width, size
  logic   [n-1:0] memo [k-1:0] ; 
  // array of 2^m elements, each being an n-bit wide register
  assign out = memo[addr] ;
  always_ff @(posedge clk) begin
  if (! we ) memo[addr] = in ;
  end
endmodule
module stack(
  input  logic clk , rst ,            // clock and reset
  input  logic [1:0] op ,             //operation PUSH or POP (one-hot)
  input  logic [n-1:0] pushval ,      // PUSH argument
  output logic [n-1:0] popval ) ;     // POP result
  parameter n = 1, m = 1, k = 1<< m ; // data width, address width, size
  logic  [m-1:0] addr ;               // address for memory 
  logic  up, down ;                   // breaking op down to 2 separate bits
  logic  [n-1:0] in  ;                // input for memory
  logic  [n-1:0] out ;                // output from memory
  logic  we  ;                        // write enable signal for memory
  logic  [m-1:0] addr1 ;              // counter output
  assign up = (addr == {m{1'b1}}) ? 1'b0 : op[1] ;
  assign down = (addr == {m{1'b0}}) ? 1'b0 : op[0] ;
  assign in = (op == 2'b10) ? pushval : {n{1'b0}};
  assign we = rst ? 1'b1 : !(up ^ down) ;  
  assign addr = (op == 2'b10) ? addr1 + 1'b1 : addr1 ;
  // instantiate memory module

  mem #(n,m,k) memory(clk, we, in, addr, out) ;

  assign popval = out ;
  // instantiate counter module

  udl #(m) counter(clk, rst, up, down, addr1) ;

endmodule
system-verilog
1个回答
0
投票

公共汽车可以设计有多个作家和读者。一个例子如下:

wire bus;
assign bus = wren1 ? data1 : 'z;
assign bus = wren2 ? data2 : 'z;

在上面的例子中,总线由数据或高阻抗值驱动。真实数据永远胜利。只需确保启用信号不会同时打开,否则您将获得“x”作为总线值。

您可以以正常方式读取总线值,例如:

always_latch
    if (rden1)
        val = bus;
...

例如,你可以通过inout端口传递bus线

 module mem(input clk, wren, [3:0] address, inout[3:0] data);
   logic [3:0]memory[15:0];
   assign data = !wren  ? memory[address] : 'z;
   always_ff @(posedge clk) 
        if (wren)
            memory[address] <= data;
endmodule

同样,你可以重新设计你的qazxsw poi模块。

© www.soinside.com 2019 - 2024. All rights reserved.