Memory 如何在verilog中映射16个端口的内存 模块测试123(时钟、Rst\n); . . . 连线[7:0]端口1_数据; 连线[7:0]端口2_数据; 连线[7:0]端口3_数据; 连线[7:0]端口4_数据; 连线[7:0]端口5_数据; 连线[7:0]端口6_数据; 连线[7:0]端口7_数据; 连线[7:0]端口8_数据; 连线[7:0]端口9_数据; 连线[7:0]端口10_数据; 连线[7:0]端口11_数据; 连线[7:0]端口12_数据; 连线[7:0]端口13_数据; 连线[7:0]端口14_数据; 连线[7:0]端口15_数据; reg[flit_port_width-1:0]flit_out1; reg[flit_port_width-1:0]flit_out2; reg[flit_port_width-1:0]flit_out3; reg[flit_port_width-1:0]flit_out4; reg[flit_port_width-1:0]flit_out5; reg[flit_port_width-1:0]flit_out6; reg[flit_port_width-1:0]flit_out7; reg[flit_port_width-1:0]flit_out8; reg[flit_port_width-1:0]flit_out9; reg[flit_port_width-1:0]flit_out10; reg[flit_port_width-1:0]flit_out11; reg[flit_port_width-1:0]flit_out12; reg[flit_port_width-1:0]flit_out13; reg[flit_port_width-1:0]flit_out14; reg[flit_port_width-1:0]flit_out15; . . . 内存#(/*地址宽度*/32'd16, /*数据宽度*/32'd8, /*lo*/32'd0, /*hi*/32'd63)存储器1(.clk(clk) ,.rst(rst_n) ,.flit_out(flit_out 1) ,.dataout(端口1_数据) ); 内存#(/*地址宽度*/32'd16, /*数据宽度*/32'd8, /*lo*/32'd0, /*hi*/32'd63)存储器2(.clk(clk) ,.rst(rst_n) ,.flit_out(flit_out 2) ,.dataout(端口2_数据) ); 内存#(/*地址宽度*/32'd16, /*数据宽度*/32'd8, /*lo*/32'd0, /*hi*/32'd63)存储器3(.clk(clk)。。。 ); . . . 端模 内存模块( 飞出去, rst, 中华电力有限公司, 数据输出 ); 参数addr_width=1; 参数数据_宽度=1; 参数lo=0; 参数hi=1; 整数计数,i; 输入[34:0]飞出; 输入rst、clk; 输出[数据宽度-1:0]数据输出; 注册我们; reg[数据宽度-1:0]数据输出; reg[addr_width-1:0]addr; reg[数据宽度-1:0]数据输入; reg[数据宽度-1:0]内存[lo:hi]; 初始开始 计数=0;i=0; 结束 始终@(posedge clk)开始 count

Memory 如何在verilog中映射16个端口的内存 模块测试123(时钟、Rst\n); . . . 连线[7:0]端口1_数据; 连线[7:0]端口2_数据; 连线[7:0]端口3_数据; 连线[7:0]端口4_数据; 连线[7:0]端口5_数据; 连线[7:0]端口6_数据; 连线[7:0]端口7_数据; 连线[7:0]端口8_数据; 连线[7:0]端口9_数据; 连线[7:0]端口10_数据; 连线[7:0]端口11_数据; 连线[7:0]端口12_数据; 连线[7:0]端口13_数据; 连线[7:0]端口14_数据; 连线[7:0]端口15_数据; reg[flit_port_width-1:0]flit_out1; reg[flit_port_width-1:0]flit_out2; reg[flit_port_width-1:0]flit_out3; reg[flit_port_width-1:0]flit_out4; reg[flit_port_width-1:0]flit_out5; reg[flit_port_width-1:0]flit_out6; reg[flit_port_width-1:0]flit_out7; reg[flit_port_width-1:0]flit_out8; reg[flit_port_width-1:0]flit_out9; reg[flit_port_width-1:0]flit_out10; reg[flit_port_width-1:0]flit_out11; reg[flit_port_width-1:0]flit_out12; reg[flit_port_width-1:0]flit_out13; reg[flit_port_width-1:0]flit_out14; reg[flit_port_width-1:0]flit_out15; . . . 内存#(/*地址宽度*/32'd16, /*数据宽度*/32'd8, /*lo*/32'd0, /*hi*/32'd63)存储器1(.clk(clk) ,.rst(rst_n) ,.flit_out(flit_out 1) ,.dataout(端口1_数据) ); 内存#(/*地址宽度*/32'd16, /*数据宽度*/32'd8, /*lo*/32'd0, /*hi*/32'd63)存储器2(.clk(clk) ,.rst(rst_n) ,.flit_out(flit_out 2) ,.dataout(端口2_数据) ); 内存#(/*地址宽度*/32'd16, /*数据宽度*/32'd8, /*lo*/32'd0, /*hi*/32'd63)存储器3(.clk(clk)。。。 ); . . . 端模 内存模块( 飞出去, rst, 中华电力有限公司, 数据输出 ); 参数addr_width=1; 参数数据_宽度=1; 参数lo=0; 参数hi=1; 整数计数,i; 输入[34:0]飞出; 输入rst、clk; 输出[数据宽度-1:0]数据输出; 注册我们; reg[数据宽度-1:0]数据输出; reg[addr_width-1:0]addr; reg[数据宽度-1:0]数据输入; reg[数据宽度-1:0]内存[lo:hi]; 初始开始 计数=0;i=0; 结束 始终@(posedge clk)开始 count,memory,mapping,verilog,Memory,Mapping,Verilog,我不完全理解这个问题,但发现了一些错误。您的代码包含: module testing123(Clk, Rst_n); . . . wire [7:0] port1_data; wire [7:0] port2_data; wire [7:0] port3_data; wire [7:0] port4_data; wire [7:0] port5_data; wire [7:0] port6_data; wire [7:0] port7_data; wire [7:0] port8_data; w

我不完全理解这个问题,但发现了一些错误。您的代码包含:

module testing123(Clk, Rst_n);
. . .
wire [7:0] port1_data;
wire [7:0] port2_data;
wire [7:0] port3_data;
wire [7:0] port4_data;
wire [7:0] port5_data;
wire [7:0] port6_data;
wire [7:0] port7_data;
wire [7:0] port8_data;
wire [7:0] port9_data;
wire [7:0] port10_data;
wire [7:0] port11_data;
wire [7:0] port12_data;
wire [7:0] port13_data;
wire [7:0] port14_data;
wire [7:0] port15_data;

 reg [flit_port_width-1:0] flit_out1;
 reg [flit_port_width-1:0] flit_out2;
 reg [flit_port_width-1:0] flit_out3;
 reg [flit_port_width-1:0] flit_out4; 
 reg [flit_port_width-1:0] flit_out5; 
 reg [flit_port_width-1:0] flit_out6;
 reg [flit_port_width-1:0] flit_out7;
 reg [flit_port_width-1:0] flit_out8;
 reg [flit_port_width-1:0] flit_out9;
 reg [flit_port_width-1:0] flit_out10;
 reg [flit_port_width-1:0] flit_out11;
 reg [flit_port_width-1:0] flit_out12;
 reg [flit_port_width-1:0] flit_out13;
 reg [flit_port_width-1:0] flit_out14;
 reg [flit_port_width-1:0] flit_out15;  
 . . .

RAM_Memory #(/*addr_width*/ 32'd16,
        /*data_width*/ 32'd8,
        /*lo*/ 32'd0,
        /*hi*/ 32'd63) Memory1(.clk(Clk)
,.rst(Rst_n)
,.flit_out(flit_out1)
,.dataout(port1_data)
);
RAM_Memory #(/*addr_width*/ 32'd16,
        /*data_width*/ 32'd8,
        /*lo*/ 32'd0,
        /*hi*/ 32'd63) Memory2(.clk(Clk)
,.rst(Rst_n)
,.flit_out(flit_out2)
,.dataout(port2_data)
);
RAM_Memory #(/*addr_width*/ 32'd16,
        /*data_width*/ 32'd8,
        /*lo*/ 32'd0,
        /*hi*/ 32'd63)  Memory3(.clk(Clk) ...
);
. . . 
endmodule

module RAM_Memory(
  flit_out,
 rst,
 clk,    
  dataout
);

  parameter                   addr_width = 1;
  parameter                   data_width = 1;
  parameter                   lo = 0;
  parameter                   hi = 1;

integer count, i;

input [34:0] flit_out;
input rst,clk;
output [data_width - 1 : 0] dataout;

reg we;
 reg [data_width - 1 : 0] dataout;
 reg [addr_width - 1 : 0] addr;
 reg [data_width - 1 : 0] data_in;
 reg [data_width - 1 : 0] mem [lo:hi];

 initial begin 
    count =0; i=0;
 end

 always @(posedge clk)begin
        count<=count+1;
        we<=0;
  if(count>=1) begin
         we<=1;
end 
end 

always @(we)begin 
            assign data_in = flit_out[7:0];
            assign addr = flit_out[23:8];
            mem[addr]<= data_in;
        assign dataout = mem[addr];         
    end

always @(count)begin
        if(count>=68)begin
            count<=0;
        end
    end
  endmodule
  • 在内部使用assign可能不会达到预期效果 您很可能只想:

    always @(posedge clk) begin
      if (en) begin
        //..
      end
     end
    

  • 最好不要混合使用非阻塞(

    我可以看到您试图在4、16位宽的寄存器(原始内存)中存储64位值。我看不出15或16个端口与任何事情有什么关系。请您澄清一下,谢谢。如果答案只是与先前答案的链接,可能应该是接近投票,因为这是一个重复的问题。
    always @(posedge clk) begin
      if (en) begin
        //..
      end
     end
    
    always @* begin 
      data_in = filt_out[7:0]
      addr    = flit_out[23:8];
      dataout = mem[addr];
    
    always @(posedge clk)begin 
      if (we) begin
        data_in   <= flit_out[7:0];
        addr      <= flit_out[23:8];
        mem[addr] <= data_in;
        dataout   <= mem[addr];         
      end
    end
    
    //Semantically split the bus
    assign  data_in   = flit_out[7:0];
    assign  addr      = flit_out[23:8];
    
    always @(posedge clk)begin 
      if (we) begin
        mem[addr] <= data_in;
        dataout   <= mem[addr];         
      end
    end
    
    module RAM_Memory(
      flit_out,
     rst,
     clk,    
      dataout
    );
    
      parameter                   addr_width = 1;
      parameter                   data_width = 1;
      parameter                   lo = 0;
      parameter                   hi = 1;
    
    input [34:0] flit_out;
    input rst,clk;
    output [data_width - 1 : 0] dataout;
    reg [data_width - 1 : 0] dataout;
    
    module RAM_Memory#(
      parameter ADDR_WIDTH = 1, //They don not have to be upper case 
      parameter DATA_WIDTH= 1, // But most languages semantically define upper case as constants
      parameter LO = 0;
      parameter HI = 1;
    )(
      input            [34:0] flit_out,
      input                   rst,
      input                   clk,    
      output [DATA_WIDTH-1:0] dataout
    );
    
    RAM_Memory #(/*addr_width*/ 32'd16,
            /*data_width*/ 32'd8,
            /*lo*/ 32'd0,
            /*hi*/ 32'd63) Memory2(.clk(Clk)
    ,.rst(Rst_n)
    ,.flit_out(flit_out2)
    ,.dataout(port2_data)
    );
    
    RAM_Memory #(
     .ADDR_WIDTH(  6 ), //No need to specify the width of parameter
     .DATA_WIDTH(  8 ), 
     .LO        (  0 ),
     .HI        ( 63 ) 
    ) Memory2 (
      .clk      ( Clk       )
     ,.rst      ( Rst_n     )
     ,.flit_out ( flit_out2 )
     ,.dataout  ( port2_data)
    );