admin管理员组

文章数量:1794759

Xilinx CPLD教程,Verilog入门:点亮LED灯

Xilinx CPLD教程,Verilog入门:点亮LED灯

前言

这篇讲的不会非常细致,主要是说明下程序与实现的效果,方便熟悉c类语言的工程师了解Verilog到底是怎么样,以及前期硬件的准备

为什么用CPLD

CPLD和FPGA相比较,更简单,更便宜,更容易使用,当然性能更一般,但是却很适合入门Verilog因为不用花很多时间去配置。

使用平台、环境、开发板

这里我使用一套运行Windows7的电脑,它有LPT也就是并口,当然你可以使用并口转USB的设备来实现下载器的使用。

XC9572XL:XC9572的现代版本,VG44封装

 

LPT下载器:事实上这个是最适合的,不算很好用因为有点接触不良问题,但它相比较FPGA那边用的下载器来说,能正常下载到CPLD中

 这个东西其实里面没有什么特别的,两片74HC125加基本元件而已,你甚至可以轻松的打板自制

 

ISE 14.7:Xilinx早些时候的IDE环境,如今已经换成vivado但是它没有支持CPLD开发

 

iMpact:下载配置工具

 

说明

这里使用的是Verilog语言,类似于C但是很明显许多地方不能套用C的思维。类似C的地方有蛮多的,但是加上一些Verilog的操作后和C就没什么关系了。

先确定两个赋值方法,连续赋值和过程赋值,连续赋值就是把寄存器和输出接口连起来,过程赋值就是给寄存器赋值

比如下面这个是连续赋值,前面使用assign修饰

assign LED1=sr_led;

下面这个是过程赋值,使用的是【<=】这个符号 ,相比一下,过程赋值能放在always(这个类似于while(1)里面,而连续赋值是不可以的。同样,过程赋值不能放在initial和always外面而连续赋值可以

sr_led = 4'b1110; //4表示4位数值,b表示二进制,数值为1110

 LED点灯,整个程序如下所示,可以看到输出有四个,输入有一个

module Main( output LED1, output LED2, output LED3, output LED4, input iCLK ); reg sr_led=1;//寄存器sr_led assign LED1=sr_led;//让LED1和sr_led这个寄存器连接,sr_led发生变动时候LED1也变化 always@(posedge iCLK)//always和initial一样都是并发执行的,多个always会一块启动 sr_led <= 0;//赋值为0 endmodule

当然这里看出来,并没有对具体的引脚进行定义(FPGA里面叫做约束),所以这里就需要UCF文件来进行定义引脚

 

这个引脚约束和具体的开发板电路原理图有关系,我们需要引入时钟以及四个LED灯的引脚,它们分别位于Port1和31,32,33,34

 

根据上面的原理图,具体定义如下

NET "iCLK" LOC = "p1" ; NET "LED1" LOC = "p34" ; NET "LED2" LOC = "p33" ; NET "LED3" LOC = "p32" ; NET "LED4" LOC = "p31" ;

最终使用iMPACT来下载到XC9572里面

 

执行效果,左边一个LED是电源指示灯

 

总结

基本语法类似C但要搞清差别,比如赋值

UCF文件定义引脚,通常正确叫法是约束

本文标签: 入门教程CPLDXilinxverilog