当前位置: 首页 > news >正文

图像格式转换设计-高层次综合设计

一、测试激励

#include <iostream>
#include <fstream>
#include "frame_top.h"

using namespace std;

#include <iostream>
#include <cstdint>
#include <cassert>

// 仿真使用的视频时序参数(1920×1080 @ 60Hz 典型值)

#include <iostream>
#include <cstdlib>
#include "frame_top.h"

// 时序参数(应与 frame_top.h 中的定义一致)
// 图像有效分辨率
#ifndef H_ACTIVE
#define H_ACTIVE 192
#endif
#ifndef V_ACTIVE
#define V_ACTIVE 108
#endif

// 视频时序参数(可根据需要调整)
#define H_SYNC  8
#define H_BACK  16
#define H_FRONT 8
#define H_TOTAL (H_SYNC + H_BACK + H_ACTIVE + H_FRONT)

#define V_SYNC  2
#define V_BACK  4
#define V_FRONT 2
#define V_TOTAL (V_SYNC + V_BACK + V_ACTIVE + V_FRONT)


int main() {
    // 输入信号
    pixel_t       in_data;
    ap_uint<1>    vsync, hsync, de;
    hls::stream<axis_pkt_t> output_stream("output_stream");

    // 用于生成测试数据的计数器
    int pixel_val = 0;

    // 模拟一帧视频时序
    for (int v = 0; v < V_TOTAL; v++) {
        vsync = (v < V_SYNC) ? 0 : 1;
        for (int h = 0; h < H_TOTAL; h++) {
            hsync = (h < H_SYNC) ? 0 : 1;

            bool in_active = (v >= (V_SYNC + V_BACK)) &&
                             (v <  (V_SYNC + V_BACK + V_ACTIVE)) &&
                             (h >= (H_SYNC + H_BACK)) &&
                             (h <  (H_SYNC + H_BACK + H_ACTIVE));
            de = in_active ? 1 : 0;

            // 产生递增像素(仅有效区域才真正使用)
            if (de == 1) {
                in_data = pixel_val % 256;   // 模拟灰度
                pixel_val++;
            }

            // 每个时钟周期调用一次函数(硬件行为)
            std::cout << "hsync: " << hsync << std::endl;
            axi_stream_to_video(in_data, vsync, hsync, de, output_stream);

            if(!output_stream.empty())
                axis_pkt_t pkt = output_stream.read();
        }
    }

//    // 验证输出
//    int expected_pix = 0;
//    int output_count = 0;
//    bool first_pix_of_frame = true;
//    int line_pixel_cnt = 0;
//
//    while (!output_stream.empty()) {
//        axis_pkt_t pkt = output_stream.read();
//        output_count++;
//
//        // 检查数据值
//        if (pkt.data != (expected_pix % 256)) {
//            std::cerr << "ERROR: data mismatch at pixel " << output_count-1
//                      << " expected " << (expected_pix % 256)
//                      << " got " << (int)pkt.data << std::endl;
//           // return 1;
//        }
//
//        // 检查 tuser(仅帧首第一个有效像素为 1)
//        if (first_pix_of_frame) {
//            if (pkt.user != 1) {
//                std::cerr << "ERROR: missing tuser on first pixel" << std::endl;
//                //return 1;
//            }
//            first_pix_of_frame = false;
//        } else {
//            if (pkt.user != 0) {
//                std::cerr << "ERROR: unexpected tuser at pixel " << output_count-1 << std::endl;
//                //return 1;
//            }
//        }
//
//        // 检查 tlast(每行最后一个像素)
//        bool expected_last = (line_pixel_cnt == H_ACTIVE - 1);
//        if (pkt.last != expected_last) {
//            std::cerr << "ERROR: tlast mismatch at pixel " << output_count-1
//                      << " expected " << expected_last << " got " << pkt.last << std::endl;
//           // return 1;
//        }
//
//        line_pixel_cnt++;
//        if (line_pixel_cnt == H_ACTIVE) {
//            line_pixel_cnt = 0;
//        }
//        expected_pix++;
//    }
//
//    // 检查总像素数
//    if (output_count != H_ACTIVE * V_ACTIVE) {
//        std::cerr << "ERROR: output pixel count " << output_count
//                  << " expected " << H_ACTIVE * V_ACTIVE << std::endl;
//       // return 1;
//    }

   // std::cout << "Test PASSED: " << output_count << " pixels, all checks ok." << std::endl;
    return 0;
}


// 简易视频源生成函数:每帧产生递增的像素值(从0开始逐行递增)
//void video_source(
//    hls::stream<pixel_t>   &data_feed,     // 输出像素数据(由测试平台驱动到模块输入)
//    ap_uint<1>             &vsync,
//    ap_uint<1>             &hsync,
//    ap_uint<1>             &de,
//    int                    num_frames
//) {
//    // 每个像素的灰度值,从0开始,跨帧连续递增
//    int pixel_value = 0;
//
//    for (int frame = 0; frame < num_frames; ++frame) {
//        for (int v = 0; v < V_TOTAL; ++v) {
//            // 场同步信号:低有效
//            vsync = (v < V_SYNC) ? 0 : 1;
//
//            for (int h = 0; h < H_TOTAL; ++h) {
//                // 行同步信号:低有效
//                hsync = (h < H_SYNC) ? 0 : 1;
//
//                // 数据有效信号(仅在有效显示区域)
//                bool in_active = (v >= (V_SYNC + V_BACK)) &am

http://www.jsqmd.com/news/758018/

相关文章:

  • 如何快速配置专业级风扇控制:3分钟掌握FanControl完整指南
  • UE5游戏开发实战:TMap与TSet性能对比,别再傻傻分不清了
  • 资质申报提效:用 OpenClaw 自动整理企业资质申报材料、校验格式、生成目录,提升申报通过率
  • MobileFaceNet vs MobileNetV2:实测对比,为什么它做人脸识别又快又准?
  • 什么是断言?
  • 天猫购物卡使用攻略,回收小妙招大揭秘! - 团团收购物卡回收
  • 刘海东的无题
  • “红帽系统管理二”知识点问答题:第13章 运行容器
  • Dify+金融审计=合规新范式(2024年首批持牌机构已验证的7大风控校验模板)
  • 从零到一:如何用SVG-Edit轻松创建专业级矢量图形
  • AI论文!大学副院长,被迫卸任,AI写论文风险一次性讲透(附解决方案) - AI论文先行者
  • 前端项目测试
  • 西安电子科技大学LaTeX论文排版终极指南:告别格式烦恼,专注内容创作
  • 山西美利坚装饰工程:太原阳光房定制优质的公司 - LYL仔仔
  • 如何在 CI/CD 流水线中集成 Docker Compose 自动部署
  • 打造你的专属工坊:饥荒Mod开发中自定义制作栏过滤器(Crafting Filter)从入门到实战
  • 5分钟上手同花顺自动化交易:jqktrader Python量化工具实战指南
  • 如何永久禁用Windows Defender:开源终极控制方案详解
  • AI代码审查实战:从LLM原理到GitHub集成部署
  • 内容创作团队如何利用多模型能力提升文案生成效率
  • DDrawCompat完整指南:在Windows 11上轻松修复经典游戏兼容性的终极方案
  • 江苏移动魔百盒MGV3000刷机避坑指南:S905L3芯片卡刷/线刷保姆级教程
  • 新手入门教程使用python快速配置taotoken进行大模型调用
  • 环境配置与基础教程:生产级落地保障:Python Logging 模块进阶,为你的视觉模型训练脚本加上金融级工业日志捕获
  • 比较通过Taotoken调用不同模型解答硬件相关技术问题的响应速度与质量
  • 别再死记硬背了!用Wireshark抓包实战,5分钟搞懂STP的BPDU报文选举过程
  • 告别重装!手把手教你用VHDX文件在另一台电脑的WSL里无缝迁移开发环境
  • PyTorch Grad-CAM技术深度解析与学术引用规范指南
  • Windows风扇控制软件终极指南:让你的电脑散热系统更智能、更安静!
  • 别再踩坑!STM32 HAL库中断服务函数里写延时的正确姿势与替代方案