[转帖]cpld的入门交流之一:GAL编程
最近有时间学学CPLD,很惭愧没能学好学透,但对于我预先想做的工作课题已经可以对付了。不求锦上添花,但求能解决实际问题。<br>我认为学习CPLD首先有必要了解一下GAL的编程,虽然他们的语言可能不同,但是基本的程序思路、结构、需要表达的方法有很多类似的<br>地方,马马虎虎地说:N个GAL加在一起就是CPLD,严格说是不对的,但是对于没有入门之前可以简单的这样理解。所以粗略地了解一下GAL的<br>
编程对学习CPLD有很大帮助。我希望我能够讲清楚学习掌握一些基本编程,通过学习能够掌握手头的简单应用方法,而进一步的深入研究就<br>
不在入门之列了,掌握的基本方法就可以按自己的想法动手试验,然后才能步步深入。<br>GAL编程,一般可以使用ABEL语言编程,ABEL的语法基本上是由一组逻辑表达式进行叙述,一片GAL能帮我完成什么功能呢?或者说能改<br>
变成什么样的芯片呢?对GAL来说,由于内部的逻辑电路(门)比较少,一般只能完成一些简单的逻辑转换、简单的计数器(位数少)、锁存器<br>
等。一般简单来讲,GAL的可用输入比输出多,如果想用他做地址译码器是比较合适的,在单片机的应用中,往往需要用几个不同的门电路组<br>
合或加上138之类的3-8译码器组合,译出几个特定地址,这才是GAL的专长,可以在一个芯片内完成,使得你的电路简洁,而且输入输出在不<br>
违背基本约定的前提下可以随意调换,使得布板走线容易。先看看下面的一个例子:<br>
<br>
<br>module M273 "这是一个类似于74LS273的锁存器程序<br>title '8-bit Locker<br>xiaoqi Data I/O Corp.'<br>
<br>
<br>M273 device 'P16V8R'; "这里我们使用GAL16V8进行编程<br>
<br>
<br>
"引脚定义,注意CLK,OE的定义只能使用芯片约定的引脚,不能转移<br>Clk,OC,I0,I1,I2,I3,I4,I5,I6,I7 pin 1,11,2,3,4,5,6,7,8,9;<br>Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7 pin 19,18,17,16,15,14,13,12;<br>
<br>
<br>H,L,X,Z,K = 1,0, .X.,.Z.,.K.; "类似于c语言的宏定义(代数)<br>Input = ; "两个集合群定义<br>Output = ;<br>
<br>
<br>
equations " global<br>.clk = Clk; "输出与CLK有关<br>.oe = !OC; "输出受!OC才有效<br>WHEN !OC THEN "如果OC为低电平则<br>Output := Input; "受时钟触发的锁存<br>
<br>
<br>
test_vectors ' test Load & Output'<br>( -> Output) "写入芯片以后编程器需要校验的内容<br>[ K, L, ^h55 ] -> ^h55;<br>[ K, L, ^hAA ] -> ^hAA;<br>[ K, L, ^hFF ] -> ^hFF;<br>[ X, H, X ] -> Z;<br>
<br>
<br>
end M273 "本模块程序结束<br>
<br>
<br>当我基本上设计完这个GAL后,在一个具体的电路中使用他,由于布板走线的原因,我需要将其中输出线Q0与Q1对换,这可以将上面的引<br>
脚定义中的Q0,Q1的表达顺序对换一下就行了,当然这样的使用并不提倡,但说明他确实能给你带来不少的灵活性。<br>有时候我需要两组不同的互不关联的逻辑电路,我们也可以用一个GAL完成,只要引脚和内部宏单元够用,例如下面我设计了一个LED七<br>
段码的译码器,还有IO富裕,则我可以利用多余的IO设计一个简单的地址译码电路,下面的程序是为了使一般的七段码LED数码管显示多几个<br>
特殊字符,使用了5条输入数据线,多余的IO我们独立的制作了一个任意逻辑电路:<br>
<br>
<br>
module BCD7<br>
title 'LED HEX-to-seven-segment decoder<br>
Use GAL16V8. xiaoqi Jan.5.2002'<br>
" a <br>
" --- HEX-to-seven-segment decoder similar to the 7449<br>
" f| g |b<br>
" --- 笔段定义<br>
" e| d |c<br>
" ---<br>bcd7 device 'P16V8R';<br>
<br>
<br>OI2,OI1,OI0,D0,D1,D2,D3,D4 pin 7,8,9,2,3,4,5,6;<br>a,b,c,d,e,f,g,OOC pin 13,14,15,16,17,18,19,12 istype 'com';<br>
<br>
<br>bcd = ;<br>led = ;<br>
<br>
<br>ON,OFF = 0,1; " 共阳结构数码管 <br>L,H,X,Z = 0,1,.X.,.Z.;<br>
@dcset<br>
truth_table ( bcd -> [ a , b , c , d , e , f , g ])<br>0 -> [ ON, ON, ON, ON, ON, ON, OFF]; "0<br>1 -> ; "1<br>2 -> [ ON, ON, OFF, ON, ON, OFF, ON]; "2<br>3 -> [ ON, ON, ON, ON, OFF, OFF, ON]; "3<br>4 -> ; "4<br>5 -> [ ON, OFF, ON, ON, OFF, ON, ON]; "5<br>6 -> [ ON, OFF, ON, ON, ON, ON, ON]; "6<br>7 -> [ ON, ON, ON, OFF, OFF, OFF, OFF]; "7<br>8 -> [ ON, ON, ON, ON, ON, ON, ON]; "8<br>9 -> [ ON, ON, ON, ON, OFF, ON, ON]; "9<br>10 -> [ ON, ON, ON, OFF, ON, ON, ON]; "A<br>11 -> ; "b<br>12 -> ; "c<br>13 -> ; "d<br>14 -> [ ON, OFF, OFF, ON, ON, ON, ON]; "E<br>15 -> [ ON, OFF, OFF, OFF, ON, ON, ON]; "F<br>16 -> ; "H<br>17 -> ;<br>18 -> ;<br>19 -> ;<br>20 -> ;<br>21 -> ;<br>22 -> ;<br>23 -> ;<br>24 -> ;<br>25 -> ;<br>26 -> ;<br>27 -> ;<br>28 -> ;<br>29 -> ;<br>30 -> ;<br>31 -> ;<br>
<br>
<br><br>
<br>
re:truth_table ( [OI2...
truth_table ( -> [ OOC ]) "多余IO制作一个门电路<br>[ 0, 0, 0] -> [ 1 ]; "这个逻辑关系可以随意设定<br>[ 1, 0, 0] -> [ 0 ];<br>[ 0, 1, 0] -> [ 0 ];<br>[ 0, 0, 1] -> [ 0 ];<br>[ 1, 1, 0] -> [ 0 ];<br>[ 1, 0, 1] -> [ 0 ];<br>[ 0, 1, 1] -> [ 0 ];<br>[ 1, 1, 1] -> [ 1 ];<br><br>
<br>
<br>
"校对部分<br>
test_vectors ( bcd -> [ a , b , c , d , e , f , g ])<br>0 -> [ ON, ON, ON, ON, ON, ON, OFF]; "0<br>1 -> ; "1<br>2 -> [ ON, ON, OFF, ON, ON, OFF, ON]; "2<br>3 -> [ ON, ON, ON, ON, OFF, OFF, ON]; "3<br>4 -> ; "4<br>5 -> [ ON, OFF, ON, ON, OFF, ON, ON]; "5<br>6 -> [ ON, OFF, ON, ON, ON, ON, ON]; "6<br>7 -> [ ON, ON, ON, OFF, OFF, OFF, OFF]; "7<br>8 -> [ ON, ON, ON, ON, ON, ON, ON]; "8<br>9 -> [ ON, ON, ON, ON, OFF, ON, ON]; "9<br>10 -> [ ON, ON, ON, OFF, ON, ON, ON]; "A<br>11 -> ; "b<br>12 -> ; "c<br>13 -> ; "d<br>14 -> [ ON, OFF, OFF, ON, ON, ON, ON]; "E<br>15 -> [ ON, OFF, OFF, OFF, ON, ON, ON]; "F<br>16 -> ; "H<br>17 -> ;<br>18 -> ;<br>19 -> ;<br>20 -> ;<br>21 -> ;<br>22 -> ;<br>23 -> ;<br>24 -> ;<br>25 -> ;<br>26 -> ;<br>27 -> ;<br>28 -> ;<br>29 -> ;<br>30 -> ;<br>31 -> ;<br>
"附加逻辑电路校对<br>
test_vectors ( -> [ OOC ])<br>[ 0, 0, 0] -> [ 1 ];<br>[ 1, 0, 0] -> [ 0 ];<br>[ 0, 1, 0] -> [ 0 ];<br>[ 0, 0, 1] -> [ 0 ];<br>[ 1, 1, 0] -> [ 0 ];<br>[ 1, 0, 1] -> [ 0 ];<br>[ 0, 1, 1] -> [ 0 ];<br>[ 1, 1, 1] -> [ 1 ];<br>
end BCD7<br>
<br>
<br>
<br>以上两个例程都是用abel4编译的,GAL编程并不很复杂,作为一般应用,编编这样的电路就已经可以对付一阵子了。如果想动手的可以<br>
到主页上下载ABEL4软件。有关这个软件的安装使用方法,请阅读解压后的READ.ME。安装ABEL4以后,软件提供了一大堆的实例演示程序,<br>
稍作修改就可以为你解决实际需要,篡改是学习入门的捷径,试试看吧。<br>
<br>
<br>
<br>
[转自]晓奇工作室 <br>
<br>
re:莫非阁下就是传说中的晓奇?
莫非阁下就是传说中的晓奇?re:ATF1504AS-15JS44芯片。我...
ATF1504AS-15JS44芯片。我在应用中接触较多得是7128的CPLD,还有EP1K30QC208-2,虽说只有3万个逻辑门,LE也不算大,但简单的例程都没问题。你的动手能力提高了,可以选更多门数的。
页:
[1]