记录学习日常:本实验参考正点原子的实验教程。按照自己的理解来完成实验。四个模块,第一个模块是调用fifo IP核并设计类型,二,写如数据模块,三,读数据模块,四,顶层模块。ip核设置如图:
二,
写数据模块的输入有时钟、复位、写满、写空,输出有写请求、写出数据,把数据写入fifo核。
读数据模块输入有时钟、复位、读空、读满、从fifo核来的数据,输出有读请求。
写请求与读请求都与fifo核发输入端相连,感觉fifo核像是个存储器,写入数据再读出。
当写空状态与写请求寄存器为1是写请求触发,当读满状态与读请求寄存器为1时读请求触发。
顶层模块就是把前三个模块整合到一个模块里。上代码“
module fifo_wr(
input clk,
input rst_n,
input wrempty,
input wrfull,
output reg[7:0]data,
output wrreq
);
reg [1:0]state_cnt;
reg wrreq_t;
assign wrreq = ~wrfull & wrreq_t;
always@(posedge clk or negedge rst_n)
if(!rst_n)begin
wrreq_t <= 1'b0;
data <= 8'd0;
state_cnt <= 2'd0;
end
else begin
case (state_cnt)
2'd0 : begin
if(wrempty)begin
wrreq_t <= 1'b1;
state_cnt <= state_cnt + 1'b1;
end
else
state_cnt <= state_cnt;
end
2'd1 : begin
if(wrfull)begin
wrreq_t <= 1'b0;
data <= 8'd0;
state_cnt <= 2'd0;
end
else begin
wrreq_t <= 1'b1;
data <= data +1'b1;
end
end
default :state_cnt <= 2'd0;
endcase
end
endmodule
module fifo_rd(
input clk,
input rst_n,
input [7:0]data,
input rdfull,
input rdempty,
output rdreq
);
reg rdreqt;
reg [1:0]state_cnt;
reg [7:0]data_fifo;
assign rdreq = ~rdempty & rdreqt;
always@(posedge clk or negedge rst_n)
if(!rst_n)begin
rdreqt <= 1'b0;
data_fifo <= 8'd0;
end
else begin
case (state_cnt)
2'd0 : begin
if(rdfull)begin
rdreqt <= 1'b1;
state_cnt <= state_cnt + 1'b1;
end
else
state_cnt <= state_cnt;
end
2'd1 : begin
if(rdempty)begin
rdreqt <= 1'b0;
data_fifo <= 8'd0;
state_cnt <= 2'd0;
end
else begin
rdreqt <= 1'b1;
data_fifo <= data;
end
end
default : state_cnt <= 2'd0;
endcase
end
endmodule
module fifo(
input sys_clk,
input sys_rst_n
);
wire [7:0] data;
wire rdreq;
wire wrreq;
wire [7:0] q;
wire rdempty;
wire rdfull;
wire [7:0] rdusedw;
wire wrempty;
wire wrfull;
wire [7:0] wrusedw;
fifo_ip u_fifo_ip (
.data(data),
.rdclk(sys_clk),
.rdreq(rdreq),
.wrclk(sys_clk),
.wrreq(wrreq),
.q(q),
.rdempty(rdempty),
.rdfull(rdfull),
.rdusedw(rdusedw),
.wrempty(wrempty),
.wrfull(wrfull),
.wrusedw(wrusedw)
);
fifo_wr fifo_wr_u(
.clk(sys_clk),
.rst_n(sys_rst_n),
.wrempty(wrempty),
.wrfull(wrfull),
.data(data),
.wrreq(wrreq)
);
fifo_rd fifo_rd_u(
.clk(sys_clk),
.rst_n(sys_rst_n),
.data(q),
.rdfull(rdfull),
.rdempty(rdempty),
.rdreq(rdreq)
);
endmodule
仿真
这个仿真总觉得有点问题,又说不上来。一起讨论下。