FPGA流水灯设计
流水灯顶层设计
第一章 流水灯顶层设计框图
输入时钟信号clk_50m,输出4个字节的led_out信号(控制led灯点亮的信号)。
第二章 PLL锁相环
2.1 PLL锁相环
PLL(Phase Locked Loop):具有时钟的倍频、分频、相位偏移、可编程占空比和外部时钟输出。
一般晶体振荡器由于工艺和成本原因达不到高频信号输出。高频电子线路中,需要外部信号与内部的振荡信号同步。一路输入时钟需要生成多路时钟信号。以上几种问题就需要通过PLL来实现。
同步时序电路的关键是系统时钟和复位时钟。
在pll中,输入的是给定的clk_50m信号,输出的是clk_100m(时钟信号)信号和locked锁定信号(因为共阳,故在低电平有效)。
2.2 VIVADO调用
步骤一、新建项目,首先选择xc7a100tfgg484-2芯片。
步骤二、双击IP Catalog调用ip核。
步骤三、屏幕右端选择IP Catalog下依次选择name/FPGA feature and design/clocking/clocking wizard。
步骤四、双击上一步的clocking wizard,来到配置界面。
步骤五、对输入进行设置,首先将名字component name设置成PLL,然后将input clock information中的input frequency设置为50,代表输入的clk为50Mhz。
步骤六、在output clocks中将enable optional inputs/outputs for MMCM/PLL中的reset复位的勾去除,点击ok。
步骤七、在跳出来的框中选中generate,完成ip生成。
步骤八、新建测试文件,名称为TB_PLL。
步骤九、调用的语句在sources/ip/PLL/instantiation template/PLL.veo。
步骤十、第71到78行语句即是PLL内。
步骤十一、写出TB_PLL的测试语句。50Mhz的输入信号,20ns一个周期,时钟信号每10ns翻转一次,模拟形成型号。
步骤十二、进行测试,如图,黄色的为输出的clk_100m信号,红色的为clk_50m信号。790ns的时候稳定输出为clk_100m的信号。
第三章 第二个子模块time_top的设计
在time_top模块中,输入时钟信号clk和复位信号reset,输出一个可以得到一定时间间隔的使能信号time_en。
设cnt为计数次数,以100m信号为例,周期为:1/T=10ns。我们设计跑1000ns,计数100次。2^n≥100,n=7,cnt为7位。
parameter定义常量,可以定义在模块内部或外部;常用于定义位宽或时间延迟(易变),此处以加一个常数的电路进行示例,如下:
定义方式为: parameter标识符 = (位宽)常数;// 位宽默认为32位,如果指定位宽则以指定值为准。
步骤一、新建源文件,编写Verilog语言如图。
步骤二、编写测试文件如图所示。
步骤三、进行仿真,得到仿真图如上图所示。
最上方的黄色信号是复位信号,在1000ns由高电平变成低电平。共阳极赋值0,亮起。
第三条青色的线为time_en信号,1995ns达到高电平,持续10ns,1000ns后计数到100,再次重复。
最后一条白色的线是cnt_time计数的线,从0-99,计数100次。
第四章 第三个子模块water_led的设计
流水灯输入时钟信号clk,输入时间使能信号time_en,输入复位信号reset,输出控制4个流水灯的【3:0】led_out信号。
步骤一、新建water_led源程序如上图。
步骤二、新建water_led流水灯测试程序如上图。
步骤三、进行仿真,得到的图像如上图。
将得到的输出信号改为二进制,20ns为一个周期。1000ns的时候,复位信号由高电平转为低电平。1005ns的时候,time_en开始以20ns为周期稳定的输入时间使能信号。
第五章 system_top
步骤一、新建system_top源文件如上图。
步骤二、新建system_top测试文件如上图。
步骤三、对system_top进行仿真得到如上图。
上图中红色的线为输出的led_out,隔一段时间变换,从左到右变换。
得到的仿真图如上图所示。