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