北理工VHDL实验报告Word文件下载.docx
《北理工VHDL实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《北理工VHDL实验报告Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
只有PROCESS,FUNCTION或PROCEDURE内的代码才是顺序执行的。
当它们作为一个整体时,与其他模块之间又是并发执行的。
以下是3个并发描述语句(stat1,stat2和stat3)的代码,会产生同样的电路结构。
stat1stat3stat1
stat2=stat2=stat3=其他排列顺序
stat3stat1stat2
(3)并行语句——进程(PROCESS)
1)语法结构:
[进程名:
]PROCESS(敏感信号列表)
[变量说明语句]
…
BEGIN
(顺序执行的代码)
ENDPROCESS[进程名];
2)PROCESS的特点
多进程之间是并行执行的;
进程结构内部的所有语句都是顺序执行的;
进程中可访问结构体或实体中所定义的信号;
进程的启动是由敏感信号列表所标明的信号来触发,也可以用WAIT语句等待一个触发条件的成立。
各进程之间的通信是由信号来传递的。
(4)带有异步复位端的D触发器
三、实验代码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdffIS
PORT(d,clk,rst:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDdff;
定义entitydff
ARCHITECTUREbehaviorOFdffISBEGIN
PROCESS(rst,clk)
IF(rst='
1'
)THEN
q<
='
0'
;
如果复位信号有效,q为0
ELSIF(clk'
EVENTANDclk='
)THENq<
=d;
上升沿触发且,q<
=d
ENDIF;
ENDPROCESS;
结束进程
endARCHITECTUREbehavior;
测试文件:
libraryIEEE;
useieee.std_logic_1164.all;
entitydff_tbis
enddff_tb;
architecturetb_behaviorofdff_tbiscomponentdff
port(
d,rst,clk:
instd_logic;
outstd_logic);
endcomponent;
constantclk_period:
time:
=50ns;
signald,clk,q,rst:
std_logic;
begin
dut:
dffportmap(d=>
d,clk=>
clk,rst=>
rst,q=>
q);
clk_gen:
process
clk<
waitforclk_period/2;
clk<
endprocess;
d_gen:
waitfor100ns;
d<
endprocess;
rst_gen:
rst<
waitfor150ns;
waitfor500ns;
wait;
endtb_behavior;
四、实验结果
五、实验心得
第一次使用此软件,略有陌生,耗费时间稍久,因为之前用过的quartusii9.0不必使用tb文件,所以第一次实验刚开始并没有明白tb文件的用途,上网查找资料之后才明白过来,不过好在程序简单,顺利完成实验。
实验二步进电机控制器
(1)理解两种状态机的区别
(2)熟悉两种编程风格
(3)编写BCD计数器和步进电机
(1)米里型状态机和摩尔型状态机
米里(Mealy)型状态机:
状态机的输出信号不仅与电路的当前状态有关,还与当前的输入有关
摩尔(Moore)型状态机:
状态机的当前输出仅仅由当前状态决定。
(2)有限状态机设计流程:
1)理解问题背景。
2)逻辑抽象,得出状态转移图。
3状态简化。
4)状态分配。
5)用VHDL来描述有限状态机。
(3)BCD计数器
原理图
(4)步进电机控制器
(1)BCD计数器
libraryieee;
entitycounteris
port(clk,rst:
instd_logic;
count:
outstd_logic_vector(3downto0));
endcounter;
定义entitycounter
architecturestate_machineofcounteris
typestateis
(zero,one,two,three,four,five,six,seven,eight,nine);
自定义type类型的量,用来表示程序中要用到的不同状态
signalpr_state,nx_state:
state;
定义信号pr_state,nx_state,均为state类型的量
process(rst,clk)
if(rst='
)then
pr_state<
=nx_state;
如果复位信号有效,保持现态
endif;
process(pr_state)
casepr_stateis
whenzero=>
count<
="
0000"
nx_state<
=one;
whenone=>
0001"
=two;
whentwo=>
0010"
=three;
whenthree=>
0011"
=four;
whenfour=>
0100"
=five;
whenfive=>
0101"
=six;
whensix=>
0110"
=seven;
whenseven=>
0111"
=eight;
wheneight=>
1000"
=nine;
whennine=>
1001"
=zero;
endcase;
使用case语句,列举所有状态,同时指出所有现态的次态指向
endstate_machine;
(2)步进电机控制器
entitystepmotoris
port(clk,rst,x:
output:
endstepmotor;
定义entitystepmoter
architecturestate_machineofstepmotoris
(s0,s1,s2,s3);
自定义type类型
定义信号量
process(clk,rst)
=s0;
elsif(clk'
eventandclk='
process(pr_state,x)
if(x='
whens0=>
output<
=s3;
whens1=>
=s0;
whens2=>
=s1;
whens3=>
=s2;
elsif(x='
nx_state<
endcase;
四、仿真结果
BCD计数器:
步进电机控制器:
这次所做实验为BCD计数器和步进电机控制,程序比较简单,有可以使用的模板,结果也比较有意思,主要是对状态机的理解运用和VHdl语句中例如case语句、if语句、when语句的区分和正确使用。
实验三十六位加法器设计
(1)掌握元件例化的方法
(2)理解for/generate语句的用法
(3)编程完成4位加法器和16位加法器的设计
(1)元件的例化
元件声明是对VHDL模块(即底层设计,也是完整的VHDL设计)的说明,使之可在其他被调用,元件声明可放在程序包中,也可在某个设计的构造体中声明。
元件例化指元件的调用。
元件声明及元件例化的语法分别如下:
元件声明:
component〈元件实体名〉
prot(〈元件端口信息,同该元件实现时的实体的port部分〉);
endcompnent;
元件例化:
〈例化名〉:
〈实体名,即元件名〉portmap(〈端口列表〉);
(2)生成语句(GENERATE)
GENERATE语句用于循环执行某项操作。
FOR模式的生成语句主要用于相同结构的描述中;
FOR模式语法结构:
FOR/GENERATE:
标号:
FOR变量IN离散区间GENERATE
(并行处理语句);
ENDGENERATE;
(3)16位加法器的设计
4位加法器:
entityadder4is
port(a,b:
instd_logic_vector(3downto0);
cin:
s:
outstd_logic_vector(3downto0);
cout:
outstd_logic);
endadder4;
定义entityadder4,cin为进位输入,cout为进位输出,s为求和结果
architecturebehavofadder4is
signalc:
std_logic_vector(4downto0);
signalp:
std_logic_vector(3downto0);
signalg:
G1:
foriin0to3generate
p(i)<
=a(i)xorb(i);
g(i)<
=a(i)andb(i);
s(i)<
=p(i)xorc(i);
endgenerate;
c(0)<
=cin;
c
(1)<
=(cinandp(0))org(0);
c
(2)<
=(cinandp(0)andP
(1))or(g(0)andp
(1))org
(1);
c(3)<
=(cinandp(0)andP
(1)andP
(2))or(g(0)andp
(1)andP
(2))or(g
(1)andP
(2))org
(2);
c(4)<
=(cinandp(0)andP
(1)andP
(2)andP(3))or(g(0)andp
(1)andP
(2)andP(3))or(g
(1)andP
(2)andP(3))or(g
(2)andP(3))org(3);
cout<
=c(4);
endbehav;
使用超前进位加法器设计原理,代入公式,写出语句
16位加法器:
entityadderis
instd_logic_vector(15downto0);
outstd_logic_vector(15downto0);
endadder;
定义entityadder,为16位加法器
architecturebehavofadderis
componentadder4is
进行元件实例化,以四个4位adder作为基本元件设计16位加法器
signalm1,m2,m3:
u1:
adder4portmap(a(3downto0),b(3downto0),s(3downto0),cin,m1);
u2:
adder4portmap(a(7downto4),b(7downto4),s(7downto4),m1,m2);
u3:
adder4portmap(a(11downto8),b(11downto8),s(11downto8),m2,m3);
u4:
adder4portmap(a(15downto12),b(15downto12),s(15downto12),m3,cout);
元件之间端口连接线
测试程序:
entityadder_tbis
endentityadder_tb;
architecturebehavofadder_tbis
componentadder
signalclk:
std_logic:
signala,b:
std_logic_vector(15downto0);
signals:
signalcin:
signalcout:
std_logic;
w:
adderportmap(a=>
a,b=>
b,s=>
s,cin=>
cin,cout=>
cout);
a<
=x"
b<
cin<
waitfor100ns;
0000100000000001"
b<
0100000000000111"
cin<
1111"
1110000000000111"
wait;
四、实验原理
本次实验主要是加法器设计,课堂上曾经讲过两种,即逐级进位加法器和超前进位加法器,在使用第一种思路设计时,程序出现错误,当时未调试成功(后来发现错误是公式代入错误),改为使用课件上给出的超前进位加法器的原程序,编写tb文件之后,程序正常运行。
在程序的知识运用方面,主要是对元件实例化的实际运用,掌握基本使用规则,并能从中体会出其方便好用之处为之后的灵活运用打下基础。
实验四选择运算器
一、实验目的:
(1)对前几次实验用到的知识进行总结
(2)综合运用理论课上的知识,完成选择运算器的设计
(1)设计要求:
输出信号:
一个COUT(15:
0),16位
乘法器:
要求用部分积实现
加法器:
8位加法器,高7位补零
完成比较器、乘法器、加法器的设计,不可以直接使用+,x运算符直接实现。
(2)选择器运算器总原理图
(3)乘法器部分采用并行乘法器
(4)加法器:
8位加法器的设计和上一个试验类似,先设计一个4位加法器,进而编译8位加法器。
Adder4:
entityadder4is
port(a,b:
sum:
jin:
outstd_logic;
cin:
instd_logic:
);
endadder4;
architectureadder4ofadder4is
signalc:
std_logic_vector(4downto0);
signalp:
std_logic_vector(3downto0);
signalg:
begin
G1:
p(i)<
g(i)<
sum(i)<
=(c(0)andp(0))org(0);
=(c(0)andp(0)andp
(1))or(g(0)andp
(1))org
(1);
=(c(0)andp(0)andp
(1)andp
(2))or(g(0)andp
(1)andp
(2))or(g
(1)andp
(2))org
(2);
=(c(0)andp(0)andp
(1)andp
(2)andp(3))or(g(0)andp
(1)andp
(2)andp(3))or(g
(1)andp
(2)andp(3))or(g
(2)andp(3))org(3);
jin<
为元件实例化的元件定义,与实验三所用代码相同
Adder8:
usework.my_component_adder.all;
entityadder8is
instd_logic_vector(7downto0);
outstd_logic_vector(7downto0);
endadder8;
architectureadder8ofadder8is
signalm:
u1:
adder4portmap(a(3downto0),b(3downto0),sum(3downto0),m,cin);
adder4portmap(a(7downto4),b(7downto4),sum(7downto4),jin,m);
8位加法器描述
Cheng:
useieee.std_logic_unsigned.all;
entitychengis
ch:
outstd_logic_vector(15downto0));
endcheng;
architecturechengofchengis
process(a,b)
variabletemp:
variabletemp1:
temp:
=(others=>
'
temp1:
foriin0to7loop
tem