📄 异步fifo.v
字号:
//下面为自然码转化为格雷码的程序:
module norm??_to_gray(din,dout,EN);
parameter width=8;
input[width-1:0] din;
output[width-1:0];
integer i;
always@(din or EN)
begin
for(i=0,j=0;i<width-1;i=i+1)
begin
dout[i]=(din[i]^din[i+1])&&EN;
end
dout[width-1]=din[width-1]&&EN;
end
endmodule
//格雷码到自然码的转换:
module gray_to_norm(din,dout,EN);
parameter width=8;
input[width-1:0] din;
output[width-1:0] dout;
integer i;
assign dout[width-1]=din[width-1];
always@(din or EN)
for(i=width-2;i>=0;i=i-1)
begin
dout[i]=din[i]^dout[i+1]&&EN;
end
endmodule
//写地址产生程序:
module crwaddgray(wadd_gray);
parameter width=8;
output[width-1:0] wadd_gray;
always @(posedge wclk or negedge rst) //rst是复位信号
begin
if(!rst)
wadd<=0; //初始自然码写指针
else
begin
wadd<=wadd+1;
norm_to_gray(wadd,wadd_gray,EN);
end
end
//读地址产生程序类似写地址产生程序。
//满标志产生程序:
module crfull(full,EN);
output full;
crwadd(wadd_gray);
crradd(radd_gray);
always @(radd_gray or wadd_gray)
begin
gray_to_norm(wadd_gray,wadd,EN);
gray_to_norm(radd_gray,radd,EN);
if(radd[width-1]!=wadd[width-1]&&rad[width-2:0]==wadd[width-2:0])
full<=1;
else
full<=0;
end
endmodule
//空标志产生程序:
module crempty(empty,EN);
output empty;
crwadd(wadd_grgay);
crradd (radd_gray);
always @(radd_gray or wadd_gray)
begin
gray_to_norm(wadd_gray,wadd,EN);
gray_to_norm(radd_gray,radd,EN);
if(radd[width-1]= =wadd[width-1]&&radd[width-2:0]= =wadd[width-2:0])
empty<=1;
else
empty<=0;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -