|
|
@ -2,27 +2,28 @@
|
|
|
|
// 写模块: 在写功能可用之后, 判断是否是空的, 如果是空的, 就持续写直到写满
|
|
|
|
// 写模块: 在写功能可用之后, 判断是否是空的, 如果是空的, 就持续写直到写满
|
|
|
|
// 读模块: 写功能写满之后, 取数据, 只到获取完毕
|
|
|
|
// 读模块: 写功能写满之后, 取数据, 只到获取完毕
|
|
|
|
// 注意本实验 读和写实不同的时钟域, 是否可读写, 需要通过打拍判断外部时钟域的值
|
|
|
|
// 注意本实验 读和写实不同的时钟域, 是否可读写, 需要通过打拍判断外部时钟域的值
|
|
|
|
// 判断即将写满/即将为空时, 要注意时钟周期, 能给出状态1, 说明上上个周期的一次写入导致快满/空了
|
|
|
|
// 判断即将写满/即将为空时(is_full/is_empty), 要注意时钟周期, 能给出状态1, 说明上上个周期的一次写入导致满/空了
|
|
|
|
|
|
|
|
// is_empty在fifo_wr_data写入到03的时候才拉低, 是因为 is_empty是在读时钟域同步的,而写是写时钟域, 有一定的延迟
|
|
|
|
// 上个周期再当前周期如果继续进行操作, 虽然 这个标志位还没转变为0, 但是他实际内部已经是full或者emtpy了, 再写就溢出了
|
|
|
|
// 上个周期再当前周期如果继续进行操作, 虽然 这个标志位还没转变为0, 但是他实际内部已经是full或者emtpy了, 再写就溢出了
|
|
|
|
module test_fifo(
|
|
|
|
module test_fifo(
|
|
|
|
input wire sys_clk, // U18
|
|
|
|
(*mark_debug="true"*)input wire sys_clk, // U18
|
|
|
|
input wire sys_rst //J15
|
|
|
|
input wire sys_rst //J15
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wire clk_100m;
|
|
|
|
(*mark_debug="true"*)wire clk_100m;
|
|
|
|
wire clk_50m;
|
|
|
|
(*mark_debug="true"*)wire clk_50m;
|
|
|
|
wire locked;
|
|
|
|
(*mark_debug="true"*)wire locked;
|
|
|
|
wire logic_rst;
|
|
|
|
wire logic_rst;
|
|
|
|
|
|
|
|
|
|
|
|
assign logic_rst = sys_rst && locked; // 需要在高电平(按下并弹开按钮) 之后且 时钟稳定之后对子模块进行逻辑复位
|
|
|
|
assign logic_rst = sys_rst && locked; // 需要在高电平(按下并弹开按钮) 之后且 时钟稳定之后对子模块进行逻辑复位
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wire is_empty;
|
|
|
|
(*mark_debug="true"*)wire is_empty;
|
|
|
|
wire is_almost_full;
|
|
|
|
(*mark_debug="true"*)wire is_almost_full;
|
|
|
|
wire is_wr_rst_busy;
|
|
|
|
(*mark_debug="true"*)wire is_wr_rst_busy;
|
|
|
|
wire fifo_wr_en;
|
|
|
|
(*mark_debug="true"*)wire fifo_wr_en;
|
|
|
|
wire fifo_wr_data;
|
|
|
|
(*mark_debug="true"*)wire [7:0]fifo_wr_data;
|
|
|
|
|
|
|
|
|
|
|
|
fifo_wr u_fifo_wr(
|
|
|
|
fifo_wr u_fifo_wr(
|
|
|
|
.wr_clk(clk_50m),
|
|
|
|
.wr_clk(clk_50m),
|
|
|
@ -34,11 +35,11 @@ fifo_wr u_fifo_wr(
|
|
|
|
.fifo_wr_data(fifo_wr_data)
|
|
|
|
.fifo_wr_data(fifo_wr_data)
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
wire is_full;
|
|
|
|
(*mark_debug="true"*)wire is_full;
|
|
|
|
wire is_almost_empty;
|
|
|
|
(*mark_debug="true"*)wire is_almost_empty;
|
|
|
|
wire is_rd_rst_busy;
|
|
|
|
(*mark_debug="true"*)wire is_rd_rst_busy;
|
|
|
|
wire fifo_rd_en;
|
|
|
|
(*mark_debug="true"*)wire fifo_rd_en;
|
|
|
|
wire fifo_rd_data;
|
|
|
|
(*mark_debug="true"*)wire [7:0]fifo_rd_data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fifo_rd u_fifo_rd(
|
|
|
|
fifo_rd u_fifo_rd(
|
|
|
@ -58,8 +59,8 @@ clk_wiz_0 u_clk_wiz_0(
|
|
|
|
.locked(locked)
|
|
|
|
.locked(locked)
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
wire [7:0]rd_data_count;
|
|
|
|
(*mark_debug="true"*)wire [7:0]rd_data_count;
|
|
|
|
wire [7:0]wr_data_count;
|
|
|
|
(*mark_debug="true"*)wire [7:0]wr_data_count;
|
|
|
|
fifo_generator_0 u_fifo_generator_0(
|
|
|
|
fifo_generator_0 u_fifo_generator_0(
|
|
|
|
.rst(~logic_rst), // 该ip核内是高电平时钟信号有效, 平时需要低电平, 我们取logic_rst(这个是高电平)反
|
|
|
|
.rst(~logic_rst), // 该ip核内是高电平时钟信号有效, 平时需要低电平, 我们取logic_rst(这个是高电平)反
|
|
|
|
.wr_clk(clk_50m),
|
|
|
|
.wr_clk(clk_50m),
|
|
|
@ -69,7 +70,9 @@ fifo_generator_0 u_fifo_generator_0(
|
|
|
|
.rd_en(fifo_rd_en),
|
|
|
|
.rd_en(fifo_rd_en),
|
|
|
|
.dout(fifo_rd_data),
|
|
|
|
.dout(fifo_rd_data),
|
|
|
|
.full(is_full),
|
|
|
|
.full(is_full),
|
|
|
|
.almost_full(is_almost_empty),
|
|
|
|
.almost_full(is_almost_full),
|
|
|
|
|
|
|
|
.empty(is_empty),
|
|
|
|
|
|
|
|
.almost_empty(is_almost_empty),
|
|
|
|
.rd_data_count(rd_data_count),
|
|
|
|
.rd_data_count(rd_data_count),
|
|
|
|
.wr_data_count(wr_data_count),
|
|
|
|
.wr_data_count(wr_data_count),
|
|
|
|
.wr_rst_busy(is_wr_rst_busy),
|
|
|
|
.wr_rst_busy(is_wr_rst_busy),
|
|
|
|