AXIS 视频缩放代码

该博客详细介绍了一个名为`vx_img_resize_axis`的模块,它接受输入数据并根据`zoom_coef`参数进行不同比例的缩放。通过AXIS接口处理数据流,实现线性计数和数据有效性判断。核心部分展示了根据不同缩放系数的条件分支逻辑,确保输出数据的准确性和效率。
摘要由CSDN通过智能技术生成

`timescale 1ns / 1ps
module vx_img_resize_axis#(
parameter DATA_WIDTH = 64
)(
input wire axis_aclk,
input wire axis_aresetn,
input wire [7:0] zoom_coef, //0表示不做缩放,1表示缩放2倍,2表示缩放4倍,3表示缩放8倍 4表示缩放16倍
input wire s00_axis_tuser,
input wire [DATA_WIDTH-1 : 0] s00_axis_tdata,
input wire [7 : 0] s00_axis_tstrb,
input wire s00_axis_tlast,
input wire s00_axis_tvalid,
output reg s00_axis_tready,

output reg m00_axis_tuser,
output reg m00_axis_tvalid,
output reg [DATA_WIDTH-1 : 0] m00_axis_tdata,
output reg [7 : 0] m00_axis_tstrb,
output reg m00_axis_tlast,
input wire m00_axis_tready  ,

output reg [31:0] line_data_cnt_r,
output reg [31:0] line_cnt_r


);

always @(posedge axis_aclk or negedge axis_aresetn) begin
    if (~axis_aresetn) begin
        line_data_cnt_r <= 'b0;
        line_cnt_r <= 'b0;
    end else begin
       // line_data_cnt_r <= (s00_axis_tuser||s00_axis_tlast) ? 'b0 : s00_axis_tvalid ? (line_data_cnt_r + 1'b1) : line_data_cnt_r;
       // line_cnt_r <= s00_axis_tuser ? 'b0 : s00_axis_tlast ? (line_cnt_r + 1'b1) : line_cnt_r;              
	    line_data_cnt_r <= ( ( s00_axis_tuser && s00_axis_tvalid && m00_axis_tready ) || ( s00_axis_tlast && s00_axis_tvalid && m00_axis_tready  ))   ? 'b0 : ( s00_axis_tvalid  && m00_axis_tready )  ? (line_data_cnt_r + 1'b1) : line_data_cnt_r;
        line_cnt_r <= ( s00_axis_tuser && s00_axis_tvalid && m00_axis_tready )  ? 'b0 : ( s00_axis_tlast && s00_axis_tvalid && m00_axis_tready ) ? (line_cnt_r + 1'b1) : line_cnt_r;              
    end
end

reg s00_axis_tvalid_d1;
reg [63:0] s00_axis_tdata_d1;
reg s00_axis_tstrb_d1;
reg s00_axis_tlast_d1;
reg s00_axis_tuser_d1;

reg m00_axis_tready_d1;

//输出计算结果
always @(posedge axis_aclk or negedge axis_aresetn) begin
    if (~axis_aresetn) begin
        s00_axis_tready <= 'b0;
        m00_axis_tuser <= 'b0;
        m00_axis_tvalid <= 'b0;
        m00_axis_tdata <= 'b0;
        m00_axis_tstrb <= 'b0;
        m00_axis_tlast <= 'b0;
    end else begin
        m00_axis_tready_d1 <= m00_axis_tready;
        s00_axis_tuser_d1 <= s00_axis_tuser;

        s00_axis_tready <= m00_axis_tready_d1;
        m00_axis_tuser <= s00_axis_tuser_d1;
		
		s00_axis_tvalid_d1	<=s00_axis_tvalid;
		s00_axis_tdata_d1	<=s00_axis_tdata	;	
		s00_axis_tstrb_d1	<=s00_axis_tstrb	;	
		s00_axis_tlast_d1	<=s00_axis_tlast	;   

        case(zoom_coef)
        8'd0: begin
            m00_axis_tvalid <=s00_axis_tvalid_d1;
            m00_axis_tdata <= s00_axis_tdata_d1;
            m00_axis_tstrb <= s00_axis_tstrb_d1;
            m00_axis_tlast <= s00_axis_tlast_d1;
         end
        8'd1: begin				
			if ( line_cnt_r[0]== 1'b0) begin 
				m00_axis_tlast <= s00_axis_tlast_d1;
                if(s00_axis_tvalid_d1 && ( line_data_cnt_r[0] == 'b0) ) begin
                    m00_axis_tvalid     <= s00_axis_tvalid_d1;
                    m00_axis_tdata      <= s00_axis_tdata_d1;
                    m00_axis_tstrb      <= s00_axis_tstrb_d1;
                end else begin
                    m00_axis_tvalid <= 1'b0;
                    m00_axis_tdata <= 'b0;
                    m00_axis_tstrb <= 'b0;     					
                end					
			end else begin 
				m00_axis_tlast <= 1'b0;
                m00_axis_tvalid <= 1'b0;
                m00_axis_tdata <= 'b0;
                m00_axis_tstrb <= 'b0;     					
			end 
          end
        8'd2: begin				
			if ( line_cnt_r[1:0]== 2'b0) begin 
				m00_axis_tlast <= s00_axis_tlast_d1;
                if(s00_axis_tvalid_d1 && ( line_data_cnt_r[1:0] == 2'b0) ) begin
                    m00_axis_tvalid     <= s00_axis_tvalid_d1;
                    m00_axis_tdata      <= s00_axis_tdata_d1;
                    m00_axis_tstrb      <= s00_axis_tstrb_d1;
                end else begin
                    m00_axis_tvalid <= 1'b0;
                    m00_axis_tdata <= 'b0;
                    m00_axis_tstrb <= 'b0;     					
                end					
			end else begin 
				m00_axis_tlast <= 1'b0;
                m00_axis_tvalid <= 1'b0;
                m00_axis_tdata <= 'b0;
                m00_axis_tstrb <= 'b0;     					
			end 
          end			  
        8'd3: begin				
			if ( line_cnt_r[2:0]== 3'b0) begin 
				m00_axis_tlast <= s00_axis_tlast_d1;
                if(s00_axis_tvalid_d1 && ( line_data_cnt_r[2:0] == 3'b0) ) begin
                    m00_axis_tvalid     <= s00_axis_tvalid_d1;
                    m00_axis_tdata      <= s00_axis_tdata_d1;
                    m00_axis_tstrb      <= s00_axis_tstrb_d1;
                end else begin
                    m00_axis_tvalid <= 1'b0;
                    m00_axis_tdata <= 'b0;
                    m00_axis_tstrb <= 'b0;     					
                end					
			end else begin 
				m00_axis_tlast <= 1'b0;
                m00_axis_tvalid <= 1'b0;
                m00_axis_tdata <= 'b0;
                m00_axis_tstrb <= 'b0;     					
			end 
          end				  
        8'd4: begin				
			if ( line_cnt_r[3:0]== 4'b0) begin 
				m00_axis_tlast <= s00_axis_tlast_d1;
                if(s00_axis_tvalid_d1 && ( line_data_cnt_r[3:0] == 4'b0) ) begin
                    m00_axis_tvalid     <= s00_axis_tvalid_d1;
                    m00_axis_tdata      <= s00_axis_tdata_d1;
                    m00_axis_tstrb      <= s00_axis_tstrb_d1;
                end else begin
                    m00_axis_tvalid <= 1'b0;
                    m00_axis_tdata <= 'b0;
                    m00_axis_tstrb <= 'b0;     					
                end					
			end else begin 
				m00_axis_tlast <= 1'b0;
                m00_axis_tvalid <= 1'b0;
                m00_axis_tdata <= 'b0;
                m00_axis_tstrb <= 'b0;     					
			end 
          end		
		default :begin 
            m00_axis_tvalid <=s00_axis_tvalid_d1;
            m00_axis_tdata <= s00_axis_tdata_d1;
            m00_axis_tstrb <= s00_axis_tstrb_d1;
            m00_axis_tlast <= s00_axis_tlast_d1;						
		end 
		
    endcase
end

end

endmodule

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
部署一个通过视频来识别固体和液体的模型需要一些额外的步骤和代码。以下是一个基本的代码框架,可以帮助您开始: 1. 导入所需的库和模块: ```python import cv2 import numpy as np import tensorflow as tf ``` 2. 加载已经训练好的模型: ```python model = tf.keras.models.load_model('path_to_your_trained_model') ``` 3. 定义图像预处理函数: ```python def preprocess_image(image): # 实施图像预处理,如缩放、归一化等 # 返回预处理后的图像 return preprocessed_image ``` 4. 定义视频流处理函数: ```python def process_video_stream(): cap = cv2.VideoCapture('path_to_your_video_file') while cap.isOpened(): ret, frame = cap.read() if not ret: break # 对帧图像进行预处理 preprocessed_frame = preprocess_image(frame) # 对预处理后的图像进行预测 predictions = model.predict(np.expand_dims(preprocessed_frame, axis=0)) # 根据预测结果进行后续操作,如绘制边界框或打印类别等 # 显示处理后的图像 cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 5. 调用视频流处理函数: ```python process_video_stream() ``` 请注意,上述代码只是一个示例框架,您可能需要根据您的具体需求进行适当的修改和调整。另外,确保已经安装了所需的库和依赖项,如OpenCV、NumPy和TensorFlow。 希望这可以帮助您开始部署视频识别固体和液体的模型!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值