Memory Quartus II在进行分析和合成时被困在10%(我的内存ram模块verilog Implementationoon有什么问题?)

Memory Quartus II在进行分析和合成时被困在10%(我的内存ram模块verilog Implementationoon有什么问题?),memory,verilog,fpga,synthesis,Memory,Verilog,Fpga,Synthesis,我正在做一个系统,它从一个txt文件中提取数据,一个由57600个二进制数组成的数据,用一些算术模块处理,然后将结果数据存储在3组输出内存ram中,每个ram由57600个二进制数组成。ModelSim工作正常,结果如预期,但在Quartus II中编译时,它会停留在10%,并且在我停止进程之前的数小时内不会做任何事情。尽管如此,当我将实现的输出内存的大小减少一位数时,它在几秒钟内成功编译。输出存储器的大小为3组57.600位的32位二进制数 我怀疑我没有实现正确的内存,或者在执行时内存使用有问

我正在做一个系统,它从一个txt文件中提取数据,一个由57600个二进制数组成的数据,用一些算术模块处理,然后将结果数据存储在3组输出内存ram中,每个ram由57600个二进制数组成。ModelSim工作正常,结果如预期,但在Quartus II中编译时,它会停留在10%,并且在我停止进程之前的数小时内不会做任何事情。尽管如此,当我将实现的输出内存的大小减少一位数时,它在几秒钟内成功编译。输出存储器的大小为3组57.600位的32位二进制数

我怀疑我没有实现正确的内存,或者在执行时内存使用有问题,但我不确定,请给出建议?我正在寻找最简单直接的方法来实现这一点

这是ram的模块

module RAM_OUT (clk, pix_val, w_mem_out, set_ram);

input clk;

input [2:0] w_mem_out;
input [31:0] pix_val;
input set_ram;



reg [15:0] addr_out; // tamano de 57600 datos 


reg [31:0] mem_out1 [0:57599];
reg [31:0] mem_out2 [0:57599];
reg [31:0] mem_out3 [0:57599];

/////////// ram out ///////////////

always @ (posedge clk)

begin
if (set_ram)
addr_out = 0;

else 
    begin

        if (w_mem_out == 1)

                begin
                mem_out1 [addr_out] = pix_val;  
                mem_out2 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out3 [addr_out] = 32'b00000000_000000000000000000000000;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 2)        

                begin
                mem_out1 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out2 [addr_out] = pix_val;  
                mem_out3 [addr_out] = 32'b00000000_000000000000000000000000;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 3)        

                begin
                mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
                mem_out2 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out3 [addr_out] = pix_val;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else    

                addr_out = addr_out;


    end

end

//////////////////////////////////

/*


module RAM_OUT (pix_val, w_mem_out, set_ram);


input [2:0] w_mem_out;
input [31:0] pix_val;
input set_ram;



reg [15:0] addr_out; // tamano de 57600 datos 


reg [31:0] mem_out1 [0:57599];
reg [31:0] mem_out2 [0:57599];
reg [31:0] mem_out3 [0:57599];

/////////// ram out ///////////////

always @ (w_mem_out or set_ram)
begin

if (set_ram)
addr_out = 0;

else 
    begin

        if (w_mem_out == 1)

                begin
                mem_out1 [addr_out] = pix_val;  
                mem_out2 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out3 [addr_out] = 32'b00000000_000000000000000000000000;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 2)        

                begin
                mem_out1 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out2 [addr_out] = pix_val;  
                mem_out3 [addr_out] = 32'b00000000_000000000000000000000000;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 3)        

                begin
                mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
                mem_out2 [addr_out] = 32'b11111111_000000000000000000000000;
                mem_out3 [addr_out] = pix_val;

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 4)

                begin
                mem_out1 [addr_out] = pix_val;  
                mem_out2 [addr_out] = pix_val; 
                mem_out3 [addr_out] = 32'b00000000_000000000000000000000000;

                addr_out = addr_out + 16'b0000000000000001;
                end


        else if (w_mem_out == 5)        

                begin
                mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
                mem_out2 [addr_out] = pix_val;
                mem_out3 [addr_out] = pix_val; 

                addr_out = addr_out + 16'b0000000000000001;
                end

        else if (w_mem_out == 6)        

                begin
                mem_out1 [addr_out] = pix_val;  
                mem_out2 [addr_out] = pix_val; 
                mem_out3 [addr_out] = pix_val; 

                addr_out = addr_out + 16'b0000000000000001;
                end


        else    

                addr_out = addr_out;


    end

end

//////////////////////////////////

*/

endmodule

我可以看到您的代码存在以下问题:

  • 数据仅写入mem_out1、mem_out2和mem_out3。从技术上讲,如果您根本不使用写入内存的数据,Quartus可以对其进行优化,而完全不合成该部分

  • 编码风格不太正确。您可以尝试将always块中的“=”(阻塞语句)替换为“”,我可以看到您的代码存在以下问题:

  • 数据仅写入mem_out1、mem_out2和mem_out3。从技术上讲,如果您根本不使用写入内存的数据,Quartus可以对其进行优化,而完全不合成该部分

  • 编码风格不太正确。您可以尝试将always块中的“=”(阻塞语句)替换为“我猜您的目标FPGA的可用触发器已经用完了”。您的Quartus文档应该具有RAM宏模块。合成指令/属性是另一个选项(模拟将其视为注释)。另一方面,
    RAM_OUT
    没有输出,因此我很惊讶Quartus将其优化为零。由于如此之多,我已将代码替换为“reg[31:0]mem_out1[0:57599];”,并使用内存库megawizard直接连接顶级模块中的端口,现在看来它的编译效果不错。我之所以没有输出端口就离开这个模块,是因为我仍在尝试实现如何使内存内容以某种方式可读(我需要检查处理结果是否正确)。你有什么建议吗?我猜你的目标FPGA已经没有可用的触发器了。您的Quartus文档应该具有RAM宏模块。合成指令/属性是另一个选项(模拟将其视为注释)。另一方面,
    RAM_OUT
    没有输出,因此我很惊讶Quartus将其优化为零。由于如此之多,我已将代码替换为“reg[31:0]mem_out1[0:57599];”,并使用内存库megawizard直接连接顶级模块中的端口,现在看来它的编译效果不错。我之所以没有输出端口就离开这个模块,是因为我仍在尝试实现如何使内存内容以某种方式可读(我需要检查处理结果是否正确)。你有什么建议吗?