基于FPGA:运动目标检测(包围盒仿真工程,及一些调试问题)

news2024/11/25 5:02:56

目录

  • 前言
  • 一、安装器件库
  • 二、仿真工程操作
    • 1、进入文件列表
    • 2、找到bounding_box_locate.vt,双击打开文件
    • 3、修改路径
    • 4、路径设置
    • 5、切换回“Hierarchy”,即工程界面
    • 6、运行仿真
    • 7、查看波形
  • 重点:调试问题
  • 三、仿真代码
    • 1、仿真顶层文件
    • 2、绘制包围盒模块
  • 四、工程获取

前言

      前面写了几篇关于运动目标检测的文章了:
1、基于FPGA:运动目标检测(VGA显示,原理图+源码+硬件选择)
2、基于FPGA:运动目标检测(LCD显示+串口输出,纯Verilog工程)
3、基于FPGA:运动目标检测(补充仿真结果,可用毕设)

      LCD显示、VGA显示都做完了,这篇文章补充一下包围盒的仿真代码,下载工程可以直接运行仿真。

一、安装器件库

      因为仿真占用逻辑资源比较多,这里需要用的cyclone V的器件库,如果没有的,自己安装(最好是Quartus II 18.0以上)
       18.0器件库链接:https://www.intel.com/content/www/us/en/software-kit/667160/intel-quartus-prime-standard-edition-design-software-version-18-0-for-windows.html
      在这里面就能找到了。其他版本可以自己选。(下载的时候,最好自己用邮箱注册一个英特尔账号)
在这里插入图片描述
在这里插入图片描述

      下载完器件库,把器件库放在quartus的安装目录的bin目录下,然后在win开始页,选择Device Installer,进行安装。
在这里插入图片描述
      选择Bin路径
在这里插入图片描述

      一路nex。
在这里插入图片描述

二、仿真工程操作

1、进入文件列表

在这里插入图片描述

2、找到bounding_box_locate.vt,双击打开文件

在这里插入图片描述

3、修改路径

      在右侧窗口中找到45~47行,修改里面的文件路径,如果不知道怎么修改请看第4条
在这里插入图片描述

4、路径设置

      路径修改主要是确保doc文件夹路径要正确,因为在你的电脑上解压存放的路径和我的路径不一定一样,比如在我电脑上doc路径是:F:\FPGA\FPGA\bounding_box_locate\doc,注意在修改3中的路径时单斜杠要换成双斜杠;
在这里插入图片描述

5、切换回“Hierarchy”,即工程界面

在这里插入图片描述

6、运行仿真

      点击“Tools”–“Run Simulation Tool”–“RTL Simulation”

在这里插入图片描述

7、查看波形

      仿真开始后可以在“Wave”窗口看到波形,仿真完成会自动停止
在这里插入图片描述

重点:调试问题

问题1:
      如果第6步点了之后,出现这个界面,证明你的quartus没有安装modelsim,或者指定modelsim路径。

在这里插入图片描述

      这个时候,需要点击Tools-Options…

在这里插入图片描述

      添加正确真实的ModelSim-Altera安装路径。

在这里插入图片描述
问题2:

Error: (vish-42) Unsupported ModelSim library format for "F:/FPGA/FPGA/bounding_box_locate/par/simulation/modelsim/rtl_work". (Format: 4)

在这里插入图片描述

      这种问题多出现在拷贝别人的工程然后直接打开进行仿真,或者电脑软件重装且Modelsim软件降版之后。
      实际原因为工程中已经有的编译生成的仿真库文件版本比正在使用的仿真软件版本高,导致现在版本的Modelsim无权限去删除旧的库文件以重新生成新的库文件。所以报这个错误。

解决办法:
      手动将当前工程目录(注意,是当前工程目录,不是你的Quartus或者Modelsim软件安装目录,这种低级理解性错误很多人都犯),你当前仿真的是哪个工程,就把这个工程目录下的simulation文件夹删除了,然后重新运行仿真就可以了。

问题3:

#** Error: (vlog-7) Failed to open design unit file "F:/FPGA/FPGA/bounding_box_locate/par/simulation/modelsim/bounding_box_locate.vt" in read mode.

在这里插入图片描述
      因为很乖巧,按问题2我说的方法解决了问题2,所以就出现了问题3🐸
      这个问题,很明显,就是在simulation文件夹下,有bounding_box_locate.vt,然后被你删除了🐸

      到这里应该就没有其他问题了,一些路径过长,路径有空格,中文的,记得不要有。

三、仿真代码

1、仿真顶层文件

//功能:绘制包围盒模块
module bounding_box_top#(
    parameter MAX_NUM    = 8  ,
    parameter GAP_THR    = 60 ,//离散阈值,即任意白点到某个已存在的包围盒距离小于等于GAP_THR则归属于此包围盒
    parameter CW         = 10 , //cordinate width
	parameter BOX_COLOR  = 24'hff_00_00//包围盒默认红色
	)
(
	input         clk    ,
	input         rst_n  ,
    //原始图像
	input         i_vsync,
	input         i_hsync,
	input         i_clken,
	input [23:0]  i_data ,//
    //目标检测并二值化后图像
    input         i_vsync_bin,
    input         i_hsync_bin,
    input         i_clken_bin,
    input [0:0]   i_data_bin ,//
	 //目标数量
	 output [$clog2(MAX_NUM)-1:0] obj_num,
    //原始图像添加包围盒后的图像
	output        o_vsync,
	output        o_hsync,
	output        o_clken,
	output [23:0] o_data  //
);
wire       post1_frame_vsync;
wire       post1_frame_href ;
wire       post1_frame_clken;
wire [7:0] post1_frame_data ;

wire [CW*MAX_NUM-1:0] x_min;
wire [CW*MAX_NUM-1:0] x_max;
wire [CW*MAX_NUM-1:0] y_min;
wire [CW*MAX_NUM-1:0] y_max;
multy_locate#(
    .MAX_NUM(MAX_NUM),//支持的最大目标数量
    .GAP_THR(GAP_THR),//离散阈值,即任意白点到某个已存在的包围盒距离小于等于GAP_THR则归属于此包围盒
    .CW     (CW     )//cordinate width
    )u_multy_locate_0
(
    .clk    (clk        ) ,
    .rst_n  (rst_n      ) ,
    .i_vsync(i_vsync_bin) ,
    .i_hsync(i_hsync_bin) ,
    .i_clken(i_clken_bin) ,
    .i_data (i_data_bin ) ,//binary data
    .obj_num(obj_num    ) ,//检测到的目标个数
    .x_min  (x_min      ) ,//目标的包围盒坐标
    .x_max  (x_max      ) ,//目标的包围盒坐标
    .y_min  (y_min      ) ,//目标的包围盒坐标
    .y_max  (y_max      ) //目标的包围盒坐标
);
// bounding_box_locate #(
//     .MAX_NUM    (MAX_NUM )  ,
//     .GAP_THR    (GAP_THR)  ,//离散阈值,即任意白点到某个已存在的包围盒距离小于等于GAP_THR则归属于此包围盒
//     .CW         (CW)   //cordinate width
// )u_bounding_box_locate_0
// (
//     .clk  (clk),
//     .rst_n(rst_n),
//     .i_vsync(i_vsync_bin),
//     .i_hsync(i_hsync_bin),
//     .i_clken(i_clken_bin),
//     .i_data (i_data_bin ),//binary data
//     .o_valid(),
//     .x_min(x_min),
//     .x_max(x_max),
//     .y_min(y_min),
//     .y_max(y_max)
// );
wire [MAX_NUM-1:0] i_vsync_w;
wire [MAX_NUM-1:0] i_hsync_w;
wire [MAX_NUM-1:0] i_clken_w;
wire [23:0]        i_data_w[MAX_NUM-1:0];
wire [MAX_NUM-1:0] o_vsync_w;
wire [MAX_NUM-1:0] o_hsync_w;
wire [MAX_NUM-1:0] o_clken_w;
wire [23:0]        o_data_w[MAX_NUM-1:0];
//使用generate语句循环例化多个bounding_box_draw模块,每个bounding_box_draw模块画一个包围盒,同时产生一个时钟的数据延迟
generate
genvar m;
for(m=0;m<MAX_NUM;m=m+1)begin:u_drw
    if(m==0)begin:u_drw_0
        bounding_box_draw#(
            .BOX_COLOR  ( BOX_COLOR ),//包围盒默认红色
            .CW         ( CW           ) //cordinate width
            ) u_bounding_box_draw_0
        (
            .clk    (clk  ),
            .rst_n  (rst_n),
            .i_vsync(i_vsync) ,
            .i_hsync(i_hsync) ,
            .i_clken(i_clken) ,
            .i_data (i_data ) ,
            .x_min  (x_min[(m+1)*CW-1-:CW]),
            .x_max  (x_max[(m+1)*CW-1-:CW]),
            .y_min  (y_min[(m+1)*CW-1-:CW]),
            .y_max  (y_max[(m+1)*CW-1-:CW]),
            .o_vsync(o_vsync_w[m]),
            .o_hsync(o_hsync_w[m]),
            .o_clken(o_clken_w[m]),
            .o_data (o_data_w[m]) //binary data
        );
    end
    else begin:u_drw_m
        bounding_box_draw#(
            .BOX_COLOR  ( BOX_COLOR ),//包围盒默认红色
            .CW         ( CW           ) //cordinate width
            ) u_bounding_box_draw_0
        (
            .clk    (clk  ),
            .rst_n  (rst_n),
            .i_vsync(o_vsync_w[m-1]),
            .i_hsync(o_hsync_w[m-1]),
            .i_clken(o_clken_w[m-1]),
            .i_data (o_data_w[m-1] ),
            .x_min  (x_min[(m+1)*CW-1-:CW]),
            .x_max  (x_max[(m+1)*CW-1-:CW]),
            .y_min  (y_min[(m+1)*CW-1-:CW]),
            .y_max  (y_max[(m+1)*CW-1-:CW]),
            .o_vsync(o_vsync_w[m]),
            .o_hsync(o_hsync_w[m]),
            .o_clken(o_clken_w[m]),
            .o_data (o_data_w[m] ) //binary data
        );
    end
end
endgenerate
assign o_vsync = o_vsync_w[MAX_NUM-1];
assign o_hsync = o_hsync_w[MAX_NUM-1];
assign o_clken = o_clken_w[MAX_NUM-1];
assign o_data  = o_data_w[MAX_NUM-1] ;
endmodule 

2、绘制包围盒模块

//功能:绘制包围盒模块
module bounding_box_draw#(
	parameter BOX_COLOR  = 24'hff_00_00,//包围盒默认红色
	parameter CW         = 12  //cordinate width
	)
(
	input       clk    ,
	input       rst_n  ,
	input       i_vsync,
	input       i_hsync,
	input       i_clken,
	input [23:0]i_data ,//binary data
	input [CW-1:0] x_min,x_max,y_min,y_max,
	output reg       o_vsync,
	output reg       o_hsync,
	output reg       o_clken,
	output reg [23:0]o_data  //binary data
);
reg [CW-1:0] x_cnt,y_cnt;//当前输入的像素坐标
reg i_vsync_r,i_hsync_r,i_vsync_neg_r;
wire i_vsync_neg,i_hsync_neg;
assign i_vsync_neg = ~i_vsync && i_vsync_r;//vsyn下降沿检测
assign i_hsync_neg = ~i_hsync && i_hsync_r;//hsyn下降沿检测
//产生i_vsync_r、i_hsync_r逻辑
always@(posedge clk or negedge rst_n)
if(~rst_n)
    begin
    i_vsync_r <= 1'b0;
    i_hsync_r <= 1'b0;
    end
else
    begin
	i_vsync_r <= i_vsync;
	i_hsync_r <= i_hsync;
	end
//产生x_cnt,y_cnt逻辑
always @(posedge clk or negedge rst_n) 
if(~rst_n) //复位,包围盒坐标全部清零,坐标全零的包围盒视为不存在
    begin
    x_cnt   <= 'd0;
    y_cnt   <= 'd0;
    end 
else if(i_vsync_neg)
    begin
    x_cnt   <= 'd0;//每帧结束清空坐标计数器
    y_cnt   <= 'd0;//每帧结束清空坐标计数器 
    end
else
    begin	 
    //坐标计数器计数
    x_cnt <= i_hsync_neg?'d0:(i_clken?x_cnt+1'b1:x_cnt);//hsyn下降沿清零,i_clken高电平时自增1
    y_cnt <= i_hsync_neg?y_cnt+1'b1:y_cnt;//hsyn下降沿自增1		
	end
//包围盒着色 
always@(posedge clk or negedge rst_n)
begin
if(~rst_n) //复位
    begin
    o_vsync <= 1'b0;
    o_hsync <= 1'b0;
    o_clken <= 1'b0;
    o_data  <= 'd0;		
    end	
else 
    begin
	o_vsync <= i_vsync; 
    o_hsync <= i_hsync; 
    o_clken <= i_clken; 
    if( (( (x_cnt+2'd3 >= x_min && x_cnt <= x_min) || (x_cnt <= x_max+2'd3 && x_cnt >= x_max)) && y_cnt+2'd3 >= y_min && y_cnt <= y_max+2'd3) || 
    	(( (y_cnt+2'd3 >= y_min && y_cnt <= y_min) || (y_cnt <= y_max+2'd3 && y_cnt >= y_max)) && x_cnt+2'd3 >= x_min && x_cnt <= x_max+2'd3) 
      )    o_data <= BOX_COLOR;
    else   o_data <= i_data;
    end
end
endmodule 

四、工程获取

1、直接点击下载:
基于FPGA:运动目标包围盒仿真(Quartus+modelsim)
注:如果点击无效,证明资源还在审核。

2、私信我或添加邮箱获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/586702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node篇-fs模块儿

nodejs-fs模儿 异步 1. mkdir() 创建一个目录 // 1.mkdir 创建一个目录&#xff0c;回调函数的参数含义&#xff1a;err const fs require(fs); fs.mkdir(./avater,(err)>{console.log(err);if(err && err.code EEXIST){console.log(当前目录已经存在)} }) 当我…

华硕天选4R FA617原装Windows11原厂预装系统工厂模式恢复安装带 ASUSRecevory 一键还原22H2版本

华硕天选4R FA617X原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个16…

浅谈NoSQL数据库

数据库 数据库&#xff0c;又称为数据管理系统&#xff0c;是处理的数据按照一定的方式储存在一起&#xff0c;能够让多个用户共享、尽可能减小冗余度的数据集合&#xff0c;简而言之可视为电子化的文件柜——存储电子文件的处所。 数据库有&#xff1a;Oracle数据库、ACCESS数…

代码随想录算法训练营第四十五天 | 力扣 70. 爬楼梯(进阶), 322. 零钱兑换, 279.完全平方数

70. 爬楼梯&#xff08;进阶&#xff09; 题目 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff…

【浅学 JDBC】

浅学JDBC 笔记记录 一、1. JDBC的概念2. JDBC快速入门2.1 DriverManager2.2 Connection2.3 Statement2.4 ResultSet 3. JDBC入门案例使用3.1 查询所有学生信息3.2 根据id查询学生信息&&新增学生信息&&修改学生信息&&删除学生信息 一、 1. JDBC的概念 …

中科易安8周年,与你相约联网智能门锁

中科易安与物联网技术发展同频 持续推动安防信息化建设 打造多场景应用的数智化通行解决方案 促进技术与安全精准对接 联网智能门锁技术硬核 中科易安打造集NB-IoT、Sub-1G Cat.1、Wifi、RS485和BLE 5.0 在内的六大通信技术组网方案 以“联网”赋能智能门锁 实现通行数…

C++11之atomic原子操作

atomic介绍 多线程间是通过互斥锁与条件变量来保证共享数据的同步的&#xff0c;互斥锁主要是针对过程加锁来实现对共享资源的排他性访问。很多时候&#xff0c;对共享资源的访问主要是对某一数据结构的读写操作&#xff0c;如果数据结构本身就带有排他性访问的特性&#xff0c…

chatgpt赋能python:Python中的等待:理解和优化

Python中的等待&#xff1a;理解和优化 Python是一种强大的编程语言&#xff0c;在构建各种应用程序时很常用。但是&#xff0c;随着应用程序越来越复杂&#xff0c;需要等待一些操作时&#xff0c;Python中的等待传统上会导致性能下降。在这篇文章中&#xff0c;我们将深入了…

可持续能源技术改变世界

文章目录 一、你在工作或生活中接触过可持续能源技术吗&#xff1f;可以分享下你的经历与看法。二、你认为可持续能源技术的优势和挑战有哪些&#xff1f;三、你了解过可持续能源技术的应用现状吗&#xff1f;四、对于可持续能源技术真的否改变世界这个问题你怎么看&#xff1f…

ifconfig工具与驱动交互解析(ioctl)

Linux ifconfig&#xff08;network interfaces configuring&#xff09; Linux ifconfig命令用于显示或设置网络设备。ifconfig可设置网络设备的状态&#xff0c;或是显示目前的设置。同netstat一样&#xff0c;ifconfig源码也位于net-tools中。源码位于net-tools工具包中&am…

《消息队列高手课》课程笔记(七)

如何使用异步设计提升系统性能&#xff1f; 异步设计如何提升系统性能&#xff1f; 假设我们要实现一个转账的微服务 Transfer(accountFrom, accountTo, amount)&#xff0c;这个服务有三个参数&#xff1a;分别是转出账户、转入账户和转账金额。 这个例子的实现过程中&…

chatgpt赋能python:Python中如何反转字符串:三种简单方法

Python中如何反转字符串&#xff1a;三种简单方法 当我们在处理字符串时&#xff0c;有时需要将其反向排列。在Python中&#xff0c;这可以通过以下三种简单方法实现&#xff1a; 1. 使用内置的切片方法 在Python中&#xff0c;可以使用字符串的切片方法将其反转。这种方法非…

(浙大陈越版)数据结构 第三章 树(上) 3.4 小白专场:树的同构(PTA编程题讲解)

题意理解和二叉树表示 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换变成T2&#xff0c;则称两棵树是“同构”的。 eg1&#xff1a;现请你判断如下两棵树&#xff08;左侧为T1&#xff0c;右侧为T2&#xff09;是否为同构树&#xff1f; 显然T1可以通过有限次左右孩子…

REST风格 -- SpringMVC入门保姆级教程(四)

文章目录 前言四、REST风格1.了解REST风格2.REST风格写法一般步骤3.REST风格快速开发4.REST风格中的注解5. 案例&#xff1a;基于REST风格页面数据交互 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#…

Redis高级篇 - 分布式缓存

分布式缓存 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c…

iPad触屏笔哪个牌子好用?Apple Pencil的平替笔

从无纸化的广泛使用&#xff0c;电容笔成为无纸化中不可替代的一部分。但由于原装电容笔的昂贵&#xff0c;市面上的电容笔品牌众多&#xff0c;不知如何下手&#xff0c;今天给大家推荐几款好用又平价的Apple Pencil平替笔。顺便给不知道如何挑选电容笔的小伙伴科普一下电容笔…

车载网络测试 - CANCANFD - 基础篇_02

目录 七、与CAN总线相关的标准 1、ISO 11898,ISO16845 2、SAE J1939,ISO 11783,NMEA 2000,CANopen 3、ISO15765/ISO14229 4、ISO 17356/OSEK 5、CCP(CAN Calibration Protocol) 6、GMLAN,VWTP,FNOS,DCNet,MCNet 八、CAN总线的特点 九、CAN总线基本概念 七、与CAN总线相…

机器学习-4 决策树算法

决策树算法 算法概述分类算法与分类器决策树算法树模型决策树的原理决策树算法的关键决策树构造的基本思路 算法基本思想决策树的训练与测试三种经典的决策树生成算法基于信息增益的ID3算法基于信息增益率的C4.5算法C4.5算法C5.0算法 基于基尼系数的CART算法 算法流程算法关键问…

chatgpt赋能python:Python中的包

Python中的包 对于使用Python进行编程的开发者来说&#xff0c;包是一个非常重要的概念。包可以看作是一个包含了多个模块的文件夹&#xff0c;这些模块可以在代码中使用。通过使用Python中的包&#xff0c;开发者可以使代码更加模块化&#xff0c;提高代码的可维护性和可读性…

Emacs之git操作(一百零五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…