关于base_addr和rame_addr的地址的计算
一共有4个通道,实际是上base_addr来表示,看突发写DDR2的24位地址就知道了, 每一个通道有4帧数据的存储,
module vin_frame_buffer_ctrl
#(
parameter MEM_DATA_BITS = 64
)
(
input rst_n, /*复位 */
input vin_clk, /*视频输入时钟 */
input vin_vs, /*视频输入场同步 */
input vin_f, /*视频输入奇偶场标志 */
input vin_de, /*视频输入数据有效 */
input[15:0] vin_data, /*视频输入数据YC */
input[11:0] vin_width, /*视频输入宽度*/
input[11:0] vin_height, /*视频输入高度*/
output reg fifo_afull, /*输入fifo快满*/
input mem_clk, /*存储器接口:时钟*/
output reg wr_burst_req, /*存储器接口:写请求*/
output reg[9:0] wr_burst_len, /*存储器接口:写长度*/
output reg[23:0] wr_burst_addr, /*存储器接口:写首地址 */
input wr_burst_data_req, /*存储器接口:写数据数据读指示 */
output[MEM_DATA_BITS - 1:0] wr_burst_data, /*存储器接口:写数据*/
input burst_finish, /*存储器接口:本次写完成 */
output reg[11:0] wr_max_line, /*辅助信号,测试用 */
input[1:0] base_addr, /*帧地址参数*/
output reg[1:0] frame_addr /*当前写入帧地址*/
);
// 初始化为0
initial
begin
frame_addr <= 2'd0;
end
.....
/*突发写首地址的产生*/
always@(posedge mem_clk or negedge rst_n)
begin
if(!rst_n)
wr_burst_addr <= 24'd0;
else if(burst_state_next == BURST_ONE_LINE_START)
wr_burst_addr <= {1'b0,base_addr,frame_addr[1:0],burst_line[8:0],vin_f,8'd0};//24bit ddr addr
else if(burst_state_next == BURST_END && burst_state != BURST_END)
wr_burst_addr[7:0] <= wr_burst_addr[7:0] + BURST_LEN[7:0];
else
wr_burst_addr <= wr_burst_addr;
end
always@(posedge mem_clk or negedge rst_n)
begin
if(!rst_n)
frame_addr <= 2'd0;
else if(frame_flag && vin_f)//没写入一帧数据frame_addr加1
//else if(frame_flag)
frame_addr <= frame_addr + 2'd1;
else
frame_addr <= frame_addr;
end