|
|
@ -53,7 +53,8 @@ reg [ 7:0] rcount = '0; // 读计数器
|
|
|
|
reg [ 63-3:0] raddr_63_3, raddr_63_3_r; // 当前读地址的高60位及其节拍寄存器, 这是向字节对齐的
|
|
|
|
reg [ 63-3:0] raddr_63_3, raddr_63_3_r; // 当前读地址的高60位及其节拍寄存器, 这是向字节对齐的
|
|
|
|
// 合成完整读地址
|
|
|
|
// 合成完整读地址
|
|
|
|
wire [ 63:0] raddr = {raddr_63_3 , 3'h0}; // 当前地址(这是完整的64位) 直接连线的 63:5 是作为out_buf的下标, 用来获取 out_buf_rdata
|
|
|
|
wire [ 63:0] raddr = {raddr_63_3 , 3'h0}; // 当前地址(这是完整的64位) 直接连线的 63:5 是作为out_buf的下标, 用来获取 out_buf_rdata
|
|
|
|
wire [ 63:0] raddr_r = {raddr_63_3_r, 3'h0}; // 上个时钟周期的地址, 直接连线的 低三位是0, 4:3 是作为out_buf_rdata 256bit 控制位用来得到64bit
|
|
|
|
wire [ 63:0] raddr_r = {raddr_63_3_r, 3'h0}; // 上个时钟周期的地址, 直接连线的 如果大于h0100_0000, 则低三位是0, 4:3 是作为out_buf_rdata 256bit 控制位用来得到64bit
|
|
|
|
|
|
|
|
// 如果等于 0b0或者0b1000 或者0b10000, 则分别对应不同的处理
|
|
|
|
|
|
|
|
|
|
|
|
// 读接口信号分配
|
|
|
|
// 读接口信号分配
|
|
|
|
assign s_axi_arready = (rstate == R_IDLE); // 准备好接受新的读地址
|
|
|
|
assign s_axi_arready = (rstate == R_IDLE); // 准备好接受新的读地址
|
|
|
@ -182,12 +183,12 @@ wire mpeg2_o_en; // 表示MPEG2输出数
|
|
|
|
wire mpeg2_o_last; // 表示当前输出是MPEG2流中的最后一个数据包的标志
|
|
|
|
wire mpeg2_o_last; // 表示当前输出是MPEG2流中的最后一个数据包的标志
|
|
|
|
wire [255:0] mpeg2_o_data; // 输出的MPEG2编码数据
|
|
|
|
wire [255:0] mpeg2_o_data; // 输出的MPEG2编码数据
|
|
|
|
|
|
|
|
|
|
|
|
reg [ 15:0] mpeg2_o_addr = '0; // 这个是内部用来确定保存位置的, 存储输出数据地址的寄存器,指向输出缓冲区的当前地址
|
|
|
|
reg [ 15:0] mpeg2_o_addr = '0; // 这个是内部用来确定保存位置的, 每次保存都加1, 用来当做out_buf 的下标, 指向输出缓冲区的当前需要保存的下标
|
|
|
|
reg mpeg2_o_over = '0; // 1: 溢出指示,表示输出地址超出预期范围
|
|
|
|
reg mpeg2_o_over = '0; // 1: 溢出指示,表示输出地址超出预期范围
|
|
|
|
|
|
|
|
|
|
|
|
reg [255:0] out_buf ['h10000]; // 定义一个大容量的输出缓冲区,用于暂存MPEG2 IP产生的输出数据,大小为 256bit * 0x10000 = 16777216bit = 2 MB
|
|
|
|
reg [255:0] out_buf ['h10000]; // 定义一个 BRAM 大容量的输出缓冲区,用于暂存MPEG2 IP产生的输出数据,大小为 256bit * 0x10000(也就是2的16次方) = 16777216bit = 2 MB
|
|
|
|
|
|
|
|
|
|
|
|
reg [255:0] out_buf_rdata; // 用于读取BRAM中数据的临时寄存器
|
|
|
|
reg [255:0] out_buf_rdata; // 用于读取BRAM中数据的临时256位寄存器, 受 M传进来的raddr 控制
|
|
|
|
|
|
|
|
|
|
|
|
always @ (posedge clk) // 在时钟上升沿更新
|
|
|
|
always @ (posedge clk) // 在时钟上升沿更新
|
|
|
|
out_buf_rdata <= out_buf[ (16)'(raddr>>5) ]; // raddr低5位去掉, 用来当做out_buf下标, 从axi传来的指定地址读取out_buf BRAM中256位的数据到临时寄存器
|
|
|
|
out_buf_rdata <= out_buf[ (16)'(raddr>>5) ]; // raddr低5位去掉, 用来当做out_buf下标, 从axi传来的指定地址读取out_buf BRAM中256位的数据到临时寄存器
|
|
|
@ -232,17 +233,17 @@ always @ (posedge clk) begin
|
|
|
|
mpeg2_rstn <= s_axi_wdata[0]; // 更新复位信号
|
|
|
|
mpeg2_rstn <= s_axi_wdata[0]; // 更新复位信号
|
|
|
|
mpeg2_sequence_stop <= s_axi_wdata[1]; // 更新序列停止控制
|
|
|
|
mpeg2_sequence_stop <= s_axi_wdata[1]; // 更新序列停止控制
|
|
|
|
|
|
|
|
|
|
|
|
end else if ( waddr == 64'h00000008 ) begin // 写入视频帧尺寸
|
|
|
|
end else if ( waddr == 64'h00000008 ) begin // 写入视频帧尺寸 0b1000
|
|
|
|
mpeg2_xsize16 <= s_axi_wdata[ 6: 0]; // 更新宽度
|
|
|
|
mpeg2_xsize16 <= s_axi_wdata[ 6: 0]; // 更新宽度
|
|
|
|
mpeg2_ysize16 <= s_axi_wdata[38:32]; // 更新高度
|
|
|
|
mpeg2_ysize16 <= s_axi_wdata[38:32]; // 更新高度
|
|
|
|
|
|
|
|
|
|
|
|
end else if ( waddr == 64'h00000010 ) begin // 清除输出缓冲区控制
|
|
|
|
end else if ( waddr == 64'h00000010 ) begin // 清除输出缓冲区控制 0b1_0000
|
|
|
|
mpeg2_o_addr <= '0; // 重置地址
|
|
|
|
mpeg2_o_addr <= '0; // 重置地址
|
|
|
|
mpeg2_o_over <= '0; // 重置溢出标志
|
|
|
|
mpeg2_o_over <= '0; // 重置溢出标志
|
|
|
|
|
|
|
|
|
|
|
|
end else if ( waddr >= 64'h01000000 ) begin // 写入原始YUV像素数据
|
|
|
|
end else if ( waddr >= 64'h0100_0000 ) begin // 写入原始YUV像素数据
|
|
|
|
mpeg2_i_en <= 1'b1; // 使能输入
|
|
|
|
mpeg2_i_en <= 1'b1; // 打开输入, 把下面的数据传进去, 后面会进行计算, 计算完之后会保存到 out_buf[mpeg2_o_addr] 中
|
|
|
|
{ mpeg2_i_V2, mpeg2_i_Y3, mpeg2_i_U2, mpeg2_i_Y2, // 分配YUV数据到相应寄存器
|
|
|
|
{ mpeg2_i_V2, mpeg2_i_Y3, mpeg2_i_U2, mpeg2_i_Y2, // 分配YUV数据到相应寄存器, 这里每个寄存器是8bit, 一共64bit
|
|
|
|
mpeg2_i_V0, mpeg2_i_Y1, mpeg2_i_U0, mpeg2_i_Y0 } <= s_axi_wdata;
|
|
|
|
mpeg2_i_V0, mpeg2_i_Y1, mpeg2_i_U0, mpeg2_i_Y0 } <= s_axi_wdata;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|