Как изменить эти модули, чтобы обмен данными был двунаправленным (inout)? - PullRequest
0 голосов
/ 24 марта 2019

Я просто не уверен, как изменить код.Я знаю, что мне нужно добавить входной порт, но я не знаю, как это сделать.Я смотрел несколько уроков, но не могу понять.

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 голосов
/ 24 марта 2019

автобус может быть разработан с несколькими авторами и читателями. Пример следующий:

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 модуль.

...