📄 line_fifo_control.v
字号:
/*************************************************************************************
/模块功能:产生两个scfifo的读写控制信号
/信号说明:为避免对scfifo写满后继续写入,令其rdreq比wrreq提前一个周期有效
line2_wrreq,line1_wrreq与有效数据同步;
line2_rdreq从第二个有效行的前一个周期开始有效;
line1_rdreq从第三个有效行的前一个周期开始有效;
/存储顺序:在第一有效行期间,line2的写使能有效,将第一行数据写入line2,
此时,line2的读使能信号为低,不进行读取,line2被写满;
在第二有效行到来的前一个周期,line2的读使能有效,开始读取(fifo状态由满
变为未满),一个周期之后,line2的写使能有效,开始同时读写过程
在line2读取的同时,line1的写使能信号有效,开始写入数据,经过第二有效行后,
line1被写满;
在第三有效行到来的前一个周期,line1的读使能信号有效,开始读取数据,一个周
期后,line1的写使能信号有效,开始同时读写的过程
/时序描述:
/ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/时钟信号clk _| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_|
/ __________ _______________ _ _ _ ____________ _______
/像素数据 D.C. \/ 有 效 数 据 \/ D.C.
/ __________/\_______________ _ _ _ ____________/\_______
/
/ __________________________________
/data_valuable____________| |_____________
/ __________ _______________ _ _ _ ____________ _______
/data_delay_out D.C. \/ 有 效 数 据 \/ D.C.
/ __________/\_______________ _ _ _ ____________/\_______
/
/
/
/
*************************************************************************************/
module line_fifo_control(
clk,
rstn,
data_in,
data_valuable,
data_delay_out,
line2_wrreq,
line2_rdreq,
line1_wrreq,
line1_rdreq,
row_cnt
);
input [7:0] data_in;
input data_valuable;
input clk,rstn;
output [7:0] data_delay_out;
output line2_wrreq, line2_rdreq;
output line1_wrreq, line1_rdreq;
output [9:0] row_cnt;
reg [7:0] data_delay_out;
reg line2_wrreq, line1_wrreq;
reg line2_rdreq, line1_rdreq;
//延时
reg [7:0] data_reg;
reg data_valuable_delay;
always@(posedge clk)
begin
data_reg <= data_in;
data_delay_out <= data_reg;
data_valuable_delay <= data_valuable;
end
//产生行计数器row_cnt
reg[9:0] row_cnt;
always@(posedge data_valuable or negedge rstn)
if(!rstn)
row_cnt <= 0;
else
row_cnt <= row_cnt + 1'b1;
//产生line2的写使能信号line2_wrreq,产生line1的写使能信号line1_wrreq
always@(posedge clk or negedge rstn)
if(!rstn)
begin
line1_wrreq <= 0;
line2_wrreq <= 0;
end
else
begin
line2_wrreq <= data_valuable_delay;
line1_wrreq <= data_valuable_delay;
end
//产生line2的读使能信号line2_rdreq,产生line1的读使能信号line1_rdreq
always@(posedge clk or negedge rstn)
if(!rstn)
begin
line2_rdreq <= 1'b0;
end
else
begin
if(row_cnt > 1)//从第二行开始有效
line2_rdreq <= data_valuable;
else
line2_rdreq <= 1'b0;
end
always@(posedge clk or negedge rstn)
if(!rstn)
begin
line1_rdreq <= 1'b0;
end
else
begin
if(row_cnt > 1)//从第三行开始有效
line1_rdreq <= data_valuable;
else
line1_rdreq <= 1'b0;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -