基于FPGA的DDS设计方案(一)
DDS基本结构框图主要由参考频率源、相位累加器、ROM查找表、DAC转换器、低通滤波器等构成。
相位累加器以一定的步长做累加, 而波形函数存储在ROM查找表中, 将相位累加器输出的相位值作为地址,寻找存储在ROM查找表中的波形函数的幅度值,从而完成相位到幅值的转换。其中,参考频率源一般是一个晶体振荡器,要求具有高稳定性,用于DDS中各部件之间的同步。
上图为DDS Core结构图,∆θ是相位增量(对应图1中的频率控制字K),B∆θ 为相位累加器的位数,clk是参考时钟(对应图1中的参考频率源),A1、D1构成积分器(相位累加器),θ(n)是相位累加器输出的相位,Q1为量化器,用于将相位累加器位数与查找表地址之间的匹配,ϑ(n)为查找表输入地址,Bϑ(n) 为查找表输入地址位数,T1为查找表。
下面介绍DDS设计过程中常用到的公式,主要是输出频率公式及其变形。
For example:
设计一个参考时钟为100MHz,频率分辨率要求能够达到0.03Hz,输出sin信号频率为5.00000005MHz、查找表地址12位;
理论分析:
已知频率分辨率∆f与参考时钟f_clk,带入相位累加器位数公式计算
由于位数为整数,取整数32,所以实际的频率分辨率为
将其带入相位增量公式计算,取整数
相位累加器输出32位,而查找表输入地址为12位,取相位累加器高12位作为查找表输入地址
使用matlab产生sin(θ)数据,θϵ[0,π],点数为2^12=4096,并保存在FPGA的memory中。
相位累加器就是一个积分器,很容易用FPGA实现。最终FPGA仿真结果如下,clk为参考时钟,phase为相位累加器输出,addr为查找表地址,cos_i、sin_q为信号输出:
上述已经对DDS理论进行了详细概述,利用Xlinx DDS IP实现上述例子相对容易的多,只需要填入对应的参数信息。
需要注意的是,输入相位端口S_AXIS_PHASE与输出信号端口M_AXIS_DATA的格式,通过设计界面的Information查看,CHAN_0_POFF为初始相位,没有特殊要求一般设置为0,CHAN_0_PINC为相位增量∆θ。
仿真结果如下图所示:
DDS用途非常广泛,后续会利用Xlinx DDS IP设计一些有趣的信号,例如线性调频信号、非重复扫描系统等。
学号:17020110019 姓名:高少魁
【嵌牛导读】2048游戏在网页端与移动端均可以使用,本设计将该游戏移植到了硬件平台FPGA上,使用Digilent Nexys 4 DDR 开发板,使用Xilinx Vivado 用于搭建基于MicroBlaze 软核处理器的硬件运行环境,“2048”游戏主程序和VGA 显示控制等程序的编写在Xilinx SDK 上进行。游戏必需的上、下、左、右方向控制,在物理上由开发板上的按键实现,在软件层面通过查询方式实现。最终,嵌入式系统的运行结果将输出到显示屏上,包含4×4 棋盘方格、游戏得分和游戏结果。
【嵌牛鼻子】FPGA VGA 最小嵌入式系统 软核CPU
【嵌牛正文】
一、硬件设计
系统设计的整体电路框图如图所示
硬件部分由基于MicroBlaze 软核处理器的最小嵌入式系统和外围的输入输出模块构成。最小嵌入式系统以MicroBlaze 软核处理器、时钟模块(Clocking Wizard)、处理器系统复位模块(Processor System Reset)、调试模块(MicroBlaze Debug Module,MDM)、内置存储(LocalMemory)和外置存储接口模块(Memory Interface Generator,MIG)为核心,以AXI 总线互联模块(AXI Interconnect)作为处理器与外设的通信基础,以直接或间接挂载于其上的AXI 中断控制器(AXI Interrupt Controller)和中断请求集成器(Concat)作为中断信号的数据通路。
外围输入输出模块包括以下若干部分,它们均通过AXI 总线与处理器通信。UART 模块(AXI Uartlite)实现嵌入式系统与计算机的调试通信,GPIO 模块(AXI GPIO)实现按键输入,TFT 模块(AXI TFT Controller)把系统运行结果通过VGA 接口输出。
由于软件部分需要存储大量的图片资源,且TFT 模块要求显存不少于2MB,而处理器的内置存储空间不足,故使用MIG 模块以使用外置DDR2 存储。硬件系统共需要有三种不同频率的时钟信号:处理器需要100MHz 时钟、MIG 模块需要200MHz 时钟、TFT 模块需要25MHz 时钟,故Clocking Wizard 输出三路时钟。
要把上述嵌入式系统在FPGA 上实现,需要添加管脚约束。共有三处需要添加约束:时钟信号输入、GPIO 模块的按键输入和TFT 模块的VGA 接口输出。前两处在添加相应IP 核时以完成约束,TFT 模块的约束需要手动完成,即把红、绿、蓝三通道颜色信号和行、场同步信号约束到VGA 端子上。
二、软件设计
1.图片素材
嵌入式系统的运行结果,即“2048 ”游戏的状态需要以图形的方式输出到显示屏,因此需要把所有可能显示的较为复杂的内容预先制作好并存储起来。这些内容包括2~ 65536 共16个数字方块、用于显示得分的 0~ 9 这十个数字 、“得分”提示语 和游戏给出的“赢”和“输”的提示信息,均使用 Adobe Photoshop制作。然后,利用 Image 2 Lcd 工具软件把图片输出为 C 语言格式的数组备用。
2.主程序部分
主程序实现的功能为:配置硬件工作参数 、调用 VGA 显示部分的函数来显示两幅静态页面 、初始化游戏、初始化屏幕显示和 识别用户输入的控制信号并传输给游戏核心部分。
硬件工作参数包括GPIO 通道的数据传输方向 、 显存基地址 和 TFT 扫描方式 。 GPIO 用于获取用户输入的控制信息,因此方向为输入 TRI 寄存器的值配置为 0 x1F 。显存基地址为0x 87 E 00000 ,大小为 2MB ,该信息写入 AR 寄存器 。 TFT 显示控制器的工作参数为从左到右扫描、开启显示输出,相应地把 0x 1 写入 CR 寄存器。
程序开始执行时,首先调用VGA 显示部分的两个函数分别 2~ 65536 共 16 种不同数字方格的棋盘。 然后,调用函数开始一局新游戏并在屏幕上预先绘制好不需要更新的棋盘区域底框、“得分”提示信息和显示分数的区域的底框。 主程序使用查询的方式不断获取 GPIO 寄存器提供的用户输入信息。当有输入时,调用游戏核心部分的函数更新“棋盘”信息。
3.VGA显示部分
该部分程序按照一定的规则向显存写入数据以在显示屏上显示不同的内容。这些内容包括 2~ 65536 共 16 种数字方格的棋盘、得分信息、游戏进行时的棋盘和提示信息。
2~ 65536 共 16 种数字方格的棋盘在程序刚开始执行时显示,每幅画面大约显示 5 秒,用软件延时粗略控制。随着游戏的进行, VGA 显示部分不断读取“棋盘”,并把代表相应数字的图片绘制到显示器上。同时,它还读取得分信息,并绘制到预先设定的位置。如果“棋盘”上出现了“ 2048 ”,它输出“赢”的提示信息。如果“棋盘”上的方格均不能移动且没有出现“ 2048 ”,则显示“输”的提示信息。
4.游戏核心部分
游戏核心部分主要涉及对“棋盘” 的处理 ,程序把它抽象为 4 × 4 的二维数组。这部分的功能包括: 游戏初始化、 方块四个方向 的移动和合并策略、向棋盘添加一个新的方块、检查游戏的状态、计算得分和获取游戏的状态信息。
游戏初始化把得分清零,并向棋盘添加两个数字。方块四个方向的移动和合并策略与我们之前体验过的2048 游戏完全一致。方块移动后,“棋盘”上一定会增加一个新的方块,可能是2 或 4 ,概率为 9:1 。之后,程序检查“棋盘”上是否出现过 2048 。如果出现过(“棋盘”上至少有一个不小于“ 2048的方格),则游戏结束,通知 VGA 绘图部分显示“赢”的提示信息。如果没有出现过,则检查棋盘上的空余位置数量数量以以及方块是否还能移动。如果没有空余位置且方块不能继续移动,及方块是否还能移动。如果没有空余位置且方块不能继续移动,则游戏失败,通知则游戏失败,通VGA显示部分显示部分输出“输”的提示信息。接下来,输出“输”的提示信息。接下来,程序将通知程序将通知VGA显示部显示部分更新“棋盘”和得分的显示。分更新“棋盘”和得分的显示。
三、设计运行效果
运行效果如下图
写了用以太网传输的优点,相对于串口的传输速度慢,并且不能远距离传输。PCIE不能远距离传输,选择以太网兼顾了传输速率和系统使用灵活的特点。
选择的Xilinx公司的xc7vx485T的FPGA开发板VC707的优点
1、集成了MAC硬核和SGMII接口,可以完成MAC层功能和PHY层接口的实现。
2、集成了PHY层芯片,可以完成PHY层的功能。
3、集成了1gb的DDR3资源,可以缓存数据。
总得设计方案如图所示,其中MAC层与PHY层的SGMII接口可以直接调用IP来实现。
接收模块
接受上机位的ARP请求,提取上位机的MAC地址和IP地址,以及接收上位机的UDP数据包,并提取报文。
发送模块
发送ARP应答给上位机,封装要发送的数据,加上UDP首部,IP首部以及以太网帧首部,并发送给MAC层的ip核。
DDR3控制模块
将接收FIFO中的数据存入DDR3中,在发送时,从DDR3中读出到发送FIFO。
发送/接受FIFO
以太网工作时钟为125 MHZ,DDR3工作时钟为200MHZ,利用这两个FIFO来解决跨时钟域问题。
MAC层IP核
完成以太网帧的前导码、帧起始定界符的封装以及解封。
具体的工作流程:系统在发送数据时,将 DDR3中的数据通过发送逻辑以及 MAC层IP核进行数据封装,再 通 过 SGMII接 口IP核输出数据送入 PHY 芯片,在PHY 层完成数据编码后经由 RJ45接口发送给上位机;而系统接受数据就是发送数据的逆过程,上位机发送的数据经过 RJ45接口到达 PHY 芯片,在 PHY 层完成解码后通过 SGMII接口将收输出数据
送入 MAC层IP核以及接收逻辑模块,完成数据提取或指令执行的工作,并将数据存入 DDR3。
后面介绍了ARP协议,IP协议和UDP协议就不多讲了。
ARP是为了得到目的MAC地址,才能将IP和UDP正确发送到目的。
这个模块主要是为区分接收到的是ARP还是UDP模块。
鉴别ARP有三点:
1、判断目的MAC地址是否为FF-FF-FF-FF-FF-FF
2、判断帧类型是否为0x0806
3、判断操作码是否为1
是的话就产生ARP_request信号,并提取出上位机的MAC地址和IP地址,输出到ARP处理模块中。
当判断是否为UDP时:
1、IP数据报首部协议字段是否为0x11
2、ip报部分的目的IP地址是否和本地地址一样
3、udp首部的目的端口号是否和本地的端口号一样
若判断通过,就将UDP数据存入接收FIFO中,同时记录数据长度为frame_cnt。
要发送的数据有两种,即ARP应答,以及DDR中读出的数据封装成UDP协议的MAC帧数据。
状态机如图所示。
1、ARP处理模块输出ARP_reply时,进入ARP应答帧状态,当应答完成后,进入空闲状态,其中ARP处理模块需要提供给应答状态上位机的MAC地址,IP地址。
2、当状态机检测到DDR_RD_CPL信号时,就是当DDR3有数据存入发送FIFO时,开始添加MAC头,IP头、udp头,最后读出FIFO里的数据,状态机进入空闲状态。
最后是一些计算,因为目的,源MAC、ip和端口号都变了,所以需要重新计算IP校验和,UDP校验和,统计数据长度,并将结果封装到数据包中去。
最后新收获是,在全双工模式下,以太网帧的数据长度不能超过1500字节,再减去IP首部20字节,udp首部8字节,因此udp数据长度应该小于1472字节。
ASIC是专用集成电路,是已经设计好的具有特殊功能的专用芯片,功能设计不可更改,现在很多ASIC设计前期都会用到FPGA做验证
学号:19020100037
学院:电子工程学院
嵌牛导读:对卷积神经网络的加速的研究。
嵌牛鼻子:计算机软件及计算机应用自动化技术。
嵌牛提问:如何设计卷积神经网络的加速系统?
嵌牛内容:
近年来,卷积神经网络(CNN)在机器视觉等方面取得了巨大成功。为提升嵌入式设备上运行CNN的速度和能效,本文针对LeNet-5网络模型,先对该网络模型进行感知量化训练,特征图和权重量化为8位整型数据。然后设计一种卷积神经网络加速器系统,该片上系统(SoC)采用Cortex-M3为处理器,所提出的系统处理一张MNIST图像所需时间5.3ms,精度达到98.2%。
近年来,卷积神经网络(CNN)在机器视觉等方面取得了巨大成功。为提升嵌入式设备上运行CNN的速度和能效,本文针对LeNet-5网络模型,先对该网络模型进行感知量化训练,特征图和权重量化为8位整型数据。然后设计一种卷积神经网络加速器系统,该片上系统(SoC)采用Cortex-M3为处理器,所提出的系统处理一张MNIST图像所需时间5.3ms,精度达到98.2%。CNN已成功应用于图像识别等应用,随着CNN解决更复杂的问题,计算和存储的需求急剧增加。然而,在一些低功耗的边缘计算设备中,功耗是重要指标。目前的研究主要针对CNN推理阶段模型的压缩和量化。大多数设计都用定点计算单元代替浮点单元。ESE采用12位定点权重和16位定点神经元设计,Guo等在嵌入式FPGA上使用8位单元进行设计。但之前的设计主要采用Zynq或者HLS开发,功耗较大。本文设计了一种基于FPGA的卷积神经网络加速系统。首先,通过感知量化训练的方法,实现了将浮点CNN模型的各层权重和特征图量化成8比特整型;其次,通过采用单层时分复用的方式,设计流水线架构提高数据吞吐率;再次,设计基于Cortex-M3的SoC;最后,采用MNIST手写数字进行方案和功能验证。
1 卷积神经网络
1.1 基本概念
LeNet-5是一个典型的卷积神经网络模型,不包含输入一共有7层。分别为3层卷积层,2层池化层,以及2层全连接层。
1.2 量化原理
针对目前CNN模型较大,参数多且不适合在移动设备上使用,Google团队提出了一种量化方案。该方案在推理过程中使用纯整。量化方案是量化整数q到实数r的映射,如公式(1)所示:
其中常数S和Z是量化参数。S表示比例系数,是一个任意的正实数。Z表示零点。CNN中主要的操作,比如卷积层的卷积,以及全连接层的乘累加,都可以看成是矩阵乘法。考虑实数两个N×N的矩阵r1和r2的乘积r3 =r1r2。将每个矩阵ra的项表示为ra(r,j),其中1≤ i, j ≤N,用qa(r,j)表示量化项,根据矩阵乘法的定义,得到:
乘以浮点数M,可以转化成先乘以定点数M1,再进行右移n+31。将公式(2)中所有零点Z1,Z2,Z3都设为0,可以大大简化推理阶段的运算。另外将偏置加法和激活函数合并到其中。比例系数Sbias=S1S2,零点Zbias= 0。由于选用的激活函数是ReLU,所以只需要将结果钳位到[0,255]。
2 加速系统硬件设计
2.1 整体结构
本系统采用CPU+FPGA的架构,包括AHB互联矩阵、Cortex-M3处理器、DMA、紧耦合存储器、双端口缓存、AHB2APB桥和CNN加速器,如图1所示。存储器部分包含ITCM,DTCM和双端口RAM。ITCM存放程序镜像文件;DTCM作为堆栈区;DualRAM作为权重数据,输入特征图,以及中间、最终结果缓存区,一端连接L1级总线,CPU和DMA均可以访问,另一端连接CNN加速器。
2.2 CNN加速器设计
CNN加速器设计的整体结构如图2所示,并行方案采用输出通道和权重卷积核内部并行,同时计算6个输出通道,以及卷积核25个乘法器同时计算。特征图行缓冲的窗口尺寸为5x5,可以通过数据选择器选择输入特征图的宽度。权重特征图的行缓冲设计同理,由于卷积核均为5x5,所以不需要数据选择器。乘累加阵列输入为25个8位特征图和25个8位权重,对应相乘后采用加法树方式累加,最后得到1个位宽为21的有符号数。偏置加法器用于累加偏置或者中间结果。选择哪一个是由数据选择器控制,输出一个32位结果。量化激活模块包含一个32x32位的乘法器,用于将累加结果和乘法系数相乘,再经过右移,钳位到[0,255],经过四舍五入得到量化的结果。
3.2 实验结果
本文的SoC工作的频率为100MHz,识别一张MNIST图片的时间为5.3ms,FPGA的功耗由Vivado的Report Power工具获得,仅为0.448W。本文处理单帧的时间比较长,但是功耗是其他文献的四分之一。由于采用感知量化,识别正确率FPGA实现和软件实现一致,达到98.2%。实验结果对比如表1所示。结论:为了解决嵌入式设备上实现卷积神经网络速度慢和功耗大的问题,本文提出了一种卷积神经网络加速系统。首先对卷积神经网络进行感知量化,得到8比特的权重、特征值图1 系统框图 和量化参数。采用Cortex-M3作为处池化模块设计思路同卷积模块,采用最大池化。包含3个比较器和一个行缓冲,针对不同层可以选择不同长度的特征图,窗口尺寸为2x2。
EDA技术的设计流程:
1、设计输入
用一定的逻辑表达手段表达出来。
2、逻辑综合
将用一定的逻辑表达手段表达出来的设计经过一系列的操作,分解成一系列的逻辑电路及对应关系(电路分解)。
3、目标器件的适配
在选用的目标器件中建立这些基本逻辑电路的对应关系(逻辑实现)。
4、目标器件的编程/下载
将前面的软件设计经过编程变成具体的设计系统(物理实现)。
5、仿真/硬件测试
验证所设计的系统是否符合要求。同时,再设计过程中要进行有关“仿真”,即模拟有关设计结果,验证是否与设计构想相符。
扩展资料:
基于fpga/cpld数字系统的设计规则:
1、分割准则
(1)、分割后最底层的逻辑块应适合用逻辑语言进行表达。
(2)、相似的功能应该设计成共享的基本模块。
(3)、接口信号尽可能少。
(4)、同层次的模块之间,在资源和i/o分配上,尽可能平衡,以便结构匀称。模快的划分和设计,尽可能做到通用性好,易于移植。
2、系统设计的可测性
具有系统的关键点信号,如时钟、同步信号和状态等信号;具有代表性的节点和线路上的信号等。
3、系统设计的重用性
(1)、设计者应该尽可能采用同步电路进行设计,系统中应该有时钟和复位信号。
(2)、fpga/cpld的结构可以提供一定数量的片上存储器块。
(3)、复杂、系统级芯片需要各种标准的i/o接口。
(4)、编码是数字系统设计者应该给予足够重视的一项工作。
4、最优化设计
由于可编程器件的逻辑资源、连接资源和i/o资源有限,器件的速度和性能也是有限的,用器件设计系统的过程相当于求最优解的过程。
5、可靠性设计
还有更容易的吗?
思路:一个大cnt决定了频率,在大cnt数到特定值的时候,管脚拉高,再数到特定值的时候,管脚拉低。这样脉宽和相位不就都有了吗?这个特定值放在reg里,可以更改。按着这个思路,应该是很容易完成的事情。
本次设计的目的就是通过实践深入理解计算机组成原理,了解EDA技术[2]并掌握VHDL硬件描述语言的设计方法和思想。以计算机组成原理为指导,通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识和基本单元电路的综合设计应用。通过对实用汽车尾灯控制器[3]的设计,巩固和综合运用所学知识,提高IC设计能力,提高分析、解决计算机技术实际问题的独立工作能力。
1.2设计的基本内容
根据计算机中状态机原理,利用VHDL设计汽车尾灯控制器的各个模块,并使用EDA 工具对各模块进行仿真验证。汽车尾灯控制器的设计分为4个模块:时钟分频模块、汽车尾灯主控模块,左边灯控制模块和右边灯控制模块。把各个模块整合后就形成了汽车尾灯控制器。通过输入系统时钟信号和相关的汽车控制信号,汽车尾灯将正确显示当前汽车的控制状态。
1.3 EDA的介绍
1.3.1 EDA技术的概念
EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
1.3.2 EDA技术的特点
利用EDA技术进行电子系统的设计,具有以下几个特点:① 用软件的方式设计硬件;② 用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的;③ 设计过程中可用有关软件进行各种仿真;④ 系统可现场编程,在线升级;⑤ 整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。因此,EDA技术是现代电子设计的发展趋势。
1.3.3 EDA设计流程
典型的EDA设计流程如下:
1、文本/原理图编辑与修改。首先利用EDA工具的文本或图形编辑器将设计者的设计意图用文本或图形方式表达出来。
2、编译。完成设计描述后即可通过编译器进行排错编译,变成特定的文本格式,为下一步的综合做准备。
3、 综合。将软件设计与硬件的可实现性挂钩,是将软件转化为硬件电路的关键步骤。
4、 行为仿真和功能仿真。利用产生的网表文件进行功能仿真,以便了解设计描述与设计意图的一致性。
5、适配。利用FPGA/CPLD布局布线适配器将综合后的网表文件针对某一具体的目标器件进行逻辑映射操作,其中包括底层器件配置、逻辑分割、逻辑优化、布局布线。适配报告指明了芯片内资源的分配与利用、引脚锁定、设计的布尔方程描述情况。
6、 功能仿真和时序仿真。
7、 下载。如果以上的所有过程都没有发现问题,就可以将适配器产生的下载文件通过FPGA/CPLD下载电缆载入目标芯片中。
8、 硬件仿真与测试。
1.4硬件描述语言(VHDL)
1.4.1 VHDL的介绍
VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本
1.4.2 VHDL语言的特点
1.用VHDL代码而不是用原理图进行设计,意味着整个电路板的模型及性能可用计算机模拟进行验证。
2.VHDL元件的设计与工艺无关,与工艺独立,方便工艺转换。
3.VHDL支持各种设计方法,自顶向下、自底向上或者混合的都可以。
4.可以进行从系统级到逻辑级的描述,即混合描述。
5.VHDL区别于其他的HDL,已形成标准,其代码在不同的系统中可交换建模。
2.总体设计
2.1需求分析
根据现代交通规则,汽车尾灯控制器应满足以下基本要求:
1.汽车正常使用是指示灯不亮
2.汽车右转时,右侧的一盏灯亮
3.汽车左转时,左侧的一盏灯亮
4.汽车刹车时,左右两侧的指示灯同时亮
5.汽车夜间行驶时,左右两侧的指示灯同时一直亮,供照明使用
2.2汽车尾灯控制器的工作原理
汽车尾灯控制器就是一个状态机的实例。当汽车正常行驶时所有指示灯都不亮;当汽车向右转弯时,汽车右侧的指示灯RD1亮;当汽车向左侧转弯时,汽车左侧的指示灯LD1亮;当汽车刹车时,汽车右侧的指示灯RD2和汽车左侧的指示灯LD2同时亮;当汽车在夜间行驶时,汽车右侧的指示灯RD3和汽车左侧的指示灯LD3同时一直亮。通过设置系统的输入信号:系统时钟信号CLK,汽车左转弯控制信号LEFT,汽车右转弯控制信号RIGHT,刹车信号BRAKE,夜间行驶信号NIGHT和系统的输出信号:汽车左侧3盏指示灯LD1、LD2、LD3和汽车右侧3盏指示灯RD1、RD2、
RD3实现以上功能。系统的整体组装设计原理如图3.1所示。
图2.3整体组装设计原理
2.3 汽车运行状态表和总体框图
汽车尾灯和汽车运行状态表如表1所示。
汽车尾灯和汽车运行状态表1-1
开关控制 汽车运行状态 右转尾灯 左转尾灯
S0 S1S2 R1 R2R3 L1L2L3
00 0 正常运行 灯灭 灯灭
00 1 左转弯 灯灭 按L1L2L3顺序循环点亮
01 0 右转弯 按R1R2R3顺序循环点亮 灯灭
01 1 临时刹车/检测 所有尾灯同时点亮
10 0 倒车 所有尾灯按照转弯次序点亮
10 1 晚上行车时 R3 ,L3一直点亮
汽车尾灯控制电路设计总体框图如图1所示:
图1汽车尾灯控制电路设计总体框图
3.详细设计
3.1各组成模块
实现的主要功能是通过开关控制从而实现汽车尾灯的点亮方式。汽车尾灯控制器有4个模块组成,分别为:时钟分频模块、汽车尾灯主控模块,左边灯控制模块和右边灯控制模块,以下介绍各模块的详细设计。
3.2时钟分频模块
整个时钟分频模块的工作框图如图3.2所示。
图3.2时钟分频模块工作框图
时钟分频模块由VHDL程序来实现,下面是其中的一段VHDL代码:
ARCHITECTURE ART OF SZ IS
SIGNAL COUNT:STD_LOGIC_VECTOR(7 DOWNTO 0)
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK = '1'THEN
COUNT <= COUNT + 1
END IF
END PROCESS
CP<= COUNT(3)
END ART
3.3 汽车尾灯主控模块
汽车尾灯主控模块工作框图如图3.3所示
图3.3 主控模块工作框图
汽车尾灯主控模块由VHDL程序来实现,下面是其中的一段VHDL代码:
ARCHITECTURE ART OF CTRL IS
BEGIN
NIGHT_LED<=NIGHT
BRAKE_LED<=BAKE
PROCESS(LEFT,RIGHT)
VARIABLE TEMP:STD_LOGIC_VECTOR(1 DOWNTO 0)
BEGIN
TEMP:=LEFT &RIGHT
CASE TEMP IS
WHEN "00" =>LP<='0'RP<='0'LR<='0'
WHEN "01" =>LP<='0'RP<='1'LR<='0'
WHEN "10" =>LP<='1'RP<='0'LR<='0'
WHEN OTHERS=>LP<='0'RP<='0'LR<='1'
END CASE
END PROCESS
END ART
3.4左边灯控制模块
左边灯控制模块的工作框图如图3.4所示。
图3.4左边灯控制模块的工作框图
左边灯控制模块由VHDL程序来实现,下面是其中的一段VHDL代码:
ARCHITECTURE ART OF LC IS
BEGIN
LEDB<=BRAKE
LEDN<=NIGHT
PROCESS(CLK,LP,LR)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF(LR ='0')THEN
IF(LP = '0')THEN
LEDL<='0'
ELSE
LEDL<='1'
END IF
ELSE
LEDL <='0'
END IF
END IF
END PROCESS
END ART
3.5右边灯控制模块
右边灯控制模块的工作框图如图3.5所示
图3.5 右边灯控制模块的工作框图
右边灯控制模块由VHDL程序来实现,下面是其中的一段VHDL代码:
ARCHITECTURE ART OF RC IS
BEGIN
LEDB<=BRAKE
LEDN<=NIGHT
PROCESS(CLK,RP,LR)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN
IF(LR = '0')THEN
IF(RP = '0')THEN
LEDR <='0'
ELSE
LEDR <= '1'
END IF
ELSE
LEDR <='0'
END IF
END IF
END PROCESS
END ART
4.系统仿真与调试
4.1分频模块仿真及分析
分频模块由VHDL程序实现后,其仿真图如图4.1所示
图4.1 分频模块仿真图
对其仿真图进行仿真分析:如图所示,首先生成一个600ns的时钟脉冲,通过时钟分频把600ns的脉冲分成一个40ns的脉冲,实现了信号同步。
4.2汽车尾灯主控模块仿真及分析
汽车尾灯主控模块由VHDL程序实现后,其仿真图如图4.2所示。
图4.2主控模块时序仿真图
对时序仿真图进行分析:RIGHT,LEFT,NIGHT,BRAKE 为输入信号,RIGHT为1表示右转,LEFT为1表示左转,NIGHT为1表示夜间行路,BRAKE为1表示刹车。RP,LP,NIGHT_LED,BRAKE_LED为输出信号。如图所示:当RIGHT为1时,产生一个RP为1的信号脉冲输出,当LEFT为1时,产生一个LP为1的信号脉冲输出,当NIGHT为1时,产生一个NIGHT_LED为1的信号脉冲输出。当BRAKE为1时,产生一个BRAKE_LED为1的信号脉冲输出。
4.3左边灯控制模块仿真及分析
左边灯控制模块由VHDL程序实现后,其仿真图如下图4.3所示。
对时序仿真图进行分析:LP,LR,NIGHT,BRAKE 为输入信号,LP为1表示左转,LR为1表示右转,NIGHT为1表示夜间行路,BRAKE为1表示刹车。LEDL,LEDB,LEDN为输出信号,表示汽车左侧的三盏灯。如图所示:当LP为1时,LEDL输出为1表示左侧灯亮,当BRAKE为1时,LEDB输出为1表示左侧灯亮,当NIGHT为1时,LEDN输出为1表示左侧灯亮。当LR为1时,左侧三盏灯输出均为0。即没有灯亮。
图4.3左边灯控制模块时序仿真图
4.4右边灯控制模块仿真及分析
右边灯控制模块由VHDL程序实现后,其仿真图如图4.4所示。
图4.4 右边灯控制模块时序仿真图
对时序仿真图进行分析:RP,LR,NIGHT,BRAKE 为输入信号,LR为1表示左转,RP为1表示右转,NIGHT为1表示夜间行路,BRAKE为1表示刹车。LEDR,LEDB,LEDN为输出信号,表示汽车右侧的三盏灯。如图所示:当RP为1时,LEDR输出为1表示右侧灯亮,当BRAKE为1时,LEDB输出为1表示右侧灯亮,当NIGHT为1时,LEDN输出为1表示右侧灯亮。当LR为1时,右侧三盏灯输出均为0。即没有灯亮。
4.5整个系统仿真及分析
按图2.3组装系统后的仿真图如下图4.5所示。
对时序仿真图进行分析:RIGHT,LEFT,NIGHT,BRAKE 为输入信号,RIGHT为1表示右转,LEFT为1表示左转,NIGHT为1表示夜间行路,BRAKE为1表示刹车。RD1,RD2,RD3为输出信号,表示汽车右侧的三盏灯。LD1,LD2,LD3为输出信号,表示汽车左侧的三盏灯。如图所示:当RIGHT为1时,RD1输出为1表示右侧灯亮,当LEFT为1时,LD1为输出为1表示左侧灯亮,当NIGHT为1时,LD2,RD2输出均为1,表示左,右两侧各有一盏灯亮。当BRAKE为1时,LD3,RD3输出均为1,表示左,右两侧各有一盏灯亮。
图4.5 整个系统仿真图
4.6 总体设计电路图
图4.6总体设计电路图
总结
通过两星期的紧张工作,最后完成了我的设计任务——汽车尾灯控制器的设计。通过本次课程设计的学习,我深深的体会到设计课的重要性和目的性。本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。希望学校以后多安排一些类似的实践环节,让同学们学以致用。
在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。在应用VHDL的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
参考文献
[1] 王爱英.计算机组成与结构.北京:清华大学出版社,2001.2,
[2] 黄仁欣.EDA技术实用教程.北京:清华大学出版社,2006
[3] 曹昕燕,周凤臣,聂春燕.EDA技术实验与课程设计.北京:清华大学出版社,2006.5
[4] 杨亦华,延明.数字电路EDA入门.北京:北京邮电大学出版社,2003
[5] 彭容修,《数字电子技术基础》, 武汉,武汉理工大学出版社,2005
[6] 潘松 ,黄继业《EDA技术与VHDL》,北京,清华大学出版社,2006
已发至您邮箱,请注意查收。
---------------------------------------------------------------------------------------------
--实验题号 : lab5
--项目名称 : VGA实验
--文件名 : VGA_640480.vhd
--作者 :
--班号. :
--创建日期 :
--目标芯片 : EP1C6Q240C8
--电路模式 : 模式5
--演示说明 : 输入时钟为clock0,50Mhz
-- 输出接VGA
-- 请在通电后先reset
-- 键1信号上升沿改变字符颜色
-- 键2信号上升沿改变字符
-- 键3开关控制字符y方向移动
-- 键4开关控制字符x方向移动
-- 键5开关控制字符闪烁
-- 键6开关控制字符边框
-- 键8 reset
---------------------------------------------------------------------------------------------
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
use ieee.std_logic_arith.all
entity vga640480 is
port(
address : out STD_LOGIC_VECTOR(11 DOWNTO 0) --连接ROM地址
reset : in STD_LOGIC
q : in STD_LOGIC --ROM数据的返回
clk : buffer std_logic --分频后的25M时钟
clk_0 : in STD_LOGIC --50M时钟输入
r,g,b : out STD_LOGIC --颜色信号
hs,vs : out STD_LOGIC --行同步、场同步信号
in_frame_switch : in STD_LOGIC --加边框开关
in_blink_switch : in STD_LOGIC --闪烁开关
in_enlarge_switch : in STD_LOGIC --大字符开关
in_num_change : in STD_LOGIC --改变显示的数值
in_color_change : in STD_LOGIC --改变显示的颜色
in_v_x,in_v_y : in STD_LOGIC --显示字符的是否向x,y方向位移
vga_syn : out STD_LOGIC
vga_clk : out STD_LOGIC
vga_blank : out STD_LOGIC
)
end vga640480
architecture behavior of vga640480 is
signal r1,g1,b1 : std_logic
signal hs1,vs1 : std_logic
signal vector_x : std_logic_vector(9 downto 0) --扫描点X坐标
signal vector_y : std_logic_vector(8 downto 0) --扫描点Y坐标
signal target_x : std_logic_vector(9 downto 0) --字符左上角X坐标
signal target_y : std_logic_vector(8 downto 0) --字符左上角Y坐标
signal blink : std_logic --闪烁控制信号
Shared Variable scancount,blinkcount : integer --扫描点计数、扫屏数计数
Shared Variable color : std_logic_vector(2 downto 0) --当前显示颜色rgb
Shared Variable num : std_logic_vector(1 downto 0) --当前显示数字
begin
-----------------------------------------------------------------------
process(clk_0) --对50M输入信号二分频
begin
if(clk_0'event and clk_0='1') then
clk <= not clk
end if
end process
-----------------------------------------------------------------------
process(clk,reset) --行区间像素数(含消隐区)
begin
if reset='0' then
vector_x <= (others=>'0')
elsif clk'event and clk='1' then
if vector_x=799 then
vector_x <= (others=>'0')
else
vector_x <= vector_x + 1
end if
end if
end process
-----------------------------------------------------------------------
process(clk,reset) --场区间行数(含消隐区)
begin
if reset='0' then
vector_y <= (others=>'0')
elsif clk'event and clk='1' then
if vector_x=799 then
if vector_y=524 then
vector_y <= (others=>'0')
else
vector_y <= vector_y + 1
end if
end if
end if
end process
-----------------------------------------------------------------------
process(clk,reset) --行同步信号产生(同步宽度96,前沿16)
begin
if reset='0' then
hs1 <= '1'
elsif clk'event and clk='1' then
if vector_x>=656 and vector_x<752 then
hs1 <= '0'
else
hs1 <= '1'
end if
end if
end process
-----------------------------------------------------------------------
process(clk,reset) --场同步信号产生(同步宽度2,前沿10)
begin
if reset='0' then
vs1 <= '1'
elsif clk'event and clk='1' then
if vector_y>=490 and vector_y<492 then
vs1 <= '0'
else
vs1 <= '1'
end if
end if
end process
-----------------------------------------------------------------------
process(clk,reset) --行同步信号输出
begin
if reset='0' then
hs <= '0'
elsif clk'event and clk='1' then
hs <= hs1
end if
end process
-----------------------------------------------------------------------
process(clk,reset) --场同步信号输出
begin
if reset='0' then
vs <= '0'
elsif clk'event and clk='1' then
vs <= vs1
end if
end process
-----------------------------------------------------------------------
process(clk,reset) --扫描点计数、扫屏数计数,以及闪烁控制、字符显示位置控制
begin
if reset='0' then
target_x <= "0101000000"
target_y <= "011100000"
blink <= '0'
scancount := 0
blinkcount := 0
elsif clk'event and clk='1' then
scancount := scancount + 1
if scancount >= 525*800 then
blinkcount := blinkcount + 1
if (blinkcount = 20) then
blink <= NOT blink
blinkcount := 0
end if
target_x <= target_x + in_v_x
target_y <= target_y + in_v_y
if target_x>=640-32 then
target_x <= "0000000000"
end if
if target_y>=480-32 then
target_y <= "000000000"
end if
scancount := 0
end if
end if
end process
-----------------------------------------------------------------------
process(in_num_change,reset) --改变数字
begin
if reset='0' then
num := "00"
elsif in_num_change'event and in_num_change='1' then
num := num + "01"
end if
end process
-----------------------------------------------------------------------
process(in_color_change,reset) --改变颜色
begin
if reset='0' then
color := "001"
elsif in_color_change'event and in_color_change='1' then
if color="111" then
color := "001"
else
color := color + "001"
end if
end if
end process
----------------------------------------------------
process(reset,clk,vector_x,vector_y) -- XY坐标定位控制
Variable temp_x : std_logic_vector(9 downto 0)
Variable temp_y : std_logic_vector(8 downto 0)
Variable size : integer
begin
if reset='0' then
r1 <= '0'
g1 <= '0'
b1 <= '0'
elsif(clk'event and clk='1')then
if in_enlarge_switch='0' then --控制字符边长
size := 32
else
size := 64
end if
--字符边框
if ((vector_x = target_x - 1 or vector_x = target_x + size + 3) and vector_y >= target_y - 1 and vector_y <= target_y + size + 3)
or ((vector_y = target_y - 1 or vector_y = target_y + size + 3) and vector_x >= target_x - 1 and vector_x <= target_x + size + 3) then
r1 <= color(2) AND (blink or NOT in_blink_switch) AND in_frame_switch
g1 <= color(1) AND (blink or NOT in_blink_switch) AND in_frame_switch
b1 <= color(0) AND (blink or NOT in_blink_switch) AND in_frame_switch
else
r1 <= '0'
g1 <= '0'
b1 <= '0'
end if
--显示字符
if vector_x >= target_x and vector_x < target_x + size and vector_y >= target_y and vector_y < target_y + size then
temp_y := vector_y-target_y
temp_x := vector_x-target_x
if in_enlarge_switch='0' then
address <= num & temp_y(4 downto 0) & temp_x(4 downto 0)
else
address <= num & temp_y(5 downto 1) & temp_x(5 downto 1)
end if
if q = '0' then
r1 <= color(2) and (blink or NOT in_blink_switch)
g1 <= color(1) and (blink or NOT in_blink_switch)
b1 <= color(0) and (blink or NOT in_blink_switch)
else
r1 <= '0'
g1 <= '0'
b1 <= '0'
end if
end if
end if
end process
-----------------------------------------------------------------------
--色彩输出
r <= r1 and hs1 and vs1
g <= g1 and hs1 and vs1
b <= b1 and hs1 and vs1
vga_blank <= hs1 and vs1
vga_clk <= clk
vga_syn <= '0'
end behavior