本帖最后由 FPGA课程 于 2024-9-26 09:56 编辑
软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
1 概述 前文中我们掌握了 ZYNQ 的 SPI 控制器的使用,本文中通过动态驱动数码管进一步展示 SPI 控制器的使用。本文所用到的 74HC595 是一种常见的串并转换芯片,74HC595 支持级联,可以实现一个 SPI 接口扩展大量 IO。以下的示意图中,ZYNQ 需要提供 SPI 控制器的 MOSI 和 SCK 以及一个 LACH 信号,提供给 74HC595,通过 74HC595扩展了16 个 IO 动态驱动 4 位数码管。 实验目的: 1:阅读 74HC595 数据手册,掌握 74HC595 芯片的串并转换时序 2:熟悉数码管动态显示原理 3:通过 VITIS-SDK 以及 SPI 控制器完成对 74HC595 芯片串并转换,并且动态驱动数码管 2 系统框图
3 使用74HC595驱动数码管
3.1 数码管动态显示原理
如上图所示,为我们 4 位共阳极 7 位数码管的电路原理图,这里的数码管是共阳极驱动,所以当 74HC595 U2 的 QA、QB、QC、QD 控制数码管的阳极,也就是负责选通哪一个数码管点亮;而 74HC595 U1 控制显示具体的数值内容。动态显示的原理就是某一个时刻只显示 1 个数码管,对于我们人眼来说刷新率在 25hz 以上就会感觉所有数码管都是同时点亮的效果。 我们看到数码管的字母 abcdefgdp 代表的是数码意思呢?如下图所示,就是代表了每个 LED,当设置 abcdefgh 种任意位为 0 就是点亮数码管。所以我们可以得出一个表,用于显示相应的数值。
3.2 认识74HC595使用
1:74HC595的内部功能单元
我们先从 74HC595 内部的原理图看下芯片的功能。可以看到里面最关键功能单元是 8 个 D 触发器用于移位和另外8个D触发器用于数据的输出到功能 PIN 脚上。我们 SPI 接口的数据从 Serial input A 输入,并且通过 SHIFT CLOCK 每个时钟移位进入 74HC595 的触发器中,一个74HC595 支持 8bit IO 扩展,如果需要更多 IO,则可以通过74HC595 的级联输出到下一个 74HC595 芯片的输入。如上面图片所示,我们的为了动态驱动数码管,扩展了16个IO(其中有 4 个本例中没有用到)。比如本文中的例子,我们完成了 16bit 数据的移位,那么需要通过 LATCH CLK把数据从移位寄存器打入输出寄存器。 2:74HC595 驱动真值表
以上这张表是来源于 74HC595 的计数手册,笔者红线框出的部分就是我们需要设计的驱动时序要求。从中可 以看到,74HC595 工作需要设置复位管脚为高电平,并且设置 Output Enable 为低电平。第一个红框中数据在每个 shift Clock 的上升沿打入移位寄存器。在第二个红框中 Latch Clock 为上升沿的时候,数据从移位寄存器打入输出寄存器。 3:74HC595 关键的时序要求 另外我们需要了解下驱动时序,数据需要满足建立和保持时间。和我们 FPGA 的课程不一样,FPGA 的课程部分,SPI 控制器是自己设计的,所以需要自己设计时序,而 ZYNQ 的 SPI 控制器是已经做好了,一般只要 SCK 不是频率太高都能满足要求。 以下关于 74HC595 的两张时序表如下:
一张图如下:
4 硬件电路分析 注意:FEP 扩展卡有 1.8V 和 3.3V 之分,默认 MLK-H3_CZ08_7100使用 1.8V 版本 IO 的扩展卡。 以下是 74HC595 驱动数码管的硬件原理图
MLK_H3_CZ08-7100功能底板的 FEP 接口定义如下:
5 搭建 SOC 系统工程
详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建 SOC 工程的,请学习“01Vitis Soc 开发入门”这篇文章。
5.1SOC 系统工程
ZYNQ IP 中设置 SPI0
设置 SPI 的参考时钟,以及 PL 50M 时钟提供给 ILA 使用
ILA 设置
5.2 编译并导出平台文件
以下步骤简写,有不清楚的看第一篇文章。
1:单击 Block 文件→右键→Generate the Output Products→Global→Generate。
2:单击 Block 文件→右键→ Create a HDL wrapper(生成HDL 顶层文件)→Let vivado manager wrapper and auto-update(自动更新)。
3:添加配套工程路径下 uisrc/04_pin/fpga_pin.xdc 约束文件
4:生成 Bit 文件。
5:导出到硬件: File→Export Hardware→Include bitstream
6:导出完成后,对应工程路径的 soc_hw 路径下有硬件平台文件:system_wrapper.xsa 的文件。根据硬件平台文件
system_wrapper.xsa 来创建需要 Platform 平台。
6 搭建 Vitis-sdk 工程 创建 soc_base sdk platform 和 APP 工程的过程不再重复,如果不清楚请参考本章节第一个 demo。
6.1 创建 SDK Platform 工程
右击 soc_base 编译,编译的时间可能会有点长
6.2 创建 APP 工程
7 程序分析
由于对于 SPI 的驱动部分在前面文章中已经做了详细分析,所以我们这里不再重复。这里给出应用程序源码
- #include "spips.h"
- #include "xgpiops.h"
- #define GPIO_DEVICE_ID
- XPAR_XGPIOPS_0_DEVICE_ID
- #define hc595_lach (54)
- extern XSpiPs SpiInstance;
- extern u8 *ReadBuf ;
- extern u8 *SendBuf ;
- XGpioPs Gpio;
- //0~9 数码管对应的二进制码
- //zero = 0XC0
- //one = 0XF9
- //two = 0XA4
- //three= 0XB0
- //four = 0X99
- //five = 0X92
- //six = 0X82
- //seven= 0XF8
- //eight= 0X80
- //nine = 0X90
- u8 dpy_val[10]= {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
- void gpio_init()//初始化GPIO
- {
- XGpioPs_Config *ConfigPtr;
- ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
- XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);
- XGpioPs_SetDirectionPin(&Gpio, hc595_lach, 1);
- XGpioPs_SetOutputEnablePin(&Gpio, hc595_lach, 1);
- XGpioPs_WritePin(&Gpio, hc595_lach, 0x1);
- }
- int main(void)
- {
- int dpy_n = 0;
- gpio_init();
- SpiPs_Init(&SpiInstance,SPI_DEVICE_ID);
- while(1)
- {
- switch(dpy_n)
- {
- case 0:
- SendBuf[0] = 0x08;//8'b00001000;动态驱动第4位数码管的值
- SendBuf[1] = dpy_val[0];
- break;
- case 1:
- SendBuf[0] = 0x04;//8'b00000100; 动态驱动第3位数码管的值
- SendBuf[1] = dpy_val[1];
- break;
- case 2:
- SendBuf[0] = 0x02;//8'b00000010; 动态驱动第2位数码管的值
- SendBuf[1] = dpy_val[2];
- break;
- case 3:
- SendBuf[0] = 0x01;//8'b00000001; 动态驱动第1位数码管的值
- SendBuf[1] = dpy_val[3];
- break;
- default:
- SendBuf[0] = 0x0;
- SendBuf[1] = 0x0;
- break;
- }
- XGpioPs_WritePin(&Gpio, hc595_lach, 0x0); //595芯片的lach信号设置低电平
- SpiPs_Send(&SpiInstance,SendBuf,2); //SPI发送数据
- XGpioPs_WritePin(&Gpio, hc595_lach, 0x1); //595芯片的lach信号设置高电平更新数据到595的IO
- if(dpy_n < 3) //完成显示器的动态切换
- dpy_n++;
- else
- dpy_n = 0;
- }
- return 0;
- }
复制代码
以上代码中实现了动态点亮数码管,通过在线逻辑分析仪可以查看我们的 SPI 驱动时序。
8 实验结果
8.1 硬件准备 本实验需要用到 JTAG 下载器、USB 转串口外设,另外需要把核心板上的 2P 模式开关设置到 JTAG 模式,即ON ON(注意新版本的 MLK_H3_CZ09_7035),支持 JTAG 模式,对于老版本的核心板,JTAG 调试的时候一定要拔掉TF卡,并且设置模式开关为 OFF OFF)
8.2 实验结果
|