如何更改这些模块,以便双向通讯(输入)?

时间:2019-03-24 16:12:14

标签: system-verilog

我只是不确定如何修改代码。我知道我需要添加一个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

1 个答案:

答案 0 :(得分:0)

可以设计具有多个作者和读者的总线。下面是一个示例:

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

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

您可以通过常规方式读取总线值,例如:

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

例如,您可以将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

类似地,您可以重新设计stack模块。