win cupl应用新版.docx
《win cupl应用新版.docx》由会员分享,可在线阅读,更多相关《win cupl应用新版.docx(12页珍藏版)》请在冰豆网上搜索。
![win cupl应用新版.docx](https://file1.bdocx.com/fileroot1/2022-11/27/c2939518-3ea2-4159-ae48-e3d21e31603e/c2939518-3ea2-4159-ae48-e3d21e31603e1.gif)
wincupl应用新版
wincupl应用[新版]
跟我学Cupl之一简介
Cupl语言大家可能没有听说过,实际上它是国内唯一一种和ABEL语言类似,而且可以在Windows环境
上开发GAL系列PLD的编译环境。
WinCupl这种编译环境由ATMEL公司出品,是免费软件,下载页面是
在该页面中选择WinCupl的下载,登记
一下你的基本情况就能下载了。
下载时会给你注册码,很方便。
一、Cupl的保留字
Cuple的保留字包括以下的字串:
APPENDFORMATOUT
ASSEMBLYFUNCTIONPARTNO
ASSYFUSEPIN
COMPANYGROUPPINNNODE
CONDITIONIFPRESENT
DATEJUMPREV
DEFAULTLOCREVISION
DESIGNERLOCATIONSEQUENCE
DEVICEMACROSEQUENCED
ELSEMINSEQUENCEJK
FIELDNAMESEQUENCERS
FLDNODESEQUENCET
这些字串是不能被用作其它的用途的。
尤其是不能被当作标号使用。
Cupl语言有一些运算符,包括:
()-
*+[]/
:
.../**/
;,!
'=
@$^
下面是一个门电路的例子,通过这个例子我们可以学到基本的Cupl语言的用法,在该文件中/**/之间
的为注释。
NameGates;
PartnoCA0001;
Date07/16/87;
DesignerGWoolheiser;
CompanyATI;
LocationSanJose,CA.;
AssemblyExample;
/******************************************************//**//*这是一个表示CUPL语言基本用法的例子*/
/*这个例子实现基本门电路.*/
/**/
/******************************************************//*目标设备:
P16L8,P16P8,EP300,and82S153*//******************************************************//*输入:
定义简单门电路的输入端*/Pin1=a;/*引脚1:
输入端,名称是a*/
Pin2=b;
/*输出端:
定义PAL16L8和PAL16LD8器件的输出端。
*/
Pin12=inva;/*引脚11:
输出端,名称是inva*/
Pin13=invb;
Pin14=and;/*引脚14:
输出端,名称是and,与VHDL不同,and不是关键字,可以作为标号使用*/
Pin15=nand;
Pin16=or;
Pin17=nor;
Pin18=xor;
Pin19=xnor;
/*逻辑实现部分:
演示如何利用CUPL实现基本门电路*/inva=!
a;/*反相器*/
invb=!
b;
and=a&b;/*与门*/
nand=!
(a&b);/*与非门*/or=a#b;/*或门*/
xor=a$b;/*异或门*/nor=!
(a#b)/*或非门*/xnor=!
(a$b);/*同或门*/
通过上面例子的学习,我们应该对Cupl语言有了初步的了解。
WinCupl不但可以编译该文件,生成JED的熔丝文件,还可以对该文件进行波形仿真。
在做小规模的
PLD设计的时候,使用GAL系列或者ATF系列的PLD比较方便,也比较便宜。
Cupl文件的基本格式在编写Cupl语言源文件需要遵守一定的格式,源文件由头部说明、输入引脚说明、输出引脚说明和逻
辑实现4部分组成,缺一不可。
一、头部说明
头部说明一般包括以下部分:
NameWAITGEN;
PartnoP9000183;
Revision02;
Date1/11/89;
DesignerOsann;
CompanyLogicalDevices,Inc.;AssemblyPCMemoryBoard;
LocationU106;
DeviceF155;
Formatij;
Name关键字用来说明逻辑文件的文件名,默认的扩展名是PLD,因此可以不写扩展名。
Partno关键字用来说明对特定的PLD器件对应的某个公司的部件号。
如果不知道,可以不要这个部分
。
Revision设计公司设计该源文件的版本号。
可以不填,可以没有
Date设计日期,可以不填,可以没有
Designer设计者的名称,可以不填,可以没有
Company设计者所在公司名称,可以不填,可以没有
Assembly本设计用于PC机板卡时的名称,可以没有
Location本设计用于PC机板卡时所在的位置,可以没有
Device必填字段,用来选择本设计所用的具体PLD器件型号,
Format用来指定本文件编译后产生的烧写芯片文件的种类。
h表示产生HEX格式的ASCII码文件,i
表示HL格式的文件,j表示产生JEDEC格式的文件。
二、引脚说明
在PLD源文件中,所用的输入输出引脚都必须说明后才能使用,因此,可以象下面格式一样说明引脚
:
PINpin_n=[!
]var;
pin_n是引脚号码,var是引脚定义的名字,该名字用在后面的逻辑实现中。
!
是可选的PIN是关键字,
,用来说明引脚的极性,如果没有!
输入是什么就是什么,为同相,如果有!
,就表示输入后信号反相。
下面是一个实际的例子:
Pin2=!
A;
Pin3=!
B;
Pin16=Y;
Y=A&B;/*逻辑实现部分*/
当然,如果有一系列的引脚需要说明,这些引脚又是连续的,可以用[]符号来说明,比如
Pin[2..6]=A[1..5];
就表示引脚2到6用A1到A5来表示,比较方便。
三、逻辑实现部分
逻辑实现部分用来实现引脚之间的逻辑关系。
它主要靠一些逻辑操作符来实现引脚之间的关系。
这些
逻辑关系包括:
逻辑符号例子关系操作优先级
!
!
ANOT1
&A&BAND2
#A#BOR3
$A$BXOR4
其中,!
表示非,&表示与,#表示或,$表示异或,异或的操作优先级最低,非的优先级最高。
搞清楚了这些东西,就可以自己实现最基本的逻辑门电路了。
下一讲我们将说明如何使用WinCupl的环境。
如何使用WinCupl软件环境
WinCupl是ATMEL公司出品的Cupl语言的编译环境,用于PLD器件的编程,支持多种器件,包括GAL系列
和ATF系列。
一般来说,ATF系列的同等级产品要必GAL的便宜,比如AFT16V8就兼容GAL16V8,可以擦写100次,价格上也便宜1块,2块,性能都差不多。
在ATMEL公司的SPLD/CPLD栏目中免费下载WinCupl后,可以得到一个注册码,用这个码就可以激活WinCupl了,这个码没有使用时间的限制。
WinCupl软件包实际包括两个部分,一个是WinCupl,PLD的编译环境,一个是WinSim,相当于MAX的波形仿真部分。
接下来我们学习如何使用这个软件。
一、编译第一个源文件
第一次课我们举了一个例子,说明了Cupl语言的基本结构,下面我们做另一个例子,就是两输入端与
门。
具体步骤是:
1、启动WinCupl。
启动完进入主界面后,单击File菜单的New,从New中单击Projet,就是新建一个工
程文件(其实还是PLD文件),在弹出的对话框中,可以填您的源文件名字(Name),填MYGATE,其它的
东西怎么填请您复习第2课的PLD文件头部文件的说明部分。
这里有个特殊的地方,就是器件(Device),
系统默认的是virtual,就是不针对任何具体的部件,这里我们改掉,改成g16v8a,这个关键字兼容
ATF16V8。
2、单击OK后,系统要你输入你要用的输入引脚数,因为我们只有两个输入端,因此填2,单击OK按钮
。
3、系统要你输入要用到的输出引脚数,填1,单击OK按钮。
4、系统要你输入要使用到的中间节点数,我们不需要,填0,单击OK按钮。
这样系统就建立了一个
PLD文件,文件名就是MYGATE.PLD。
系统将该文件显示出来了,就象下面这样:
NameMYGATE;
PartNo00;
Date2006-8-9;
Revision01;
DesignerWUJIAN;
CompanyTALE;
AssemblyNone;
Location;
Deviceg16v8a;
/****************INPUTPINS*********************/PIN=;/**/
PIN=;/**/
/****************OUTPUTPINS*********************/PIN=;/**/
因此,这个文件是空的,我们填一下,将输入输出引脚都填好,把逻辑也写完,就象下面这样:
NameMYGATE;
PartNo00;
Date2006-8-9;
Revision01;
DesignerWUJIAN;
CompanyTALE;
AssemblyNone;
Location;
Deviceg16v8a;
/****************INPUTPINS*********************/PIN2=a;/**/
PIN3=b;/**/
/****************OUTPUTPINS*********************/PIN12=Y;/**/
Y=a&b;
写好后,我们需要编译该文件。
在Run菜单中,单击DeviceDependentCompile,就是基于器件型号
的编译。
如果没有出现什么键入错误,都能成功编译。
编译完成后,我们来仿真一下看看波形。
二、仿真的基本方法
编译完成后。
单击工具栏图标的从右侧数第2个,启动WinSim。
启动完成后,单击WinSim菜单File中的
New。
1、在弹出的DesignProperties对话框中,单击DesignFile按钮,选中MYGATE.PLD文件,按“确认
”按钮继续。
在DesignProperties对话框中,单击OK按钮确认。
2、接下来WinSim会提示是否创建MYGATE.SIM文件并编译它,单击“是”继续。
3、不管接下来的提示,在WinSim中Signal(信号)菜单中单击Add,在弹出的AddSignal对话框中不
断单击OK按钮将a、b、y三个信号加到波形图中。
单击Done关闭该对话框。
4、在WinSim的File菜单中单击Save项保存该项目。
5、在黑色的网格的左上方有个Value,Value右边有个1,在1所在的灰色条上单击鼠标右键,在弹出
的菜单中的AddVector上单击鼠标左键,在弹出的对话框中输入3,表示增加波形仿真的3段。
6、在a的右侧的波形上单击鼠标右键,依次选0,0,1,1,在b的波形上单击鼠标右键,依次选0,1
,0,1。
7、保存该工程。
在Simulator菜单中选择Simulator开始仿真,就可以看到y的波形了。
如下图所示。
本次课我们学习了如何利用WinCupl进行PLD逻辑设计和基本仿真方法。
祝大家工作顺利,学习愉快。
实现一个4D触发器
我们原来学D触发器的时候,如果全部用组合逻辑来实现,推导出来的式子会很长很长,如果这么傻做的话,会很麻烦。
现在我们用引脚扩展名来实现就很方便。
我们以GAL16V8B(在WinCupl中对应的编译型号为g16v8a)为例,GAL16V8B一共有20个引脚。
第1引脚是CLK,即时钟引脚,第2,9引脚是输入引脚,共8个。
第10引脚是地,第11引脚是OE,低电平禁止,高电平允许。
第12,19是输出引脚,共8个,第20引脚是电源,一般可接+5V。
现在我们用该器件来实现一个4D触发器,即4个同样的D触发器。
在WinCupl中新建一个工程,文件内容如下:
NameDSample;
PartNo00;
Date2006-8-9;
Revision01;
DesignerWuJian;
CompanyTale;
AssemblyNone;
Location;
Deviceg16v8a;
/****************INPUTPINS*********************/PIN[2..5]=[A1..4];
/****************OUTPUTPINS*********************/PIN18=Q1;
PIN17=Q2;
PIN16=Q3;
PIN15=Q4;
Q1.D=A1;
Q2.D=A2;
Q3.D=A3;
Q4.D=A4;
很有意思吧。
关键是最后的QX.D。
这个“.D”表示把Q1,Q4当D触发器用。
A1~A4就是这4个D触发器的输入端,Q1~Q4就是D触发器的输出端,正好4个。
有人就要问了,时钟端呢,不要急,GAL16V8B的第1个引脚就是时钟端,当时钟端的输入信号出现上升沿的时候就将第2,5引脚的信号锁存到第18,15引脚。
而11引脚可以当OE使能端用,正好一个D触发器。
本文件编译后,在Proteus软件中的仿真图如下所示:
好了,这个图大家可以自己去仿真。
如果看过我的文章后对您有帮助的话,就达到我的目的了。
在Proteus中仿真
上面3次课中我们学会了Cupl的基本语法和如何利用WinCupl软件包中两个重要的部分WinCupl和WinSim进行设计与波形仿真。
如果我们需要验证PLD器件与其它器件联合工作的情况呢,那就需要利用另一个著
名的仿真软件Proteus软件自带PLD库进行了。
接下来我们把MYGATE项目在Proteus中进行仿真。
相信大家对Proteus已经比较熟悉了。
我们要做的其实很简单。
装好Proteus后(我用的是Proteus6.9,其实6以上就可以了),在元件库的PLD/FPGA项目中选择AM16V8,其实就是GAL16V8,将其拖到原理图上,然后拖电阻和开关到原理图上,再拖个发光管到电路上。
将其连好,如下图所示。
在原理图的AM16V8上,选中它,然后在上面单击鼠标左键,在弹出的对话框的JEDECFuseMapFile
栏中单击右侧的浏览图标,装入MYGATE.JED文件即可。
单击OK按钮关闭该对话框。
最后仿真该电路图。
仿真开始后,可以通过拨动开关,看AM16V8第12脚的输出结果,正好是一个与
门的逻辑。
好了。
我们已经介绍了PLD器件的编程方法、编程工具的使用和如何进行实际情况的模拟。
大家就可以
自己设计出一些可用的电路了
到底有哪些重要的引脚扩展名
Cupl语言中引脚重要的扩展名包括:
扩展名等式的某侧
.AP左边(L)flip-flop的异步预置
.ARLflip-flop的异步复位
.APMUXL多路选择器的异步预置
.ARMUXL多路选择器的异步复位
.BYPL可编程寄存器的旁路
.CALComplementarray.CELflip-flop的D触发器的输入使能.CKLflip-flop的可编程时钟
.CKMUXL多路器件的时钟
.DLflip-flop的D触发器的输入端.DFB右边(R)D寄存器回馈路径选择
.DQRD锁存器的Q端flip-flop扩展名等式的某侧
.IMUXL多路选择器的2引脚的选择端.INTR寄存器宏单元的内部回馈路径.JLJK触发器的J端flip-flop.KLJK触发器的K端flip-flop
.LLD输入锁存器
.LEL可编程锁存器使能
.LEMUXL锁存器使能多路选择器
.OEL可编程输出使能
.OEMUXL三态门的使能端
.PRL可编程预置端
.RLflip-flop的RS触发器R输入端
.SLflip-flop的RS触发器S输入端
.SPLflip-flop的异步置位端S
.SRLflip-flop的异步复位端R
.TLflip-flop的T触发器输入端
由上面的列表可以知道,这些东西有些我们做小规模的PLD设计的时候根本用不上。
如果是小规模的pld,上面的某些扩展名是不支持的,比如在GAL16V8B设计中,LE就不支持。
不过,我们能用触发器就是一个很大的进步,这样可以在几百个门逻辑的规模下设计一些市面上买不到的器件。
做一个JK触发器
在前面的课程中我们学到了如何做一个4D触发器,也知道了引脚扩展名。
但是,如果你直接用.J和.K来申明一个JK触发器,并想用它在gal16V8b中实现是不可能的。
为什么呢,因为GAL16V8手册中指出,内部只有D触发器的逻辑,没有JK触发器的逻辑,想直接借用是不可能的。
可我们需要一个jk触发器怎么办呢,我们可以查《数字电子技术》一类的书,这些书中有的就告诉了我们怎么用D触发器实现一个jk触发器,基本逻辑是:
Q.D=(J1&!
Q)#(!
K1&Q);
我们把这个逻辑用GAL16V8实现就可以了。
如果你看不懂的话,我可以解释一下。
Q就是数字电子书上的Qn。
!
Q就是Qn取反。
我们现在把这个东西用Cupl语言实现如下:
NameJKSample;
PartNo00;
Date2006-8-10;
Revision01;
DesignerWuJian;
CompanyZhuZhouAI;
AssemblyNone;
Location;
Deviceg16v8a;
/****************INPUTPINS*********************/PIN2=J1;/**/PIN3=K1;/**/
/****************OUTPUTPINS*********************/PIN18=Q;/**/
Q.D=(J1&!
Q)#(!
K1&Q);
把这个文件敲进去。
如果敲入正确,就能正常编译。
在利用Proteus仿真的时候,GAL16V8B的第1脚是时钟CLK,上升沿有效,第2脚是J脚,置位脚,第3脚是K脚,复位脚,第18脚是Q输出端。
试试看,这里我们就不需要给图了,只要你正确连线,就能得到正确的输出,很奇妙吧。
学过了本节课,我们可以知道,能用什么引脚扩展名全部由具体芯片内部结构决定,收获不小吧
5位节拍发生器
这次我们学怎么做利用扭环计数器做个节拍发生器。
这个节拍发生器的原理图大家可以参看高等教育出版社出版的中等专业技术学校规划教材《数字电子技术基础》,郑慰萱主编的,是一个习题课,电路图在447页。
只不过这次我们用GAL门电路来实现它。
这个节拍发生器利用扭环计数器、译码器组成。
扭环计数器因为要用到D触发器,因此我们利用3个D触发器组成一个3位的扭环计数器。
译码器我们利用5个输出端在扭环计数器上做逻辑。
具体代码如下:
Name5Count;
PartNo00;
Date2006-8-11;
Revision01;
DesignerWuJian;
CompanyZhuZhouAI;
AssemblyNone;
Location;
Deviceg16v8a;
/****************OUTPUTPINS*********************/PIN19=Q0;/**/PIN18=Q1;/**/PIN17=Q2;/**/PIN16=Q3;/**/PIN15=Q4;/**/
/****************PINNODES*********************/PINNODE14=N1;/**/PINNODE13=N2;/**/PINNODE12=N3;/**/
N1.D=!
N3;
N2.D=N1;
N3.D=N2;
Q0=(!
N1&!
N3);
Q1=(N1&!
N2);
Q2=(!
N3&N1);
Q3=(N3&N1);
Q4=(N3&!
N2);
值得注意的是,我们的D触发器在实现时,用了一个关键字就是PINNODE,在Cupl种,PINNODE可以指引脚,这种引脚可以作为中间变量使用,因此我们就用了PINNODE。
把文件敲好后,就可以在Protues里仿真了,正好是一个节拍发生器。