VHDL评估教案.docx

上传人:b****5 文档编号:3428601 上传时间:2022-11-23 格式:DOCX 页数:14 大小:146.39KB
下载 相关 举报
VHDL评估教案.docx_第1页
第1页 / 共14页
VHDL评估教案.docx_第2页
第2页 / 共14页
VHDL评估教案.docx_第3页
第3页 / 共14页
VHDL评估教案.docx_第4页
第4页 / 共14页
VHDL评估教案.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

VHDL评估教案.docx

《VHDL评估教案.docx》由会员分享,可在线阅读,更多相关《VHDL评估教案.docx(14页珍藏版)》请在冰豆网上搜索。

VHDL评估教案.docx

VHDL评估教案

第八章仿真与逻辑综合

8.1仿真

目前流行的VHDL仿真器

MentorGraphics公司ModelSim

Aldec公司Active---VHDL

Cadence公司Verilog---XL

Altera公司MaxplusII

QuartusII等

回顾:

二选一选择器

输入端

输出端

a

b

s

Y

0

0

0

0

0

1

0

0

1

0

0

1

1

1

0

1

0

0

1

0

0

1

1

1

1

0

1

0

1

1

1

1

二选一选择器VHDL描述:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux21aIS

PORT(a,b:

INSTD_LOGIC;

s:

INSTD_LOGIC;

y:

OUTSTD_LOGIC

);

ENDENTITYmux21a;

ARCHITECTUREoneOFmux21aIS

BEGIN

PROCESS(a,b,s)

BEGIN

IFs='0'THEN

y<=a;

ELSEy<=b;

ENDIF;

ENDPROCESS;

ENDARCHITECTUREone;

编辑输入波形文件方法仿真:

EDA软件工具生产商为设计者提供了一个较为直观地生成仿真输入波形的工具——波形编辑器。

例如,Altera公司提供的MAX+plusⅡ工具软件就有这样的波形编辑器——WaveformEditor,利用它可以编辑各种各样的输入波形。

二选一选择器仿真结果

8.1.1仿真输入信息的产生

1.程序直接产生方法

由设计者设计一段VHDL语言程序,将它附加到仿真模块中,并由它来产生仿真的输入信息。

例如:

对例7-41带允许端的十二进制计数器进行仿真

真值表

输入端

输出端

clr

en

clk

qd

qc

qb

qa

1

X

X

0

0

0

0

0

0

X

不变

不变

不变

不变

0

1

计数值加1

0000→0001→0010→0011→0100→0101→0110→0111→1000→1001→1010→1011

若要产生如下所示的测试波形:

0

400ns

100

200

300

test-clk

test-clr

test-en

CONSTANTclk_cycle:

TIME:

=20ns;

PROCESS

BEGIN

test_clk<='1';

产生复位

和允许信号

产生周期为20ns

的时钟信号

WAITFORclk_cycle/2;

test_clk<='0';

WAITFORclk_cycle/2;

ENDPROCESS;

PROCESS

BEGIN

test_clr<='0';

test_en<='0';

WAITFORclk_cycle/4;

test_clr<=‘1';

WAITFORclk_cycle;

test_clr<=‘0';

WAITFORclk_cycle*10;

test_en<=‘0';

WAITFORclk_cycle*3

test_en<=‘1';

WAIT;

ENDPROCESS;

直接产生输入测试信号的完整vhdl程序:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYtest_count12enIS

ENDtest_count12en;

ARCHITECTUREsimlOFtest_count12enIS

COMPONENTcount12en

PORT(

clk,clr,en:

INSTD_LOGIC;

qa,qb,qc,qd:

OUTSTD_LOGIC

);

ENDCOMPONENT;

CONSTANTclk_cycle:

TIME:

=20ns;

SIGNALtest_clk,test_clr,test_en:

STD_LOGIC;

SIGNALt_qa,t_qb,t_qc,t_qd:

STD_LOGIC;

BEGIN

U0:

count12enPORTMAP(clk=>test_clk,

clr=>test_clr,en=>test_en,qa=>t_qa,

qb=>t_qb,qc=>t_qc,qd=>t_qd);

PROCESS

BEGIN

test_clk<='1';

WAITFORclk_cycle/2;

test_clk<='0';

WAITFORclk_cycle/2;

ENDPROCESS;

PROCESS

BEGIN

test_clr<='0';

test_en<='0';

WAITFORclk_cycle/4;

test_clr<=‘1';

WAITFORclk_cycle;

test_clr<=‘0';

WAITFORclk_cycle*10;

test_en<=‘0';

WAITFORclk_cycle*3

test_en<=‘1';

WAIT;

ENDPROCESS;

ENDsiml

2读TEXTIO文件产生法

仿真输入数据按定时要求按行存于一个文件中

Test1.in

clk

clr

en

0ns

1

0

0

5ns

1

1

1

10ns

0

1

1

15ns

0

1

1

20ns

1

1

1

25ns

1

0

1

30ns

0

0

1

35ns

0

0

1

40ns

1

0

1

…..

…...

……

……

220ns

1

0

1

225ns

1

0

0

230ns

0

0

0

235ns

0

0

0

240ns

1

0

0

…..

…...

……

……

280ns

1

0

0

285ns

1

0

1

290ns

0

0

1

295ns

0

0

1

300ns

1

0

1

…..

…...

……

……

…..

…...

……

……

…..

…...

……

……

……

FILEintest:

TEXTISIN“test.in”;

SIGNALtest_clk,test_clr,test_en:

STD_LOGIC;

CONSTANTclk_cycle:

TIME:

=20ns;

……

PROCESS

VARIABLEli:

LINE;

VARIABLEclk.clr,en:

STD_LOGIC;

BEGIN

READLINE(intest,li);

READ(li,clk);

READ(li,clr);

READ(li,en);

WAITFORclk_cycle/2;

IF(ENDFILE(intest))THEN

WAIT;

ENDIF;

ENDPROCESS;

……

仿真⊿

仿真⊿(即仿真中的⊿延时),能使那些零延时事件得到适当的排队次序,以便在仿真过程中得到一致的结果.

VHDL语言描述程序来描述系统的硬件,它所描述的仅仅是系统的行为和构造,最终表现为门电路之间的连接关系.因此,在处理中对某些部分先处理,对另外一些部分后处理并不要求有非常严格的顺序关系.

仿真Δ是在对VHDL模块仿真时所采用的重要仿真机制,它能使那些零延时事件得到适当的排队次序,以便在仿真中得到一致的结果。

众所周知,用VHDL语言程序来描述系统的硬件,它所描述的仅仅是系统的行为和构造,因此,在处理中对哪些部分先处理,哪些部分后处理,在描述时并没有非常严格的顺序关系。

例如,某一组合电路,其输入为a和b,其输出为q。

它由一个反相器、一个“与非门”和一个“与门”构成,其连接关系如图7-3所示。

用VHDL语言对该电路进行描述,其程序模块如例7-3所示。

Libraryieee;

Useieee.std_logic_1164.all;

Entitysampleis

port(a,b:

instd_logic;

q:

outstd_logic);

Endsample;

Architecturebehavofsampleis

signalc,d:

std_logic;

Begin

c<=nota;

d<=not(bandc);

q<=candd;

Endbehav;

 

在该模块的构造体中,3个语句都是并发信号代入语句,因此只要其敏感量有变化,各语句都有可能并发地执行。

现在假设起始值b=“1”、a=“1”,接着a从“1”变成“0”。

第一条代入语句的敏感量为a,故该语句将执行一次,并使信号量c由“0”变“1”。

第二、第三条语句都含有敏感量c,这样这两条语句都要各执行一次。

在仿真中,第二、第三条语句既然是并发语句,按理来说,谁先执行,谁后执行其结果应该是一样的,但是事实并非如此。

下面分析两种不同情况。

若第三条语句先执行,由于原先d=“1”,现在c=“1”,故q将由“0”变为“1”;接着执行第二条语句,由于b=“1”,c=“1”,故d由“1”变为“0”。

d的这一变化又启动第三条语句,此时,d=“0”,c=“1”,故q=“0”。

输出q出现一个由“0”变“1”,再由“1”变“0”的正跳变。

若第二条语句先执行,由于b=“1”,c=“1”,故d=“0”。

d和c的变化使第三条语句执行,此时d=“0”,c=“1”,故q=“0”。

从电路功能来看,无疑后者是正确的,即在a值由“1”变“0”的变化发生后,q值应始终维持原值“0”不变。

两种不同情况的q输出波形如图7-4所示。

 

假设信号b为1端口a的信号有个变化(1→0)

若第三条语句先执行,

d=1

c=1

再执行第二条语句

b=1

c=1

d(1→0)

q由0到1再由1到0q出现一个正跳变

若第二条语句先执行,

b=1

c=1

再执行第三条语句

d=0

c=1

q始终维持0

由上面分析可知,在仿真过程中,仿真次序不一致就会产生不同的仿真结果,这种情况当然是不允许的。

为了取得与硬件动作一致的仿真结果,必须引入一个适当的仿真同步机制,使仿真结果和处理次序的先后无关。

这种仿真同步机制就是Δ延时同步机制或称仿真Δ机制。

所谓Δ延时同步机制,是指被敏感量激活的进程立即被执行,其执行结果在一个无限小的Δ延时时间内保持。

该执行结果有可能激发其他的进程,又会产生新的其他结果,这些结果又在后续的一个Δ延时时间内保持。

如此重复,直至所有进程(或等价进程,如代入语句)都停止为止。

最后一个Δ延时输出的结果才是真正该仿真时刻的结果,其他Δ延时时刻的结果往往被忽略。

换一句话说,一个仿真时刻点是由若干个仿真Δ间隔构成的,该仿真时刻的仿真结果,取自最后一个仿真Δ时刻的结果。

这样就解决了由于仿真时计算顺序不同所带来的不一致性。

7.1.2仿真模块的编写

在早期的EDA软件工具中,如AccoladeVHDLSimulator,它要求输入信号是由程序产生的。

这样,当设计者用VHDL语言设计好一个电路功能模块以后,为了进行仿真,还需编写一个仿真模块。

当然,仿真模块应包含产生输入信息的程序以及描述电路的程序。

一个描述十六进制计数器的仿真模块清单如例7-2所示。

【例7-2】

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYT_count16IS

--PORT(clk,rst,load:

INSTD_ULOGIC;

--data:

INSTD_ULOGIC_VECTOR(3DOWNTO0);

--count:

OUTSTD_ULOGIC_VECTOR(3DOWNTO0));

ENDT_count16;

ARCHITECTUREstimulusOFT_count16IS

COMPONENTcount16

PORT(clk,rst,load:

INSTD_ULOGIC;

data:

INSTD_ULOGIC_VECTOR(3DOWNTO0);

count:

OUTSTD_ULOGIC_VECTOR(3DOWNTO0));

ENDCOMPONENT;

SIGNALclk_s,rst_s,load_s:

STD_ULOGIC;

SIGNALdtat_s:

STD_ULOGIC_VECTOR(3DOWNTO0);

SIGNALcount_s:

STD_ULOGIC_VECTOR(3DOWNTO0);

BEGIN

u0:

count16PORTMAP(clk_s,rst_s,load_s,data_s,count_s);

clock:

PROCESS

BEGIN

clk_s<='1';

WAITFOR25ns;

clk_s<='0';

WAITFOR25ns;

ENDPROCESS;

stimulus1:

PROCESS

BEGIN

Rst_s<='1';

WAITFOR40ns;

Rst_s<='0';

Data_s<="0100";

Load_s<='1';

WAITFOR50ns;

load<='0';

WAITFOR500ns;

load<='1';

data<="0000";

WAITFOR50ns;

load<='0';

WAITFOR11000ns;

WAIT;

ENDPROCESS;

ENDstimulus;

由于该模块仅仅用于仿真,所以实体中的端口描述部分是可以省略的。

该仿真模块用元件映射语句,将十六进制计数器映射到该模块的u0元件,u0元件的输入信号由构造体的两个进程产生,并连接到u0元件的各输入端,从而实现仿真的信号输入。

该模块的仿真输入信号波形和输出信号波形可在仿真器的视窗中观察到。

对于使用波形编辑器产生输入信息的仿真器,一般不需要编写仿真模块,只要有已编译好的功能模块和相对应的输入波形文件,仿真器就能自动地根据输入信号的定时关系进行仿真,MAX+plusⅡ的simulator就是这样做的。

7.1.4不同级别的仿真要求

1.行为级仿真

行为级仿真的目的是验证系统的数学模型和行为是否正确,因而在对系统描述时抽象程度较高。

由于有这个前提,对行为级仿真模块的书写没有太多限制,凡是VHDL语言中的全部语句和数据类型都可以在程序中使用。

在书写时应尽可能使用抽象程度高的描述语句,以使程序更简洁明了。

另外,除了某些系统规定的定时关系外,一般的电路延时及传输延时在行为级仿真中都不予以考虑。

2.RTL级仿真

通过行为级仿真以后,下一步就是要将行为级描述的程序模块改写为RTL描述的程序模块。

RTL级仿真是为了使仿真模块符合逻辑综合工具的要求,使其能生成门级逻辑电路。

根据目前逻辑综合工具的具体要求,有些VHDL语言中规定的语句是不能进行逻辑综合的,如WAIT、卫式语句、某些属性等(详见文献[3])。

另外,在程序中绝对不能用浮点数,尽可能少用整数,最好使用STD_LOGIC和STD_LOGIC_VECTOR这两种类型来表示数据(当然,不同类型的逻辑综合工具有不同要求)。

在RTL仿真中,尽管可以不考虑门电路延时,但是像传输延时等一些附加延时在某些情况下还应加以考虑,并用TRANSPORT和AFTER语句在程序中体现出来。

当然,在逻辑综合时,它们都将被忽略,因为综合工具是不能产生这种延时的。

3.门级电路仿真

RTL程序模块经逻辑综合以后就生成了门级电路。

既然RTL程序模块已经通过仿真,为什么还要对门级电路进行仿真呢?

这主要有以下几个原因:

第一,在RTL仿真中一般不考虑门的延时,也就是说进行零延时仿真。

在这种情况下,系统的工作速度不能得到正确的验证。

不仅如此,由于门延时的存在还会给系统内部工作过程及输入和输出带来意想不到的影响。

第二,在RTL描述中像“X”那样的状态,在描述中是可以将其屏蔽的,但是利用逻辑综合工具,根据不同的约束条件,对电路进行相应变动时,这种情况就有可能发生传播。

在门级仿真中出现这种状态是不允许的。

一般情况下,要生成门电路时,输入和输出端口只能限定使用STD_LOGIC和STD_LOGIC_VECTOR这样的数据类型

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1