马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
一下是我写的异步fifo,不知怎么回事,用quartus综合后占用了9000多个LE,而且fifo的容量设的越大,占用的LE会更多,不明白原因 !!!望指教,急等!!!!!
//该模块儿是存放帧数据的fifo,512Byte,16位输入,32位输出
//存放8个帧,每个帧大小为64Byte,其中帧头24Byte,帧数据40Byte
module data_din_fifo(fifo_dout,//fifo数据输出
fifo_ren,//fifo读使能
rclk,//fifo读时钟
fifo_empty,//空
fifo_din,//fifo 数据输入
fifo_wen,//fifo写使能
wclk,//fifo写时钟
fifo_full,//满
reset
);
parameter
WIDTH_DOUT=32,
WIDTH_DIN=16,
ADDR_WIDTH=8,
DEPTH_FIFO=256;
output reg [WIDTH_DOUT-1:0]fifo_dout;
output reg fifo_empty,fifo_full;
input [WIDTH_DIN-1:0] fifo_din;
input fifo_ren,
rclk,
fifo_wen,
wclk,
reset;
reg [WIDTH_DIN-1:0] dual_port_ram[DEPTH_FIFO-1:0];//双口ram,位宽16,深度256
reg [ADDR_WIDTH-1:0] wptr,rptr;//写,读指针
reg [ADDR_WIDTH-1:0] sync_wptr,sync_rptr,//同步后的读写指针
sync_wptr_tmp,sync_rptr_tmp;//临时读写指针
reg full_flag,//满空方向标志,1趋于满,0趋于空
empty_flag;//1空 ,0满
wire [ADDR_WIDTH-1:0] sync_rptr_binary,sync_wptr_binary;
assign sync_rptr_binary=gray_to_binary(sync_rptr);
assign sync_wptr_binary=gray_to_binary(sync_wptr);
//////////////双口ram存取数据///////////////
always@(posedge wclk)
if((fifo_full==0)&&(fifo_wen==1))
dual_port_ram[wptr]<=fifo_din;
else
dual_port_ram[wptr]<=dual_port_ram[wptr];
always@(posedge rclk)
if((fifo_empty==0)&&(fifo_ren==1))
fifo_dout<={dual_port_ram[rptr],dual_port_ram[rptr+1'b1]};
else
fifo_dout<=fifo_dout;
/////////////读指针计数///////////////////
always@(posedge rclk or negedge reset)
if(!reset)
rptr<=0;
else
if((fifo_empty==0)&&(fifo_ren==1))
rptr<=rptr+1'b1+1'b1;
else
rptr<=rptr;
///////////写指针计数///////////////////
always@(posedge wclk or negedge reset)
if(!reset)
wptr<=0;
else
if((fifo_full==0)&&(fifo_wen==1))
wptr<=wptr+1'b1;
else
wptr<=wptr;
//////////写指针同步到读时钟////////////////
always@(posedge rclk or negedge reset)
if(!reset)
begin
sync_rptr<=0;
sync_rptr_tmp<=0;
end
else
begin
sync_rptr_tmp<=binary_to_gray(wptr);
sync_rptr<=sync_rptr_tmp;
end
//////////读指针同步到写时钟//////////
always@(posedge wclk or negedge reset)
if(!reset)
begin
sync_wptr<=0;
sync_wptr_tmp<=0;
end
else
begin
sync_wptr_tmp<=binary_to_gray(rptr);
sync_wptr<=sync_wptr_tmp;
end
//////////空标志////////////
always@(posedge rclk or negedge reset)
if(!reset)
fifo_empty<=1;
else
if((rptr==sync_wptr_binary)&&(empty_flag==1))
fifo_empty<=1;
else
fifo_empty<=0;
/////////满标志///////////
always@(posedge wclk or negedge reset)
if(!reset)
fifo_full<=0;
else
if((wptr==sync_rptr_binary)&&(full_flag==1))
fifo_full<=1;
else
fifo_full<=0;
////////空方向标志//////
always@(posedge rclk or negedge reset)
if(!reset)
empty_flag<=1;
else
if(rptr>sync_wptr_binary)
if(rptr-sync_wptr_binary>=192)//大于75%
empty_flag<=1;
else
empty_flag<=0;
else
if(sync_wptr_binary-rptr<64)
empty_flag<=1;
else
empty_flag<=0;
//////满方向标志///////////
always@(posedge wclk or negedge reset)
if(!reset)
full_flag<=0;
else
if(wptr>sync_rptr_binary)
if(wptr-sync_rptr_binary>192)
full_flag<=1;
else
full_flag<=0;
else
if(sync_rptr_binary-wptr<64)
full_flag<=1;
else
full_flag<=0;
function [7:0] binary_to_gray;
input [7:0] binary_din;
integer i;
begin
binary_to_gray[7]=binary_din[7];
for(i=0;i<7;i=i+1)
binary_to_gray=binary_din^binary_din[i+1];
end
endfunction
function [7:0] gray_to_binary;
input [7:0]gray_din;
integer j;
begin
gray_to_binary[7]=gray_din[7];
for(j=6;j>=0;j=j-1)
gray_to_binary[j]=gray_to_binary[j+1]^gray_din[j];
end
endfunction
endmodule |