第五章 MAX+PLUSⅡ的高级使用

更新时间:2024-07-11 19:49:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一部分CPLD器件及开发系统的使用

第五章 MAX+PLUSⅡ的高级使用

在第三章MAX+PLUSⅡ的基本应用已经介绍了MAX+PLUSⅡ基本的、通用的特性,包括文件编辑、综合仿真等内容。但由于不同的CPLD/FPGA器件的资源和性能都有所不同,而且多种设计方法综合利用也有助于提高设计速度和设计质量,因此本章结合这些方面的内容介绍MAX+PLUSⅡ更高级的使用。

5.1 波形输入编辑

逻辑电路的波形输入:打开MAX+PLUSⅡ,用鼠标点击新建,在图5-1中选择

选择*.WDF文件 图5-1 波形编辑启动界面

“Waveform Editor”,在下拉框中选择”“.wdf”扩展名,然后“OK”即可启动波形编辑界面,如果编辑简单输入、输出逻辑关系,使用波形编辑输入比较简单。如果输入、输出之间的关系比较复杂,使用波形编辑输入比图形输入和语言编辑要复杂。但如果只知道输入、输出波形,而不知道具体电路时,采用波形编辑就显得非常有用。

例:用波形编辑输入设计一个“或”逻辑关系

启动波形界面后(如图5-2),用鼠标双击编辑区的空白处,在弹出的对话框中添入输入、输出名称如a,b,c等。每输入一个名称,都要在同一界面中选择“INPUT”或“OUTPUT”如图5-3所示。本例中定义的输入、输出信号如图 5-2所示。下面就图5-2、5-3中的各个选项的含义及使用步骤介绍如下: 1、在“Node Name:”框输入信号名称,在“Default Value”中输入默认值。

138

第一部分CPLD器件及开发系统的使用

图5-2 波形编辑界面

图5-3 波形编辑中信号定义界面

默认值的类型可以是‘0’、‘1’、‘X’、‘Z’四种。如果信号是数组的形式定义

139

第一部分CPLD器件及开发系统的使用

的,则可以在波形界面利用“Ungroup”展开后,双击单个信号进行修改。默认值一般只用来仿真,综合后默认值都为0。输入信号为数组时其命名规则与AHDL的规则相同。

2、设置输入、输出类型

在“I/O Type”中选择信号的输入、输出类型。其中“Buried Node”与AHDL语言中的“Variable”子段的含义相同,是定义内部变量。 3、设置节点类型(Node Type)

如果信号设为输入类型,在节点类型中可以为“Pin Input”和“Machine”两种。如果信号为输出或“Buried Node” 类型,则可以选择寄存器类型(“Registered”)、组合类型(“Combinatorial”)或状态机类型(“Machine”)。如果选择了寄存器类型还要继续设置它的时钟(CLOCK)、预置端(Preset)和复位端(Reset)。 4、编辑信号的波形

将的信号“a”,“b”分别加激励信号图5-2中所示。输出信号“c”按“或”逻辑给出输出波形,用鼠标选中波形工具栏工具信号。如图所示编辑完成后,就可以编译、下载。 5、用波形输入法编辑四位加法器:

四位加法器在组合逻辑波形输入法中是一个比较复杂的,这里演示的目的无非说明较复杂的逻辑电路用波形编辑的方法,它比较有代表性。和图5-2、5-3的编辑方法一样,用鼠标双击空白编辑区,在弹出的对话框输入“a[3..0]”,“b[3..0]”,并定义为输入,“c[3..0]”定义为输出。输入波形要遵循这样一个原则,就是“a[3..0]”和“b[3..0]”在变化范围内,它们的每一次变化都能碰到,也就是说:当b[3..0]=0时,“a[3..0]”要从0变化到15,并给c[3..0]设置确定的值,b[3..0]=1,“a[3..0]”同样要从0变化到15,依次变化直到重新b[]=0为止。按照加法运算规则将“c[3..0]”的数据变化波形画好。如图5-4所示编译后,进行器件指定和管脚分配,重新编译就可以下载试验。

就可以很好地编辑各个

图5-4 四位加法器的波形输入

140

第一部分CPLD器件及开发系统的使用

6、 时序电路的波形输入

时序电路的波形输入和逻辑电路的波形输入基本相似,不同之处就是时序电路的波形输入需要用到触发器,且需要为触发器添加时钟,下面以12归1数字钟电路的设计为例进行介绍。在波形编辑区双击鼠标左键,在跳出的界面添入时钟“inclk”,“m[3..0]”,“n[3..0]”。其中“inclk”设为输入,“m[3..0]”、“n[3..0]”为输出,并设定为“register”类型,将“m[3..0]”、“n[3..0]”的时钟指定为“inclk”。其波形如图所示。如果一个周期的波形编辑完成后,时钟尚有多余的波形,可以把对应的多余的“m[]”和“n[]”都 设定为“x”。之后,就可以进行编译、器件指定、管脚分配和下载试验。同样在波形编译完成后,可以形成模块,方法和图形输入法,文本输入法形成模块

图5-5 计数器的设计输入

的方法一致。 7、 符号编辑:

由于利用波形编辑同样可以生成默认的符号和“Default Include File”以便在图形编辑、语言编辑中继续使用。为了能更好的使用已编辑的符号,有必要将形成的符号在符号编辑器中进行调整。符号编辑的目的一般是针对在图形编辑、波形编辑、文本编辑时形成的模块进行重新编辑,可以使模块使用更方便,更美观。如图可以用鼠标拖动输入、输出进行位置排列,然后重新编译,就可以生成美观实用的模块。

5.2 图形输入、文本输入、波形输入的综合应用

1、用图形输入法和波形输入法编辑的内容,只要生成模块就可以在文本编辑时使用。具体使用有两种方法:(1)如果在图形编辑和波形编辑时生成的是普通的默认模块(通过“Create default Symbol 产生),在文本编辑时在Subdesign

141

第一部分CPLD器件及开发系统的使用

关键字之前采用“Function(输入1,输入2,…) Return(输出1,输出2,…)的方式引用。(2)如果在图形编辑和波形编辑时生成的是“include”的默认模块(通过“Create include default Symbol 产生),在文本编辑时在Subdesign关键字之前采用 “Include 模块名.inc”的方式引用。如在图形编辑时形成的xadd8八位全加器的模块和在波形编辑时形成的12归1的include模块,在文本编辑时的引用如下例所示:

FUNCTION xadd8 (a[7..0],b[7..0],ci) RETURNS (s[7..0],co); subdesign xadd16

(ci,ma[15..0],mb[15..0]:input; co,s[15..0] ) variable

mxadd8,nxadd8:xadd8;

coa:node; begin

mxadd8.a[]=ma[7..0]; mxadd8.b[]=mb[7..0]; mxadd8.ci=ci; coa=mxadd8.co;

s[7..0]=mxadd8.s[7..0]; ----------------------- nxadd8.a[]=ma[15..8]; nxadd8.b[]=mb[15..8]; nxadd8.ci=coa; s[15..8]=nxadd8.s[]; co=nxadd8.co; end;

在例子中引用了用图形编写的八位全加器形成的普通模块,然后在文本编辑时引用,生成16为全加器,但在具体使用之前也就是在关键字“begin”之前一定要先定义变量,然后用变量引用。如程序中的如下两句: variable

mxadd8,nxadd8:xadd8;

142

:output;

第一部分CPLD器件及开发系统的使用

如果是生成的“include”模块,程序如下: include\subdesign xadd16

(ci,ma[15..0],mb[15..0]:input; co,s[15..0] ) variable

mxadd8,nxadd8:xadd8; coa:node; begin

mxadd8.a[]=ma[7..0]; mxadd8.b[]=mb[7..0]; mxadd8.ci=ci;coa=mxadd8.co; s[7..0]=mxadd8.s[7..0]; -----------------------

nxadd8.a[]=ma[15..8];nxadd8.b[]=mb[15..8];nxadd8.ci=coa; s[15..8]=nxadd8.s[]; co=nxadd8.co; end;

可见除了第一条语句更换外,其它的语句完全一样。

下面是利用波形编辑生成的12归1 “include”模块生成60进制、12归一电路:

include \subdesign countx (inclk :input;

outa[6..0],outb[6..0],outc[6..0],outd[6..0]:output; ) variable

a[3..0],b[3..0]:dff; fp:node; mn12t:12to1s; begin

(a[],b[]).clk=inclk; mn12t.inclk=fp;

143

:output;

第一部分CPLD器件及开发系统的使用

if a[]==9 then a[]=0;

if b[]==5 then b[]=0; fp=vcc; else

b[]=b[]+1;fp=gnd;end if; else

a[]=a[]+1;b[]=b[]; fp=vcc;

end if; Table

a[3..0]=>outa[6..0]; h\ h\ h\ h\ h\ =>h\ h\ =>h\ h\ =>h\ h\ h\ =>h\ h\

h\ =>h\ h\ =>h\ h\ h\

=>h\

h\ h\ =>h\End table; Table

b[3..0]=>outb[6..0]; h\ h\ h\

144

第一部分CPLD器件及开发系统的使用

h\ h\ =>h\ h\ =>h\ h\ =>h\ h\ h\ =>h\ h\

h\ =>h\ h\ =>h\ h\ h\

=>h\

h\ h\ =>h\End table; Table

mn12t.n[]=>outc[]; h\ h\ h\ h\ h\ =>h\ h\ =>h\ h\ =>h\ h\ h\ =>h\ h\

h\ =>h\ h\ =>h\ h\ h\

=>h\

h\ h\ =>h\End table; Table

145

第一部分CPLD器件及开发系统的使用

mn12t.n[]=>outd[]; h\ h\ h\ h\ h\ h\

=>h\ =>h\

h\ h\ h\ h\ h\ h\

=>h\ =>h\ =>h\ =>h\

h\

h\ h\ h\ =>h\End table; end;

当然,利用文本编辑形成的模块在文本编辑时使用的方式和上面介绍的一样。 2、 波形编辑、和文本编辑形成的模块在图形编辑时使用 先用AHDL语言编辑7段译码显示电路如下: subdesign 7ss

(a3,a2,a1,a0 :input; outa[6..0]:output; ) begin

(a3,a2,a1,a0)=>outa[6..0]; h\ h\ h\ h\ h\ h\

=>h\ =>h\

146

第一部分CPLD器件及开发系统的使用

h\ h\ h\ h\ h\

=>h\ =>h\ =>h\ =>h\ =>h\

h\ h\

h\ h\ h\ =>h\End table; end;

编译后形成普通模块,7ss。

打开图形编辑界面,分别调用如图所示的74290两个,与门,波形编辑形成的

图5-6 在语言编辑、波形编辑中形成的符号在图形编辑下使用

模块12to1和用文本编辑形成的模块7ss,将电路如图连接,进行编译。然后

147

第一部分CPLD器件及开发系统的使用

可以指定器件和管脚分配。重新编译后就可以进行仿真和下载试验。

5.3 MAX+PLUSⅡ中LPM宏单元库的使用

5.3.1 使用LPM宏单元库

LPM宏单元库是参数化的模块库,是为不同的设计者为了不同的电路设计要求而制定的,是优秀的版图设计和软件设计的结晶。采用LPM器件,只要修改其某些参数就可以达到设计要求。LPM宏单元库中,各种类型的器件比较丰富,目前该库中包含有25中器件,基本含盖不同设计的各种用途。用LPM宏单元进行设计和其它方式设计一样,都和具体器件无关。具体的LPM函数如下所示:

1、门单元函数:

lpm_and

参数化与门

lpm_bustri 参数化三态缓冲器 lpm_clshift 参数化逻辑移位器 lpm_constant 参数化常量产生器 lpm_decode lpm_inv lpm_mux busmux mux

lpm_or lpm_xor 2、算术运算函数

lpm_abs

参数化绝对值函数 参数化加减函数 参数化比较器 参数化计数器 参数化乘法器 参数化触发器 参数化锁存器

参数化RAM(输入、输出分开) 参数化单端口RAM 参数化ROM

lpm_add_sub lpm_compare lpm_counter lpm_mult lpm_ff

参数化译码器 参数化取反器 参数化选择器

参数化总线选择器 多路选择器 参数化或门 参数化异或门

3、具有存储功能的函数

lpm_latch lpm_ram_dq lpm_ram_io lpm_rom

lpm_shiftreg 参数化移位积存器

148

第一部分CPLD器件及开发系统的使用

4、用户定制函数

csfifo csdpram

参数化先进先出队列 参数化双口RAM

这些函数,在设计时使用方便,但需要花一点精力研究其内部参数。下面以lpm_mult为例介绍宏函数的使用。(lpm宏函数库所在的目录\\maxplus2\\max2lib\\mega_lpm)。如图4.8所示:打开图形编辑界面,双击空白处,在弹出的对话框中选择\\maxplus9.6\\max2lib\\mega_lpm\\*,打开lpm宏函数库选择lpm_mult宏函数,该图形分为两个部分,基本电路图形和参数化框,下面将分别介绍:参数化框的内容如下:

图5-7 LPM宏函数的使用

输入数据dataa[]是否为常数 输入数据datab[]是否为常数 流水线阶数 符号说明

输入数据 dataa[]的位数 输入数据 datab[]的位数

INPUT_A_IS_CONSTANT INPUT_B_IS_CONSTANT LPM_PIPELINE= LPM_WIDTHA= LPM_WIDTHB=

LPM_REPRESENTATION

LPM_WIDTHP=( LPM_WIDTHA +LPM_WIDTHB) 输出数据 result[]的位数 LPM_WIDTHS=(LPM_WIDTHA) 当有多个乘法器级联时低级乘法器向本

级乘法器的进位位的宽度,该宽度应和

149

第一部分CPLD器件及开发系统的使用

LPM_WIDTHA一致。该项为可选项,如果只有一个乘法器,本项可以不选。

MAXIMIZE _SPEED

编译时优化的等级,可以从0到10之间选择等级,设定后MAX+PLUSⅡ在编译时会在速度和面积之间平衡。

USE_EAB

=

是否使用EAB单元。

其它还有aclk异步时钟,clken时钟使能,clock同步时钟。这些也都是可选项,可以选也可以不选。

双击参数化框,在弹出的界面中将每一个参数设定为合适的值如图5-8

图5-8 LPM宏的参数化框设置

本例设定好的参数如下图所示:其中在编辑最后一项“USE_EAB=”时要注意,只能添入“ON”或“OFF”,而且要根据不同的器件进行选择,如器件为“MAX7000”、“MAX9000”、“FLEX6000/8000”等器件本身没有“EAB”宏单元,因此只能选择

150

第一部分CPLD器件及开发系统的使用

“OFF”,即使选择“10K10”系列,也要看器件所带的“EAB”是否放得下8X8的乘法器,如果不能,也只能选择“OFF”。具体参数的设置可以参照上面介绍的内容,设置后在添加输入、输出时,一定要注意输入、输出应与参数化框中设定的位宽一致。设置后的界面如图5-9所示:

图5-9 参数化乘法器的设计

5.3.2 参数化模块在文本编辑中的使用

在AHDL语言使用参数化模块时要先用 “include”语句将宏函数包含进文本编辑中,在variable 中用with语句进行参数设置。 include\subdesign multx

(a[7..0],b[7..0],c[7..0]:input; s[15..0]:output; ) variable

mmut:lpm_mult with(LPM_WIDTHA=8, LPM_WIDTHB=8, LPM_WIDTHP=16, LPM_WIDTHS=8,

lpm_result=15,eab=\begin

mmut.dataa[]=a[]; mmut.datab[]=b[]; mmut.sum[]=c[];

151

第一部分CPLD器件及开发系统的使用

s[]=mmut.result[]; end;

可见,只要作一些简单的设置就可以很好的使用宏函数。其实,不仅宏函数可以这样引用,mf库的所有模块都可以这样引用,因为不需要参数设置,所以使用起来更简单。下面的程序演示7400在文本编辑时的引用,这里只是起到抛砖引玉的作用,该库中其它模块可以采用同样的方法引用。 include\subdesign nad2 (a,b:input; c:output; ) variable m7400:7400; begin

m7400.2=a; m7400.3=b; c=m7400.1; end;

5.4 CPLD中内嵌RAM块EAB的使用

内嵌RAM块EAB是ALTERA公司CPLD产品中的精华部分,它可以实现CPLD其它部分无法文成的工作,由于其优越特性,所以倍受设计人员的青睐。模块化宏函数库中大部分函数都可以使用EAB,但最具典型的当属LPM_ROM和LPM_RAM的使用,这里将详细介绍ROM与RAM的使用。 1、LPM_ROM的使用

(1) LPM_ROM在图形编辑中的使用

打开图形编辑界面,双击编辑区的空白处,在弹出的对话框中选择\\maxplus10.0\\max2lib\\mega_lpm库,在库中选择LPM_ROM,点击OK,LPM_ROM的图形及参数框如图5-10所示。

图5-10 LPM-ROM的参数化模块

152

第一部分CPLD器件及开发系统的使用

具体的参数设置如图5-11所示:

图5-11 LPM-ROM参数化框的设置

是否必需

是 否

描述

寻址ROM的地址

如果address[]是同步寄存器 类型,则inclock为地址的同 步时钟,address[]为异步类型,inclock可以不用。

下面是参数的具体介绍: 端口 address[] inclock

outclock

153

如果数据输出是同步寄存器

第一部分CPLD器件及开发系统的使用

Memenab 否 q[]

否 LPM_WIDTH

是 LPM_WIDTHAD 是 LPM_NUMWORDS

否 LPM_FILE

是 LPM_ADDRESS_CONTROL

LPM_OUTDATA

LPM_HINT

LPM_TYPE 否 功能描述:

(1) ROM内容的同步读取:

时钟 使能端 OUTCLOCK MEMENAB X

L 无时钟 H 有时钟

H

类型,则outclock为地址的同步时钟,address[]为异步类型,outclock可以不用。

输出数据使能。 数据输出端。 输出数据宽度。 寻址的地址宽度。

数据深度,一般指组合ROM块 中有多少位数据。

是ROM的初始化文件名,其扩 展名mif或hex。

确定address[]是否是寄存器 类型,其参数是字符型,为 REGISTERED,\和\三种类型,默认值 为REGISTERED类型。

确定 q[]是否是寄存器类型, 其参数是字符型,为UNUSED\, REGISTERED,\ 和\三种类型,默认值

为REGISTERED类型。

是否在VHDL语言编辑中指定

ALTERA特定参数默认值为 “unused”。

在VHDL语言编辑中标识实体 名。

功能 (Function) q[]为高阻状态。 q[]保持不便。

q[]在时钟上升沿装入address[]对应ROM 单元内容。

154

第一部分CPLD器件及开发系统的使用

(2) ROM内容的异步读取:

使能端 MEMENAB L H

功能描述 (function) q[]为高阻状态 数据装入q[]。

参数按以上描述设置完成后,加上输入、输出管脚如图5-12所示:

图5-12 LPM-ROM设置后的界面

在编译的过程中,会在编译信息框有一个警告,如下图5-13的内容:这说

图5-13 编译器没有找到mif 文件后的警告信息

明目前给LPM_ROM指定的文件“7sgmt.mif”没有找到,这是由于该文件目前并不存在造成的。解决的办法有两种,一种是按照“*.mif”文件的格式,在参数化框中指定的路径用记事本编辑一个同名的“*.mif”文件,或用计算机高级语言根据设计用途生成“*.mif”文件。第二种在MAX+PLUSⅡ菜单下点击simulator子菜单,这时将在主菜单中出现Initialize菜单,激活该菜单的下拉菜单Initialize memory之后就会跳出一个含有表格的界面,按照设计要求填写存储器初时化表格,也可以将已有的mif文件导入后进行编辑。如图5-14所示:

155

第一部分CPLD器件及开发系统的使用

图5-13 LPMROM的初始化设置

在表格中按顺序添好所需内容,点击Export File 在弹出的对话框中取名

图5-14 将LPMROM的初始化导出

和LPM_ROM参数化框LPM_FILE指定的文件一致,就可以编译使用了。如图所示。

(2)LPM_ROM在文本编辑中的使用

156

第一部分CPLD器件及开发系统的使用

该函数在文本编辑中的使用与普通的参数化宏函数使用方法一样,下面例子:正弦波全波函数发生器

化框的内容,并加入如图中所示的输入、输出。编译并形成Include

利用该函数用AHDL语言编写一个正弦波全波函数发生器:

(1) 先在图形编辑输入方式,编辑如图所示的电路,参数设置如图中参数

图5-15 利用LPMROM生成波形函数发生器

模块,新建AHDL语言的文本输入界面,在文本编辑中引用该模块,如下面的程序所示:

include \subdesign sin

(inclk :input; qout[10..0] :output; ) variable

addr[7..0],fh :dff; mem :trom; Begin

mem.a[7..0]=addr[7..0]; mem.inclk=inclk; fh.clk=inclk; addr[].clk=inclk; if addr[]==179 then addr[]=0;fh=!fh; else

addr[]=addr[]+1;

fh=fh;

157

第一部分CPLD器件及开发系统的使用

end if; if fh==0 then

qout[]=(0,mem.qout[])+1000; else

qout[]=1000-(0,mem.qout[]); end if; end ;

sin.mif文件如下: Width=10; DEPTH=255;

ADDRESS_RADIX=DEC; DATA_RADIX=DEC; CONTENT BEGIN 0 : 0; 2 : 35; 4 : 70; 8 : 139;

1 : 17; 3 : 52; 5 : 87; 7 : 122; 9 : 156; 11 : 191; 13 : 225; 15 : 259; 17 : 292; 19 : 326; 21 : 358; 23 : 391; 25 : 423; 27 : 454; 29 : 485; 31 : 515; 33 : 545; 35 : 574; 37 : 602; 39 : 629;

41 : 656;

158

6 : 105; 10 : 174; 12 : 208; 14 : 242; 16 : 276; 18 : 309; 20 : 342; 22 : 375; 24 : 407; 26 : 438; 28 : 469; 30 : 500; 32 : 530; 34 : 559; 36 : 588; 38 : 616; 40 : 643;

第一部分CPLD器件及开发系统的使用

42 : 669; 44 : 695; 46 : 719; 48 : 743; 50 : 766; 52 : 788; 54 : 809; 56 : 829; 58 : 848; 60 : 866; 62 : 883; 64 : 899; 66 : 914; 68 : 927; 70 : 940; 72 : 951; 74 : 961; 76 : 970; 78 : 978; 80 : 985; 82 : 990; 84 : 995; 86 : 998; 88 : 999; 90 : 1000; 92 : 999; 94 : 998; 96 : 995; 98 : 990; 100 : 985; 102 : 978; 104 : 970; 106 : 961; 108 : 951;

43 : 682; 45 : 707; 47 : 731; 49 : 755; 51 : 777; 53 : 799; 55 : 819; 57 : 839; 59 : 857; 61 : 875; 63 : 891; 65 : 906; 67 : 921; 69 : 934; 71 : 946; 73 : 956; 75 : 966; 77 : 974; 79 : 982; 81 : 988; 83 : 993; 85 : 996; 87 : 999; 89 : 1000; 91 : 1000; 93 : 999; 95 : 996; 97 : 993; 99 : 988; 101 : 982; 103 : 974; 105 : 966; 107 : 956;

109 : 946;

159

第一部分CPLD器件及开发系统的使用

110 : 940; 112 : 927; 114 : 914; 116 : 899; 118 : 883; 120 : 866; 122 : 848; 124 : 829; 126 : 809; 128 : 788; 130 : 766; 132 : 743; 134 : 719; 136 : 695; 138 : 669; 140 : 643; 142 : 616; 144 : 588; 146 : 559; 148 : 530; 150 : 500; 152 : 469; 154 : 438; 156 : 407; 158 : 375; 160 : 342; 162 : 309; 164 : 276; 166 : 242; 168 : 208; 170 : 174; 172 : 139; 174 : 105; 176 : 70;

111 : 934; 113 : 921; 115 : 906; 117 : 891; 119 : 875; 121 : 857; 123 : 839; 125 : 819; 127 : 799; 129 : 777; 131 : 755; 133 : 731; 135 : 707; 137 : 682; 139 : 656; 141 : 629; 143 : 602; 145 : 574; 147 : 545; 149 : 515; 151 : 485; 153 : 454; 155 : 423; 157 : 391; 159 : 358; 161 : 326; 163 : 292; 165 : 259; 167 : 225; 169 : 191; 171 : 156; 173 : 122; 175 : 87; 177 : 52;

160

第一部分CPLD器件及开发系统的使用

178 : 35; 180 : 0;

179 : 17;

正弦波的精度与所存储的数据数量有关,数据量越大波形越细腻。指定

器件、分配管脚、编译,如果硬件实验箱有十位D/A转换,就可以下载试验。 2、LPM_RAM的使用

在maxplus2\\maxp2lib\\mega_lpm库中目前有三种模块可以选择,分别是LPM_RAM_IO、LPM_RAM_DQ、LPM_RAM_DP。它们的主要区别是LPM_RAM_IO输入、输出为单一的双向I/O口,输入、输出共用一套地址线,使用方式与普通RAM(6116)很类似。LPM_RAM_DQ输入、输出共用双向I/O口,但地址线是两套,即数据输入时使用输入地址线,输出时使用输出地址线,由于地址线分开使用可以部分提高读写速度,简化设计。LPM_RAM_DP可以构建双端口RAM,输入、输出完全分开可以充分发挥CPLD/FPGA处理速度高,以及并行处理的特点,提高数据的吞吐量。

LPM_RAM使用如下图所示,其参数的设定和LPM_ROM基本相同,这里不在详述。下面就LPM_RAM的典型应用以举例的方式介绍。

(1)LPM_RAM_IO模块的使用:由于LPM_RAM_IO的读写方式与普通RAM的读写类似,可以利用LPM_RAM_IO构建单片机的外扩RAM。如图5-16所示设置LPM_RAM_IO的参数化框,其设置方式与LPM_ROM的设置类似,但有一点需要注意的是与“dio[]”相连的一定要为双向I/O。LPM_RAM_IO的读写可以为同步方式,也可以为异步方式,它们之间的区别是否使用同步时钟,异步方式控制线的描述如下:

memenab we

outenab

功能

L X X 高阻状态 H L H

H H L 写

图5-16 LPM_RAM_IO的使用

161

第一部分CPLD器件及开发系统的使用

将图5-16的电路形成默认的“yy.inc”文件,再用语言描述将锁存器加入即可形成一个标准的4K RAM。语言描述如下: INCLUDE \SUBDESIGN DPJRAM

(ale,rd,wr,pc[3..0],CS:input;

pa7,Pa6,pa5,pa4,pa3,pa2,pa1,pa0 :bidir; ) variable myy: yy; md[7..0]:LATCH; begin

md[].ENA=ale; md[]=pa[7..0]; myy.ad[7..0]=md[]; myy.ad[11..8]=pc[3..0]; myy.rd=rd; myy.we=wr; myy.cs=cs;

pa[7..0]=myy.dio[]; end;

上面的程序采用AHDL语言编写,用VHDL语言编写略有差别,这里不在介绍。将上面的程序形成默认的符号后,与8051单片机的连接方式如图5-17所示:其中ale、rd、wr分别与单片机的ALE、RD、WR相对应,pc[3..0]与单片机的P2口的低四位对应,pa0—pa7与单片机的P0对应。

图5-17 DPJRAM与单片机的连接

162

第一部分CPLD器件及开发系统的使用

(2)LPM_RAM_DP的使用

由于LPM_RAM_DP的读写完全分开处理,因此在信号发生器、信号处理等领域获得广泛应用。下面就利用LPM_RAM_DP设计任意信号发生器的介绍作一些简单介绍。本例是利用计算机高级语言VB产生所需要的任意波形,并生成符合LPM_RAM_DP格式的“*.mif”文件,通过PC 机与单片机通信将数据送给CPLD的LPM_RAM_DP存储器。并通过单片机调节形成直接数字信号合成器(DDS)。单片机与PC的串行口通过MAX232相连,由于是标准电路,这里没有电路图。单片机与CPLD的连接电路如图5-18所示,inclk为LPM_RAM_DP数据的读取时钟,p0[7..0]为单片机的p0口,pc[7..0]为单片机的p0口通过74373锁存后得到的地址,wr与单片机的wr相连。

图5-18

单片机与LPM_RAM_DP的连接电路

单片机与PC通过CPLD连接电路如图5-19所示,pctxd是PC串口的发送端, pcrxd是PC机的数据接收端, dtxd单片机的数据发送端, drxd是单片机的数据接收端。Retk是外接开关,通过dreset接到单片机的复位端。通过调节读取时钟inclk即可调节输出信号的频率。

地址发生器addcont中的ahdl语言程序设计如下: subdesign addcont

163

第一部分CPLD器件及开发系统的使用

(inclk:input; add[7..0]:output; ) variable fp[3..0],f:dff; add[7..0]:dff; begin

(fp[],f).clk=inclk; if fp[]==6 then fp[]=0; f=!f; else

fp[]=fp[]+1; f=f; end if; add[].clk=f; add[]=add[]+1; end;

--da转换频率调节系数

图5-19 单片机与PC通信接口及地址锁存电路

单片机通信通信波特率与PC机的一致都为57600,由于PC机是多用途的波

164

第一部分CPLD器件及开发系统的使用

形生成器,单片机读取时只截取数据部分,将从PC机上读取的数据传送给CPLD的LPM_RAM_DP,CPLD通过地址发生器产生地址将LPM_RAM_DP数据送给D/A转换。程序设计如下:

ORG 0000H

SJMP MAIN ORG 0023H JB RB8 ,QU MOV A,SBUF MOVX @DPTR,A INC DPTR DJNZ R0,QU MOV R0,#00H MOV DPTR,#0000H CLR RI RETI

MOV TH1,#0FfH MOV TL1,#0FfH MOV SCON,#11010000B MOV PCON,#00H MOV DPTR,#0000H MOV R0,#00H SETB TR1 SETB ES SETB EA SJMP $ END

QU:

MAIN: MOV TMOD,#20H

由于PC机软件设计部分程序内容很多,这里不在详细介绍,只把波形生

成界面介绍如下:界面如图5-20,可以选择正弦拨、方波、三角波、锯齿波等,也可以选择自定义波形。在波形界面中鼠标左键点击图形上的某一点即可测量该点的电压和相位,电压归一化为0-5v。选择自定义波形,在图5-21的对话框输入所需的波形的函数,如sin(x)+sin(3*x)/3+sin(5*x)/5+sin(7*x)/7函数,点击“确定”后,计算机将进行计算形成BYTE类型数据(0-255),并在波形区域画出波形,如图5-22所示:

165

第一部分CPLD器件及开发系统的使用

图5-20 波形编辑界面

图5-21 自定义函数发生器

166

第一部分CPLD器件及开发系统的使用

图5-22 自定义函数波形

选择合适的通信口和波特率并点击发送数据后,即可以在示波器上观察信号

波形。

5.5 自定义参数化模块的方法

在文本编辑输入中可以PARAMETERS(参数1=默认值, 参数2=默认值,…. 参数n=默认值)进行自定义参数化模块的编辑; PARAMETERS(参数1=默认值, 参数2=默认值,…. 参数n=默认值)在文本中要放在subdesign关键字之前。如果在数组中使用参数n,且为n-1的方式,则n的默认值要大于或等于一。下面的程序演示了自定义参数化模块的方法。 PARAMETERS

(m=1,n=1,q=2); subdesign addx

(a[m-1..0],b[n-1..0]:input; s[q-1..0]

:output;

167

第一部分CPLD器件及开发系统的使用

) begin

s[]=(0,a[])+(0,b[]); end ;

编译后,并形成模块。新建图形编辑文件,并调用该模块如下图所示:

图5-23 参数化模块的设计与使用

参数设置和LPM宏函数的设置相同,设置完成后就可以编译,这样就可以很方便地形成八位加法器。其它函数的编写过程和上例类似。

5.6 宏函数插件设计向导

宏函数插件设计向导是max+plusⅡ10.0版本的新特性。从上节内容可以看出利用LPM宏函数设计可以利用max+plusⅡ库中的成果,简化设计过程,但宏函数的参数配置仍然比较复杂。如果利用宏函数插件设计向导可以简化参数框的填写,并且可以实现用HDL语言难以描述的设计。下面以32位除以16位的除法器的设

168

第一部分CPLD器件及开发系统的使用

计为例介绍宏函数插件设计向导使用步骤。

1、在图形编辑界面双击鼠标左键后的界面如图5-24所示:

在图形编辑界面下双击鼠标左键 创建一个新的定制宏函数,点击“NEXT” 下一步操作见图5-25

图5-24 宏函数插件设计向导的使用

输入设选择一种设计语言 计文件名称,点击NEXT。 下一个选择LPM-DIVIDE 操作步骤见图5-26

图5-25 选择宏函数类型

169

第一部分CPLD器件及开发系统的使用

选择分子的数据位数32位 选择分母的数据位宽16选择分母的最小值(最小值不能为0),合适的最小值可以优化设计 点击NEXT,见图5-27

图5-26 设置除法器的参数

图5-27 流水线的设置

点击Finish完成向导设计步骤

图5-28 向导形成四个设计文件

上述操作步骤完成后,回到“Enter Symbol”界面,如图5-29,点击OK,即

170

第一部分CPLD器件及开发系统的使用

可得到din32_16的逻辑符号,在图形编辑界面下添加输入、输出即可使用。

点击OK,即可得到din32_16的逻辑符号

图5-29 生成设计逻辑符号

5.7 设计的优化

1、资源优化原则:资源优化是指在完成同样功能的前提下,使用的逻辑单元最少的原则。优化的方法主要有两种:一是调整设计结构改善资源的利用率,二是利用CPLD开发环境优化综合效果。

(1)调整设计结构改善资源利用率:在使用乘法器,除法器等比较大型的结构时一定要注意结构的配置,不同的结构其资源的利用率差别很大。例如有两个12位乘以8位乘法器MULT A和MULT B,其中12的输入端为常数(假设十进制数3500),两个乘法器的输出结果由数据选择器选择输出,其设计电路可以为图5-30的方式。从图5-30可以看出电路是满足设计要求的。但是不是最佳设计?显然不是,如果将电路简单变换成图5-31的方式,同样满足设计要求,但整个电路却优化掉了一个12位乘以8位的乘法器,而且数据选择器的位宽也由20位变为8位。由于乘法器的12位输入端是常数,因此可以继续利用LPM_CONSTANT进行优化。优化后的结果在max+plus的综合后的报告文件中可以看出。这里仅举一个简单的例子,此类的问题在图形编辑、HDL语言编辑中都会碰到,因此在设计时应多注意设计技巧的使用。

171

第一部分CPLD器件及开发系统的使用

MULT A MULT B

图5-30 优化前的设计

图5-31 优化后的设计

(2)改并行处理为串行处理:在使用HDL语言编程时往往会遇到多次乘法、除法等运算,如果全部采用并行处理会消耗大量的资源,本来较小容量的器件就可以完成的运算,不得不采用更多门数的器件才可以完成。如果运算速度允许的前

172

第一部分CPLD器件及开发系统的使用

提下,可以采用状态机分步运行,使并行处理该为串行处理。下面以16位的乘法为例介绍

例:采用单一并行16位的乘法器,如下图所示:

图5-32 并行16位乘法器

如果选择10K10器件,从编译结果可以看出需要733个逻辑单元,而10K10器件只能提供576个逻辑单元,因此会产生一个错误信息。如果将并行的16位乘法改成串行8位乘法分4次相乘,结果使用的逻辑单元仅为原来的1/3左右。设计如下:

a、设计八位乘法器

图5-32 8位乘法器

b、利用八位乘法器进行16位乘法器的设计,AHDL语言程序如下:

173

第一部分CPLD器件及开发系统的使用

include \

subdesign serial16x16

(inclk,start,a[15..0],b[15..0]: input; c[31..0] ) variable st[1..0]:dff; mc[31..0]:dff; multx: tmult8; begin

(st[],mc[]).clk=inclk; c[]=mc[]; case st[] is when 0=>

multx.a[]=a[7..0];multx.b[]=b[7..0]; mc[]=(0,multx.q[]); st[]=1; when 1=>

multx.a[]=a[15..8];multx.b[]=b[7..0]; mc[]=mc[]+(0,multx.q[],0,0,0,0,0,0,0,0); st[]=2; when 2=>

multx.a[]=a[7..0];multx.b[]=b[15..8]; mc[]=mc[]+(0,multx.q[],0,0,0,0,0,0,0,0); st[]=3; when 3=>

multx.a[]=a[15..8];multx.b[]=b[15..8];

mc[]=mc[]+(multx.q[],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); if start then st[]=0; else st[]=3; end if; oe=vcc;

174

,oe : output;

第一部分CPLD器件及开发系统的使用

end case; end;

2、速度优化的原则:

当设计的电路速度成为第一要素时,应当采用速度优化的原则,以提高系统(1) 添加流水线的设计方法

图5-33中利用图形编辑的方法设计两组并行八位加法器,由于没有加流水线,因此整体速度只能是82MHz。

的整体运行速度。速度优化的方法有多种,下面就几种典型的方法介绍如下:

图5-33 无流水线的加法器

图50-34 是完成上例中同样功能的加法器,但在两级加法运算中插入了一级

175

第一部分CPLD器件及开发系统的使用

流水线,因此整体运算速度可以上升到90MHz以上。如果设计的系统复杂,加入流水线的效果会更加明显。

图5-34 加入流水线后的加法运算

经过上面的例子分析可以看出流水线的概念如图5-35和图5-36所示:其中

176

第一部分CPLD器件及开发系统的使用

图5-35是无流水线的设计,图5-36是加入一级流水线后的设计。 CLK CLK

图5-36 有流水线设计

从图5-35中可以看出,由于系统的整体延时是由大的组合逻辑的延时决定,延时时间为T。整体的运行频率有T决定,因此最大频率FMAX=1/T。图5-36插入一级流水线后,将一个大的延迟组合逻辑分成两个小的组合逻辑,其中T=T1+T2(忽略触发器的延迟),TMAX=MAX(T1,T2)。虽然整个路径的延迟没变,但每各TMAX时间就会有一个结果输出,因此系统的最高频率FMAX=1/TMAX。可以看出虽然整个路径的延迟没有减小,但整体速度却提高了。图5-33、图5-34的设计正是利用了这种添加流水线的方法实现速度的提升。在复杂的组合逻辑设计中还可以插入多级流水线以实现系统速度的提升。插入流水线的方法不仅在图形编辑中可以使用,在AHDL语言、VHDL语言、Verilog HDL语言中也可以用同样的原理实现。

在插入流水线时,由于FMAX=1/TMAX,因此最好将组合逻辑分割成延迟相等的部分。如图5-36中如果T1=T2,则TMAX=T1=T2,此时TMAX为最小,因此系统的速度也达到最大值。

在一个复杂的系统中可能有多个并行的路径,并不是所有的路径都是关键路径,至于那一个路径是关键路径与所要解决的问题有关。关键路径是影响整个电

177

触发触器发锁器存 锁存

大延时的组合逻辑延时时间为T 触发器锁存 图5-35 无流水线设计 触发器锁存 小延时的组合逻辑 T1 触发器锁存 触发器锁存 小延时的组合逻辑 T2 第一部分CPLD器件及开发系统的使用

路的关键,因此在时序分析时应找出影响整个电路关键路径。如图5-37所示:

输入 2

图5-37 关键路径研究法

输入 1 延TD3 输关键路径TD 出2 迟延TD2 迟最大延迟TD1 输 出 1 从图5-37 可以在CPLD/FPGA的设计中存在两套输入、输出,如果输入2到输出2之间的速度要求很高,则它们之间的路径成为关键路径。因此主要问题是解决关键路径的延迟,也就是添加流水线的关键路径。对于非关键路径要找出最大延迟路径,对于不能满足要求的最大延迟路径,也要加流水线解决。

178

本文来源:https://www.bwwdw.com/article/zio.html

Top