2024年8月更新,增加网页链接
前言
这篇讲的不会非常细致,主要是说明下程序与实现的效果,方便熟悉c类语言的工程师了解Verilog到底是怎么样,以及前期硬件的准备
为什么用CPLD
CPLD和FPGA相比较,更简单,更便宜,更容易使用,当然性能更一般,但是却很适合入门Verilog因为不用花很多时间去配置。
使用平台、环境、开发板
这里我使用一套运行Windows7的电脑,它有LPT也就是并口,当然你可以使用并口转USB的设备来实现下载器的使用。
XC9572XL:XC9572的现代版本,VG44封装
LPT下载器:事实上这个是最适合的,不算很好用因为有点接触不良问题,但它相比较FPGA那边用的下载器来说,能正常下载到CPLD中
这个东西其实里面没有什么特别的,两片74HC125加基本元件而已,你甚至可以轻松的打板自制
ISE 14.7:Xilinx早些时候的IDE环境,如今已经换成vivado但是它没有支持CPLD开发,安装教程 二、Win10安装Xilinx ISE14.7_ise 14.7安装包-CSDN博客
Win11安装ise14.7~不需要虚拟机了~-CSDN博客
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文件定义引脚,通常正确叫法是约束