如何使用Basys3板创建一个简单的示波器
来源:互联网发布者:无人共我 关键词: fpga 更新时间: 2024/03/01
该项目将大家一起使用Basys3板创建一个简单的示波器,花费时间约4小时。
硬件组件
Digilent Basys 3
软件应用程序和在线服务
Xilinx Vivado 设计套件
Xilinx Vitis 统一软件平台
项目介绍
Digilent Basys3 板是一款功能强大的板,可用于开始开发 FPGA 项目。它为用户提供了一个 Artix 35T 设备、USB-UART、四个 Pmod——包括一个为 XADC 配置的 Pmod、12 位 VGA 和开关、LED 和七段显示器。
该项目旨在演示 Basys3 板的功能,为此我们将创建一个简单的示波器,它可以使用 XDAC Pmod 输入通道和 VGA 显示器来显示波形。
为此,我们将使用 MicroBlaze 控制器来运行应用程序并控制 XADC 的测量,并确定在 VGA 屏幕上绘制数据的位置。
VGA 显示器将是 640 x 480,12 位 RGB 在软件内存中渲染需要 3、686、400 位。这超过了 FPGA 中可用的 1、800、000 位 BRAM。处理器也无法以能够达到所需帧速率所需的速度运行。
我们将通过使用处理器来确定数据点图来解决这个问题,同时逻辑渲染帧以实时显示。为此,我们将使用我们首先创建的高级综合核心。
高级综合核心
开始时要重新创建一个 HLS 核心,它可以在 VGA 显示器中绘制多达 10 个样本(当然,您可以稍后更改)。HLS 内核将生成一个 640 像素 x 480 行的 AXI 流。为了更新每一帧的显示,将有定义样本数据位置的 sample_x / _y 寄存器、定义数据点大小的寄存器和定义数据点颜色的最终寄存器。
创建 HLS 流需要使用 ap_fixed.h 和 hls_video.h 库进行简单定义。
我们将有一个 32 位像素,其中包括每个 RGB 的 8 位,还有一个用于混合的 8 位 alpha 通道。
hud.h 文件包括以下几行
#include "hls_video.h" #include |
虽然代码的主体看起来像
#include "hud.h" //#include "char.h" void hud_gen(axis& op, int row, int column, int plot_x_1, int plot_y_1, int plot_x_2, int plot_y_2, int plot_x_3, int plot_y_3, int plot_x_4, int plot_y_4, int plot_x_5, int plot_y_5, int plot_x_6, int plot_y_6, int plot_x_7, int plot_y_7, int plot_x_8, int plot_y_8, int plot_x_9, int plot_y_9, int plot_x_10, int plot_y_10, int plot_x_11, int plot_y_11, int plot_x_12, int plot_y_12, int plot_x_13, int plot_y_13, int plot_x_14, int plot_y_14, int plot_x_15, int plot_y_15, int plot_x_16, int plot_y_16, int plot_x_17, int plot_y_17, int plot_x_18, int plot_y_18, int plot_x_19, int plot_y_19, int plot_x_20, int plot_y_20, int plot_size, uint32_t plot_colour ) { #pragma HLS INTERFACE s_axilite port=return #pragma HLS INTERFACE s_axilite port=plot_y_1 #pragma HLS INTERFACE s_axilite port=plot_x_1 #pragma HLS INTERFACE s_axilite port=plot_y_2 #pragma HLS INTERFACE s_axilite port=plot_x_2 #pragma HLS INTERFACE s_axilite port=plot_y_3 #pragma HLS INTERFACE s_axilite port=plot_x_3 #pragma HLS INTERFACE s_axilite port=plot_y_4 #pragma HLS INTERFACE s_axilite port=plot_x_4 #pragma HLS INTERFACE s_axilite port=plot_y_5 #pragma HLS INTERFACE s_axilite port=plot_x_5 #pragma HLS INTERFACE s_axilite port=plot_y_6 #pragma HLS INTERFACE s_axilite port=plot_x_6 #pragma HLS INTERFACE s_axilite port=plot_y_7 #pragma HLS INTERFACE s_axilite port=plot_x_7 #pragma HLS INTERFACE s_axilite port=plot_y_8 #pragma HLS INTERFACE s_axilite port=plot_x_8 #pragma HLS INTERFACE s_axilite port=plot_y_9 #pragma HLS INTERFACE s_axilite port=plot_x_9 #pragma HLS INTERFACE s_axilite port=plot_y_10 #pragma HLS INTERFACE s_axilite port=plot_x_10 #pragma HLS INTERFACE s_axilite port=plot_y_11 #pragma HLS INTERFACE s_axilite port=plot_x_11 #pragma HLS INTERFACE s_axilite port=plot_y_12 #pragma HLS INTERFACE s_axilite port=plot_x_12 #pragma HLS INTERFACE s_axilite port=plot_y_13 #pragma HLS INTERFACE s_axilite port=plot_x_13 #pragma HLS INTERFACE s_axilite port=plot_y_14 #pragma HLS INTERFACE s_axilite port=plot_x_14 #pragma HLS INTERFACE s_axilite port=plot_y_15 #pragma HLS INTERFACE s_axilite port=plot_x_15 #pragma HLS INTERFACE s_axilite port=plot_y_16 #pragma HLS INTERFACE s_axilite port=plot_x_16 #pragma HLS INTERFACE s_axilite port=plot_y_17 #pragma HLS INTERFACE s_axilite port=plot_x_17 #pragma HLS INTERFACE s_axilite port=plot_y_18 #pragma HLS INTERFACE s_axilite port=plot_x_18 #pragma HLS INTERFACE s_axilite port=plot_y_19 #pragma HLS INTERFACE s_axilite port=plot_x_19 #pragma HLS INTERFACE s_axilite port=plot_y_20 #pragma HLS INTERFACE s_axilite port=plot_x_20 #pragma HLS INTERFACE s_axilite port=column #pragma HLS INTERFACE s_axilite port=row #pragma HLS INTERFACE s_axilite port=plot_size #pragma HLS INTERFACE s_axilite port=plot_colour #pragma HLS INTERFACE axis register both port=op int i = 0; int y = 0; int x = 0; //int bar_pos_x = 10; //int bar_width = 30; video_stream hud_int; row_loop:for (y =0; y |
请注意我如何使用两个循环在流中创建图像的 X 和 Y 元素。在内部循环中,我们处理 TUser 和 TLast 信号上的帧开始和行尾边带信号。
下一步是使用 C 来模拟电路,以确保行为符合我们的要求
创建的测试台可用于 C 和 Co 仿真
#include "hud.h" #include |
运行 C 模拟为我们提供了一个 BMP 图像,它应该展示绘制的点
在此示例中,数据点是绘制的白点。
在性能满意的情况下,下一步是综合和封装IP块以用于新的Vivado项目。
在HLS综合之后,预测的资源使用情况为
现在我们有了IP块,我们将能够将其添加到我们的项目中并开始Vivado设计。
Vivado设计
要开始使用Vivado设计,我们需要将以下IP添加到针对Basys3板创建的新项目中。
MicroBlaze-64KB数据和指令存储器
AXILiteUART
视频时序控制器-仅配置为生成
视频测试模式生成器-最大行数和列数800、800
XADC-启用Vaux6、7、14和15
时钟向导-20MHz(MicroBlaze)、25.175MHz(像素时钟)、50MHz(逻辑时钟)
视频混合器-最大行数和列数800、800
视频轴到视频输出
之前在HLS中创建的HUDIP
GPIO连接到按钮-光标的未来扩展
创建框图时,利用块自动化来配置MicroBlaze-添加内存、调试和休息结构。还利用连接自动化来连接AXI互连。
显示界面视图时,端图将类似于下图。
完整的设计如下
我会将完整的设计放在我的github上进行探索和修改。
图像路径将先前创建的HLSIP与TPG合并(允许设置背景颜色)。这些使用视频混合器核心合并,该核心使用alpha混合合并两个流。
生成的输出流被转换回并行视频输出格式Pixel、VSync、HSync等,为640、480显示器定时。AXIStream到视频的时序由视频时序发生器控制。
在这种方法中,软件应用程序可以使用TPG设置背景并使用HLSIP定义绘图。
为了确保设计适用于所有VGA显示器,我们需要确保RGB信号在消隐期间为0。
因此,我使用了一个与门逻辑IP块,该IP块由AXI流提供的视频输出启用门控到视频输出块。Basys3上的VGA输出使用每个通道RGB的3个输出。为了提供可重复使用的设计,我们使用了在设计中更常见的8位像素,以允许移植到不同的板上。
该项目使用的XDC如下
##7 segment display set_property PACKAGE_PIN W7 [get_ports {seven_seg[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg[0]}] set_property PACKAGE_PIN W6 [get_ports {seven_seg[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg[1]}] set_property PACKAGE_PIN U8 [get_ports {seven_seg[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg[2]}] set_property PACKAGE_PIN V8 [get_ports {seven_seg[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg[3]}] set_property PACKAGE_PIN U5 [get_ports {seven_seg[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg[4]}] set_property PACKAGE_PIN V5 [get_ports {seven_seg[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg[5]}] set_property PACKAGE_PIN U7 [get_ports {seven_seg[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg[6]}] #set_property PACKAGE_PIN V7 [get_ports dp] #set_property IOSTANDARD LVCMOS33 [get_ports dp] set_property PACKAGE_PIN U2 [get_ports {seven_seg_led_an[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg_led_an[0]}] set_property PACKAGE_PIN U4 [get_ports {seven_seg_led_an[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg_led_an[1]}] set_property PACKAGE_PIN V4 [get_ports {seven_seg_led_an[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg_led_an[2]}] set_property PACKAGE_PIN W4 [get_ports {seven_seg_led_an[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {seven_seg_led_an[3]}] set_property PACKAGE_PIN W5 [get_ports sys_clock] set_property IOSTANDARD LVCMOS33 [get_ports sys_clock] #create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk] ##VGA Connector set_property PACKAGE_PIN G19 [get_ports {vgaRed[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[0]}] set_property PACKAGE_PIN H19 [get_ports {vgaRed[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[1]}] set_property PACKAGE_PIN J19 [get_ports {vgaRed[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[2]}] set_property PACKAGE_PIN N19 [get_ports {vgaRed[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaRed[3]}] set_property PACKAGE_PIN N18 [get_ports {vgaBlue[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[0]}] set_property PACKAGE_PIN L18 [get_ports {vgaBlue[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[1]}] set_property PACKAGE_PIN K18 [get_ports {vgaBlue[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[2]}] set_property PACKAGE_PIN J18 [get_ports {vgaBlue[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaBlue[3]}] set_property PACKAGE_PIN J17 [get_ports {vgaGreen[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[0]}] set_property PACKAGE_PIN H17 [get_ports {vgaGreen[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[1]}] set_property PACKAGE_PIN G17 [get_ports {vgaGreen[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[2]}] set_property PACKAGE_PIN D17 [get_ports {vgaGreen[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {vgaGreen[3]}] set_property PACKAGE_PIN P19 [get_ports Hsync] set_property IOSTANDARD LVCMOS33 [get_ports Hsync] set_property PACKAGE_PIN R19 [get_ports Vsync] set_property IOSTANDARD LVCMOS33 [get_ports Vsync] set_property DRIVE 8 [get_ports {vgaBlue[3]}] set_property DRIVE 8 [get_ports {vgaBlue[2]}] set_property DRIVE 8 [get_ports {vgaBlue[1]}] set_property DRIVE 8 [get_ports {vgaBlue[0]}] set_property DRIVE 8 [get_ports {vgaGreen[3]}] set_property DRIVE 8 [get_ports {vgaGreen[2]}] set_property DRIVE 8 [get_ports {vgaGreen[1]}] set_property DRIVE 8 [get_ports {vgaGreen[0]}] set_property DRIVE 8 [get_ports {vgaRed[3]}] set_property DRIVE 8 [get_ports {vgaRed[2]}] set_property DRIVE 8 [get_ports {vgaRed[1]}] set_property DRIVE 8 [get_ports {vgaRed[0]}] set_property DRIVE 8 [get_ports Hsync] set_property DRIVE 8 [get_ports Vsync] set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub] set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub] set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub] connect_debug_port dbg_hub/clk [get_nets clk] |
完成后,可以构建应用程序并导出 XSA。
资源使用
软件开发
软件的开发很简单,生成的 HLS IP 内核带有用于 SW 开发的驱动程序。
软件应用程序必须执行以下操作
初始化 XADC
初始化 TPG
初始化混音器
初始化视频时序控制器
初始化 HLS IP
设置混合器以混合两个 640 x 480 流
设置 TPG 以输出所需的背景颜色
为 640 x 480 时序设置视频时序控制器
循环读取 XADC 并更新
应用代码如下
#include |
当输出时,这会提供一个漂亮的彩色显示,作为 VGA 显示的基本范围。
另外,我们可以创建一个简单的项目来展示如何在VGA输出上绘制点。
未来的改进方向可能如下:
添加标签和标记
添加光标以在屏幕上报告样本值
点之间的线绘制
当然,我们需要注意所需的逻辑资源,因为这个项目对设备资源的要求很高。
这里还没有内容,您有什么问题吗?
电子电路资源推荐
- BOSCH汽车电气与电子 [(德)莱夫 主编] 2014年版
来源:下载中心
- 汽车发动机电控系统原理与维修
来源:下载中心
- 开关电源中的磁性元件
来源:大学堂
- 逆变器原理
来源:大学堂
- 电路的基本物理量:电流,电压,电位,电动势,电功率
来源:电路图
- PCB板基础知识讲解
来源:电路图
推荐帖子 最新更新时间:2024-11-13 09:03
- ADI实验室电路
- ADI实验室电路 下载 ADI实验室电路 还有很多实例怎么上传不了了,该点哪里?? 慢慢传别急 这些datasheet中都会给出的! 什么电路都不说明下,光搞个数字做标题 支持一下! DING !!!!! 看看!!! 支持一下! 看看,还好不要钱。 支持一下下 支持
- zhang5157098ADI参考电路
- 请问stm32f10x单片机的RTC设计时注意事项,应有遇同样问题的
- 我是按照开发板上的电路进行设置的 1.vbat供电 采用备份电池和3.3电源电源均经过二极管后接到vbat引脚; 2.晶振采用32.768Khz石英晶振,起振电容采用20uF;距单片机引脚很近 电路板我进行了两次设计,第一次时外部晶振能够进行工作。第二次时同样电路外部不能工作
- yuni97stm32/stm8
- 单对以太网在楼宇自动化中的应用
- 以太网已成为楼宇自动化中控制金字塔顶端的主流通信协议。电气和电子工程师协会( IEEE )最近定义了一种新型以太网标准 IEEE 802.3.cg , 用于10 Mb/s 的操作以及通过 一 对平衡导体进行的功率传输。由于单对电缆现在可同时支持数据和电源
- alan000345微控制器 MCU
- 关于硬件的一些问题。。。谢谢大家啦。
- 1,关于AMI 的BIOS 的一些详细介绍。(链接就好啦)或者简单的说一些资料,让我能够更好的理解BIOS的概念就可以了。 2,计算机专用英语。(能够包括计算机的BIOS的数据,一些常用的网络,软件的英文含义) 3,IDE并口硬盘中,可以有主盘和副盘。(具体怎么分的?) 4,今天
- crab0918嵌入式系统
- 【C2000 LaunchPad】打造自己的C2000 LaunchPad项目
- 打造自己的 C2000 LaunchPad 项目 TI 的例程中, V200 以后内部资源的控制,是以库的形式 给出: driverlib.lib ,对库的使用,有说明文档 f2802x-DRL-UG.pdf 。 本项目不使用它的 LIB 文件,这样的
- dontium微控制器 MCU
- 如何验证pci总线
- 各位大侠神仙,小弟目前在设计一带有PCI接口的板卡。有时发数据正确,有时又错误。请教各位如何验证PCI接口功能是否正常?有没有有效的数据域测试方法,可以验证PCI接口无论发送何种数据都不会出错?或者有没有逻辑分析仪或总线分析仪之类的仪器可以辅助完成这一测试? 如何验证pci总线
- bomb_82测试/测量
- 编写无错C程序秘诀
- TMS320VC33的FLASH在线编程方法
- MSP430新一代单片机,实用!
- 请教修改.RC文件 或者 做过开机密码问题的高手!
- dxp2004 原理图有好多问题·请大侠指教
- 影响电源寿命器件,还是要知道一下
- 控制开关
- Qorvo 电源技术站精选推荐,助力您的设计!
- 8成新JENNIC 5139开发套件,市场价5000,现价1600急售
- arm学习报告一二三 非常经典!!
- PCB的另类“伟大”设计!美少女PCB、LED 超短裙
- I2C简介:互联网不会告诉您的事情
- 新手求助CM. 01Z Z5U 1KV具体代表的什么?
- 关于CASIOdt-930m51e的问题
- STM32实现每个一秒串口发数据同时不断输出方波
- 如何用stm32串口接收中断接收一帧数据?
- KW41Z开箱及导入SDK的问题
- EEWORLD大学堂----更安全高效使用锂离子电池 - 电池管理系统 (BMS) 方案
- 供应知名牌子电子产品,电源等
- CMOS集成电路设计手册