本帖最后由 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内存。
|