Skip to content

Commit cb1b8d0

Browse files
authored
Add files via upload
1 parent 4e9e15b commit cb1b8d0

File tree

2 files changed

+257
-0
lines changed

2 files changed

+257
-0
lines changed

Diff for: asy_FIFO.v

+141
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
`timescale 1ns / 1ps
2+
//////////////////////////////////////////////////////////////////////////////////
3+
// Company:
4+
// Engineer:
5+
//
6+
// Create Date: 2023/06/28 08:05:32
7+
// Design Name:
8+
// Module Name: asy_FIFO
9+
// Project Name:
10+
// Target Devices:
11+
// Tool Versions:
12+
// Description:
13+
//
14+
// Dependencies:
15+
//
16+
// Revision:
17+
// Revision 0.01 - File Created
18+
// Additional Comments:
19+
//
20+
//////////////////////////////////////////////////////////////////////////////////
21+
22+
23+
module asy_FIFO(
24+
wr_clk,
25+
rd_clk,
26+
wr_rstn,
27+
rd_rstn,
28+
wr_en,
29+
rd_en,
30+
wr_data,
31+
rd_data,
32+
fifo_empty,
33+
fifo_full
34+
);
35+
parameter width = 8;
36+
parameter depth = 8;
37+
parameter addr = $clog2(depth);
38+
39+
input wr_clk,rd_clk,wr_rstn,rd_rstn,wr_en,rd_en;
40+
input [width-1:0] wr_data;
41+
output reg [width-1:0] rd_data;
42+
output reg fifo_empty,fifo_full;
43+
44+
//Define a FIFO, width/depth
45+
reg [width-1:0] fifo [depth-1:0];//depth-1
46+
47+
// binary pointer
48+
reg [addr:0] wr_pt;
49+
reg [addr:0] rd_pt;
50+
51+
// gray code pointer
52+
wire [addr:0] wr_ptg;
53+
wire [addr:0] rd_ptg;
54+
// synchronizer: 2 flip flop
55+
reg [addr:0] wr_ptgr;//after one ff
56+
reg [addr:0] rd_ptgr;
57+
reg [addr:0] wr_ptgrr;//after two ff
58+
reg [addr:0] rd_ptgrr;
59+
60+
//binary to gray
61+
assign wr_ptg=wr_pt^(wr_pt>>>1);//why >>> but not >>?
62+
assign rd_ptg=rd_pt^(rd_pt>>>1);
63+
64+
//sychronize by two flip flop
65+
always@(posedge wr_clk, negedge wr_rstn)begin
66+
if(!wr_rstn)begin
67+
wr_ptgr<=0; wr_ptgrr<=0;
68+
end
69+
else begin
70+
wr_ptgr<=wr_ptg; // one ff
71+
wr_ptgrr<=wr_ptgr;// two ff
72+
end
73+
end
74+
75+
always@(posedge rd_clk, negedge rd_rstn)begin
76+
if(!rd_rstn)begin
77+
rd_ptgr<=0; rd_ptgrr<=0;
78+
end
79+
else begin
80+
rd_ptgr<=rd_ptg; // one ff
81+
rd_ptgrr<=rd_ptgr;// two ff
82+
end
83+
end
84+
85+
//determine full or empty
86+
always@(posedge wr_clk, negedge wr_rstn)begin
87+
if(!wr_rstn)begin
88+
fifo_full<=0;
89+
end
90+
else if(wr_ptg[addr]==rd_ptgrr[addr]&&wr_ptg[addr-1]!=rd_ptgrr[addr-1]//
91+
&&wr_ptg[addr-2]!=rd_ptgrr[addr-2]&&wr_ptg[addr-3]==rd_ptgrr[addr-3]) begin//need change if length/addr change
92+
fifo_full<=1;
93+
end
94+
else begin
95+
fifo_full<=0;
96+
end
97+
end
98+
99+
always@(posedge rd_clk, negedge rd_rstn)begin
100+
if(!rd_rstn)begin
101+
fifo_empty<=0;
102+
end
103+
else if(rd_pt==wr_ptgrr) begin//rd_pt==wr_ptgrr和rd_pt[addr-1:0]==wr_ptgrr[addr-1:0]有什么区�?//need change if length/addr change
104+
fifo_empty<=1;
105+
end
106+
else begin
107+
fifo_empty<=0;
108+
end
109+
end
110+
111+
//write data
112+
always@(posedge wr_clk, negedge wr_rstn)begin
113+
if(!wr_rstn) begin
114+
wr_pt<=0;
115+
end
116+
else if(!fifo_full&&wr_en)begin
117+
fifo[wr_pt]<=wr_data;
118+
wr_pt<=wr_pt+1;
119+
end
120+
else begin
121+
wr_pt<=wr_pt;
122+
end
123+
end
124+
125+
//read data
126+
always@(posedge rd_clk, negedge rd_rstn)begin
127+
if(!rd_rstn) begin
128+
rd_pt<=0;
129+
end
130+
else if(!fifo_empty&&rd_en)begin
131+
fifo[rd_pt]<=rd_data;
132+
rd_pt<=rd_pt+1;
133+
end
134+
else begin
135+
rd_pt<=rd_pt;
136+
end
137+
end
138+
139+
140+
141+
endmodule

Diff for: synchronous_FIFO.v

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
`timescale 1ns / 1ps
2+
//////////////////////////////////////////////////////////////////////////////////
3+
// Company:
4+
// Engineer:
5+
//
6+
// Create Date: 2023/06/27 21:31:44
7+
// Design Name:
8+
// Module Name: synchronous_FIFO
9+
// Project Name:
10+
// Target Devices:
11+
// Tool Versions:
12+
// Description:
13+
//
14+
// Dependencies:
15+
//
16+
// Revision:
17+
// Revision 0.01 - File Created
18+
// Additional Comments:
19+
//
20+
//////////////////////////////////////////////////////////////////////////////////
21+
// use a counter to determine whether the FIFO is full or empty
22+
23+
module syn_fifo(clk, rstn, wr_en, rd_en, wr_data, rd_data, fifo_full, fifo_empty);
24+
25+
//参数定义
26+
parameter width = 8;
27+
parameter depth = 8;
28+
parameter addr = 3;
29+
30+
//输入信号
31+
input clk; //时钟信号
32+
input rstn; //下降沿复位
33+
input wr_en; //写入使能
34+
input rd_en; //读取使能
35+
36+
//数据信号
37+
input [width - 1 : 0] wr_data; //写数据
38+
output [width - 1 : 0] rd_data; //读数据
39+
40+
reg [width - 1 : 0] rd_data;
41+
42+
//空满判断信号
43+
output fifo_full;
44+
output fifo_empty;
45+
46+
//定义一个计数器,用于判断空满
47+
reg [$clog2(depth): 0] cnt;
48+
49+
//定义读写地址
50+
reg [depth - 1 : 0] wr_ptr;
51+
reg [depth - 1 : 0] rd_ptr;
52+
53+
//定义一个宽度为为width,深度为depth的fifo
54+
reg [width - 1 : 0] fifo [depth - 1 : 0];
55+
56+
57+
//写地址操作
58+
always @ (posedge clk or negedge rstn) begin
59+
if(!rstn)
60+
wr_ptr <= 0;
61+
else if(wr_en && !fifo_full) //写使能,且fifo未写满
62+
wr_ptr <= wr_ptr + 1;
63+
else
64+
wr_ptr <= wr_ptr;
65+
end
66+
67+
//读地址操作
68+
always @ (posedge clk or negedge rstn) begin
69+
if(!rstn)
70+
rd_ptr <= 0;
71+
else if(rd_en && !fifo_empty) //读使能,且fifo不为空
72+
rd_ptr <= rd_ptr + 1;
73+
else
74+
rd_ptr <= rd_ptr;
75+
end
76+
77+
//写数据
78+
integer i;
79+
80+
always @ (posedge clk or negedge rstn) begin
81+
if(!rstn) begin //复位清空fifo
82+
for(i = 0; i < depth; i = i + 1)
83+
fifo[i] <= 0;
84+
end
85+
else if(wr_en) //写使能时将数据写入fifo
86+
fifo[wr_ptr] <= wr_data;
87+
else //否则保持
88+
fifo[wr_ptr] <= fifo[wr_ptr];
89+
end
90+
91+
//读数据
92+
always @ (posedge clk or negedge rstn) begin
93+
if(!rstn)
94+
rd_data <= 0;
95+
else if (rd_en)
96+
rd_data <= fifo[rd_ptr]; //从fifo中读取数据
97+
else
98+
rd_data <= rd_data;
99+
end
100+
101+
//辅助计数,用于判断空满
102+
always @ (posedge clk or negedge rstn) begin
103+
if(!rstn)
104+
cnt <= 0;
105+
else if (wr_en && !rd_en && !fifo_full) //有效的只写入
106+
cnt <= cnt + 1;
107+
else if (!wr_en && rd_en && !fifo_empty) //有效的只读取
108+
cnt <= cnt - 1;
109+
else
110+
cnt <= cnt;
111+
end
112+
113+
//空满判断
114+
assign fifo_full = (cnt == depth)? 1 : 0;
115+
assign fifo_empty = (cnt == 0) ? 1 : 0;
116+
endmodule

0 commit comments

Comments
 (0)