| 
 | 
 
 楼主 |
发表于 2018-5-1 16:23:49
|
显示全部楼层
 
 
 
 本帖最后由 c134 于 2018-5-1 16:31 编辑  
 
回复 5# xiaxiasha  
 
确实代码有点问题,我进行了修改。FIFO的程序宽度8bit深度为16,也就是使用16 * 8bit = 128bit内存。但是QuartusII编译后却用了256bit内存。您再帮我看看是什么原因。 
 
module fifo_sync( 
input nRst_i, 
input Clk_i, 
input Wr_i, 
input [7:0]Din_i, 
input Rd_i, 
output [7:0]Dout_o, 
output Full_o, 
output Empty_o, 
output [4:0]Count_o 
); 
 
reg [7:0]memory[0:15];//FIFO的存储空间 
reg [4:0]wr_addr_reg;//写地址0-15,最高位用于辅助判定空或满 
reg [4:0]rd_addr_reg;//读地址0-15,最高位用于辅助判定空或满 
 
wire [3:0]fifo_in_addr; 
wire [3:0]fifo_out_addr; 
wire [4:0]wr_nextaddr; 
wire [4:0]rd_nextaddr; 
 
//FIFO写的地址生成器 
assign wr_nextaddr = (Wr_i && ~Full_o)?wr_addr_reg + 1'b1:wr_addr_reg; 
 
always@(negedge nRst_i or posedge Clk_i) 
begin 
if(!nRst_i) 
    wr_addr_reg <=5'b0; 
else 
    wr_addr_reg <= wr_nextaddr; 
end 
 
//FIFO数据的写入 
assign fifo_in_addr = wr_addr_reg[3:0]; 
 
always@(posedge Clk_i)//写数据 
begin 
if(Wr_i & ~Full_o) 
    memory[fifo_in_addr] <= Din_i; 
else 
    memory[fifo_in_addr] <= memory[fifo_in_addr]; 
end 
 
//FIFO读的地址生成器 
assign rd_nextaddr = (Rd_i && ~Empty_o)?rd_addr_reg + 1'b1:rd_addr_reg; 
 
always@(negedge nRst_i or posedge Clk_i) 
begin 
if(!nRst_i) 
    rd_addr_reg <= 5'b0; 
else 
    rd_addr_reg <= rd_nextaddr; 
end 
 
//FIFO数据的输出 
assign fifo_out_addr  = rd_addr_reg[3:0]; 
assign Dout_o = memory[fifo_out_addr];//读数据 
//FIFO空 
assign Empty_o = (wr_addr_reg == rd_addr_reg); 
//FIFO满 
assign Full_o = (wr_addr_reg == {~rd_addr_reg[4], rd_addr_reg[3:0]}); 
//计数器 
assign Count_o = wr_addr_reg - rd_addr_reg; 
 
endmodule 
请看一下我编译后的结果,为什么内存被分配为2块,这两块各使用128bit内存。 
    
    
            
             
            
            
            
 |   
 
 
 
 |