From 842c312f024b734e78071d7532dadb6363be3843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=B3=E5=85=89=E5=B0=91=E5=B9=B4?= <849317537@qq.com> Date: Mon, 3 Jun 2024 09:36:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xdma/ch_3/axi_mpeg2encoder_wrapper_cn.sv | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/xdma/ch_3/axi_mpeg2encoder_wrapper_cn.sv b/xdma/ch_3/axi_mpeg2encoder_wrapper_cn.sv index f2d2465..2cd7a36 100644 --- a/xdma/ch_3/axi_mpeg2encoder_wrapper_cn.sv +++ b/xdma/ch_3/axi_mpeg2encoder_wrapper_cn.sv @@ -53,7 +53,8 @@ reg [ 7:0] rcount = '0; // 读计数器 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_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); // 准备好接受新的读地址 @@ -182,12 +183,12 @@ wire mpeg2_o_en; // 表示MPEG2输出数 wire mpeg2_o_last; // 表示当前输出是MPEG2流中的最后一个数据包的标志 wire [255:0] mpeg2_o_data; // 输出的MPEG2编码数据 -reg [ 15:0] mpeg2_o_addr = '0; // 这个是内部用来确定保存位置的, 存储输出数据地址的寄存器,指向输出缓冲区的当前地址 -reg mpeg2_o_over = '0; // 1: 溢出指示,表示输出地址超出预期范围 +reg [ 15:0] mpeg2_o_addr = '0; // 这个是内部用来确定保存位置的, 每次保存都加1, 用来当做out_buf 的下标, 指向输出缓冲区的当前需要保存的下标 +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) // 在时钟上升沿更新 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_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_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_over <= '0; // 重置溢出标志 - end else if ( waddr >= 64'h01000000 ) begin // 写入原始YUV像素数据 - mpeg2_i_en <= 1'b1; // 使能输入 - { mpeg2_i_V2, mpeg2_i_Y3, mpeg2_i_U2, mpeg2_i_Y2, // 分配YUV数据到相应寄存器 + end else if ( waddr >= 64'h0100_0000 ) begin // 写入原始YUV像素数据 + mpeg2_i_en <= 1'b1; // 打开输入, 把下面的数据传进去, 后面会进行计算, 计算完之后会保存到 out_buf[mpeg2_o_addr] 中 + { 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; end end