北理工VHDL实验报告.docx
《北理工VHDL实验报告.docx》由会员分享,可在线阅读,更多相关《北理工VHDL实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
北理工VHDL实验报告
本科实验报告
实验名称:
VHDL语言及集成电路设计实验
课程名称:
VHDL语言及集成电路设计
实验时间:
12、13周周二上午
14、15周周六下午
任课教师:
任仕伟
实验地点:
4#427
实验教师:
任仕伟
实验类型:
□原理验证
■综合设计
□自主创新
学生姓名:
学号/班级:
组号:
学院:
信息与电子学院
同组搭档:
专业:
微电子
成绩:
实验一:
带有异步复位端的D触发器
一、实验目的
(1)熟悉linux操作环境和modelsim软件环境
(2)理解时序逻辑和组合逻辑电路的区别
(3)理解并行语句和顺序语句
(4)用VHDL语言编写一个带有异步复位端的D触发器及其测试文件
二、实验原理
(1)组合逻辑和时序逻辑
组合逻辑电路当前输出的值仅取决于当前的输入,不需要触发器等具有存储能力
的逻辑单元,仅仅使用组合逻辑门;
时序逻辑电路的当前输出不仅取决于当前的输入,还与以前的输入有关,这类电
路中包括寄存器等元件,也包括组合逻辑电路,寄存器通过一个反馈环和组合逻辑模块相连,触发器便是属于时序逻辑电路;
(2)并行和顺序代码
从本质上讲,VHDL代码是并发执行的。
只有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)
BEGIN
IF(rst='1')THEN
q<='0';如果复位信号有效,q为0
ELSIF(clk'EVENTANDclk='1')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;
q:
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
begin
clk<='0';
waitforclk_period/2;clk<='1';
waitforclk_period/2;endprocess;
d_gen:
process
begin
waitfor100ns;
d<='1';
waitfor100ns;
d<='0';
endprocess;
rst_gen:
process
begin
rst<='1';
waitfor150ns;
rst<='0';
waitfor500ns;
rst<='1';
waitfor150ns;wait;
endprocess;
endtb_behavior;
4、实验结果
5、实验心得
第一次使用此软件,略有陌生,耗费时间稍久,因为之前用过的quartusii9.0不必使用tb文件,所以第一次实验刚开始并没有明白tb文件的用途,上网查找资料之后才明白过来,不过好在程序简单,顺利完成实验。
实验二步进电机控制器
一、实验目的
(1)理解两种状态机的区别
(2)熟悉两种编程风格
(3)编写BCD计数器和步进电机
二、实验原理
(1)米里型状态机和摩尔型状态机
米里(Mealy)型状态机:
状态机的输出信号不仅与电路的当前状态有关,还与当前的输入有关
摩尔(Moore)型状态机:
状态机的当前输出仅仅由当前状态决定。
(2)有限状态机设计流程:
1)理解问题背景。
2)逻辑抽象,得出状态转移图。
3状态简化。
4)状态分配。
5)用VHDL来描述有限状态机。
(3)BCD计数器
原理图
(4)步进电机控制器
三、实验代码
(1)BCD计数器
libraryieee;
useieee.std_logic_1164.all;
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类型的量
begin
process(rst,clk)
begin
if(rst='1')then
pr_state<=nx_state;如果复位信号有效,保持现态
endif;
endprocess;
process(pr_state)
begin
casepr_stateis
whenzero=>count<="0000";
nx_state<=one;
whenone=>count<="0001";
nx_state<=two;
whentwo=>count<="0010";
nx_state<=three;
whenthree=>count<="0011";
nx_state<=four;
whenfour=>count<="0100";
nx_state<=five;
whenfive=>count<="0101";
nx_state<=six;
whensix=>count<="0110";
nx_state<=seven;
whenseven=>count<="0111";
nx_state<=eight;
wheneight=>count<="1000";
nx_state<=nine;
whennine=>count<="1001";
nx_state<=zero;
endcase;使用case语句,列举所有状态,同时指出所有现态的次态指向
endprocess;
endstate_machine;
(2)步进电机控制器
libraryieee;
useieee.std_logic_1164.all;
entitystepmotoris
port(clk,rst,x:
instd_logic;
output:
outstd_logic_vector(3downto0));
endstepmotor;定义entitystepmoter
architecturestate_machineofstepmotoris
typestateis
(s0,s1,s2,s3);自定义type类型
signalpr_state,nx_state:
state;定义信号量
begin
process(clk,rst)
begin
if(rst='1')then
pr_state<=s0;
elsif(clk'eventandclk='1')then
pr_state<=nx_state;
endif;
endprocess;
process(pr_state,x)
begin
if(x='0')then
casepr_stateis
whens0=>output<="0001";
nx_state<=s3;
whens1=>output<="0010";
nx_state<=s0;
whens2=>output<="0100";
nx_state<=s1;
whens3=>output<="1000";
nx_state<=s2;
endcase;
elsif(x='1')then
casepr_stateis
whens0=>output<="0001";nx_state<=s1;
whens1=>output<="0010";nx_state<=s2;
whens2=>output<="0100";nx_state<=s3;
whens3=>output<="1000";nx_state<=s0;endcase;
endif;
endprocess;
endstate_machine;
4、仿真结果
BCD计数器:
步进电机控制器:
5、实验心得
这次所做实验为BCD计数器和步进电机控制,程序比较简单,有可以使用的模板,结果也比较有意思,主要是对状态机的理解运用和VHdl语句中例如case语句、if语句、when语句的区分和正确使用。
实验三十六位加法器设计
一、实验目的
(1)掌握元件例化的方法
(2)理解for/generate语句的用法
(3)编程完成4位加法器和16位加法器的设计
二、实验原理
(1)元件的例化
元件声明是对VHDL模块(即底层设计,也是完整的VHDL设计)的说明,使之可在其他被调用,元件声明可放在程序包中,也可在某个设计的构造体中声明。
元件例化指元件的调用。
元件声明及元件例化的语法分别如下:
元件声明:
component〈元件实体名〉
prot(〈元件端口信息,同该元件实现时的实体的port部分〉);
endcompnent;
元件例化:
〈例化