1、北理工VHDL实验报告 本科实验报告 实验名称: VHDL语言及集成电路设计实验 课程名称:VHDL语言及集成电路设计实验时间:12、13周周二上午14、15周周六下午任课教师:任仕伟实验地点:4#427实验教师:任仕伟实验类型: 原理验证 综合设计 自主创新学生姓名:学号/班级:组 号:学 院:信息与电子学院同组搭档:专 业:微电子成 绩: 实验一:带有异步复位端的D触发器一、实验目的(1)熟悉linux操作环境和modelsim软件环境(2)理解时序逻辑和组合逻辑电路的区别(3)理解并行语句和顺序语句(4)用VHDL语言编写一个带有异步复位端的D触发器及其测试文件二、实验原理(1)组合逻辑
2、和时序逻辑组合逻辑电路当前输出的值仅取决于当前的输入,不需要触发器等具有存储能力的逻辑单元,仅仅使用组合逻辑门;时序逻辑电路的当前输出不仅取决于当前的输入,还与以前的输入有关,这类电路中包括寄存器等元件,也包括组合逻辑电路,寄存器通过一个反馈环和组合逻辑模块相连,触发器便是属于时序逻辑电路;(2)并行和顺序代码从本质上讲,VHDL代码是并发执行的。只有PROCESS,FUNCTION或PROCEDURE内的代码才是顺序执行的。当它们作为一个整体时,与其他模块之间又是并发执行的。以下是3个并发描述语句(stat1,stat2和stat3)的代码,会产生同样的电路结构。 stat1 stat3 s
3、tat1stat2 = stat2 = stat3 = 其他排列顺序stat3 stat1 stat2(3)并行语句进程(PROCESS)1)语法结构: 进程名: PROCESS (敏感信号列表)变量说明语句BEGIN(顺序执行的代码)END PROCESS 进程名;2) PROCESS 的特点 多进程之间是并行执行的; 进程结构内部的所有语句都是顺序执行的; 进程中可访问结构体或实体中所定义的信号; 进程的启动是由敏感信号列表所标明的信号来触发,也可以用WAIT语句等待 一个触发条件的成立。 各进程之间的通信是由信号来传递的。(4)带有异步复位端的D触发器三、实验代码LIBRARY IEEE
4、;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff ISPORT(d,clk,rst:IN STD_LOGIC;q:OUT STD_LOGIC);END dff;定义entity dffARCHITECTURE behavior OF dff IS BEGINPROCESS(rst,clk)BEGINIF(rst=1) THENq=0;如果复位信号有效,q为0ELSIF(clkEVENT AND clk=1) THEN q=d;上升沿触发且,qd,clk=clk,rst=rst,q=q); clk_gen:processbeginclk=0;wait for clk
5、_period/2; clk=1;wait for clk_period/2; end process;d_gen:processbeginwait for 100 ns;d=1;wait for 100 ns;d=0;end process;rst_gen:processbeginrst=1;wait for 150 ns;rst=0;wait for 500 ns;rst=1;wait for 150 ns; wait;end process;end tb_behavior;四、实验结果五、实验心得第一次使用此软件,略有陌生,耗费时间稍久,因为之前用过的quartusii9.0不必使用tb
6、文件,所以第一次实验刚开始并没有明白tb文件的用途,上网查找资料之后才明白过来,不过好在程序简单,顺利完成实验。实验二 步进电机控制器一、实验目的(1)理解两种状态机的区别(2)熟悉两种编程风格(3)编写BCD计数器和步进电机二、实验原理(1)米里型状态机和摩尔型状态机米里(Mealy)型状态机:状态机的输出信号不仅与电路的当前状态有关,还与当前的输入有关摩尔(Moore)型状态机:状态机的当前输出仅仅由当前状态决定。(2)有限状态机设计流程:1)理解问题背景。2) 逻辑抽象,得出状态转移图。 3 状态简化。4)状态分配。5) 用VHDL来描述有限状态机。(3)BCD计数器原理图(4)步进电机
7、控制器三、实验代码(1)BCD计数器library ieee;use ieee.std_logic_1164.all;entity counter isport(clk,rst:in std_logic; count:out std_logic_vector(3 downto 0); end counter;定义entity counterarchitecture state_machine of counter istype state is(zero,one,two,three,four,five,six,seven,eight,nine);自定义type类型的量,用来表示程序中要用到的不
8、同状态signal pr_state,nx_state:state;定义信号pr_state,nx_state,均为state类型的量beginprocess (rst,clk)beginif(rst=1)thenpr_state count =0000;nx_state count =0001;nx_state count =0010;nx_state count =0011;nx_state count =0100;nx_state count =0101;nx_state count =0110;nx_state count =0111;nx_state count =1000;nx_s
9、tate count =1001;nx_state = zero;end case;使用case语句,列举所有状态,同时指出所有现态的次态指向end process;end state_machine;(2)步进电机控制器library ieee;use ieee.std_logic_1164.all;entity stepmotor isport(clk,rst,x:in std_logic; output:out std_logic_vector(3 downto 0); end stepmotor;定义entity stepmoterarchitecture state_machine
10、of stepmotor istype state is(s0,s1,s2,s3);自定义type类型signal pr_state,nx_state:state;定义信号量beginprocess (clk,rst)beginif(rst=1)thenpr_state=s0;elsif(clk event and clk =1)thenpr_state output =0001;nx_state output =0010;nx_state output =0100;nx_state output =1000;nx_state output =0001; nx_state output =00
11、10; nx_state output =0100; nx_state output =1000; nx_state = s0; end case;end if;end process;end state_machine;四、仿真结果BCD计数器:步进电机控制器:五、实验心得这次所做实验为BCD计数器和步进电机控制,程序比较简单,有可以使用的模板,结果也比较有意思,主要是对状态机的理解运用和VHdl语句中例如case语句、if语句、when语句的区分和正确使用。实验三 十六位加法器设计一、实验目的(1)掌握元件例化的方法(2)理解for/generate语句的用法(3)编程完成4位加法器和16
12、位加法器的设计二、实验原理(1)元件的例化元件声明是对VHDL模块(即底层设计,也是完整的VHDL设计)的说明,使之可在其他被调用,元件声明可放在程序包中,也可在某个设计的构造体中声明。 元件例化指元件的调用。元件声明及元件例化的语法分别如下:元件声明:component元件实体名prot(元件端口信息,同该元件实现时的实体的port部分);end compnent;元件例化:例化名:实体名,即元件名port map(端口列表);(2)生成语句(GENERATE)GENERATE语句用于循环执行某项操作。FOR模式的生成语句主要用于相同结构的描述中;FOR模式语法结构:FOR/GENERATE
13、:标号:FOR 变量IN 离散区间GENERATE(并行处理语句);END GENERATE;(3)16位加法器的设计三、实验代码4位加法器:library ieee;use ieee.std_logic_1164.all;entity adder4 isport(a,b:in std_logic_vector(3 downto 0);cin:in std_logic;s:out std_logic_vector(3 downto 0);cout:out std_logic);end adder4;定义entity adder4,cin为进位输入,cout为进位输出,s为求和结果archite
14、cture behav of adder4 issignal c: std_logic_vector(4 downto 0);signal p: std_logic_vector(3 downto 0);signal g: std_logic_vector(3 downto 0);beginG1:for i in 0 to 3 generatep(i)=a(i) xor b(i);g(i)=a(i) and b(i);s(i)=p(i) xor c(i);end generate;c(0)=cin;c(1)=(cin and p(0) or g(0);c(2)=(cin and p(0) an
15、d P(1) or (g(0) and p(1) or g(1);c(3)=(cin and p(0) and P(1)and P(2) or (g(0) and p(1) and P(2) or (g(1) and P(2) or g(2);c(4)=(cin and p(0) and P(1)and P(2) and P(3) or (g(0) and p(1) and P(2) and P(3) or (g(1) and P(2) and P(3) or (g(2) and P(3) or g(3);couta,b=b,s=s,cin=cin,cout=cout );processbeg
16、ina=x0000;b=x0000;cin=1;wait for 100ns;a=0000100000000001; b=0100000000000111; cin=0;wait for 100ns;a=x1111;b=x1111;cin=1;wait for 100ns;a=0000100000000001; b=1110000000000111; cin=1;wait ;end process;end behav;四、实验原理五、实验心得本次实验主要是加法器设计,课堂上曾经讲过两种,即逐级进位加法器和超前进位加法器,在使用第一种思路设计时,程序出现错误,当时未调试成功(后来发现错误是公式代
17、入错误),改为使用课件上给出的超前进位加法器的原程序,编写tb文件之后,程序正常运行。在程序的知识运用方面,主要是对元件实例化的实际运用,掌握基本使用规则,并能从中体会出其方便好用之处为之后的灵活运用打下基础。实验四 选择运算器一、实验目的:(1)对前几次实验用到的知识进行总结(2)综合运用理论课上的知识,完成选择运算器的设计二、实验原理(1)设计要求:输出信号:一个COUT(15:0),16位乘法器:要求用部分积实现加法器:8位加法器,高7位补零完成比较器、乘法器、加法器的设计,不可以直接使用+,x运算符直接实现。(2)选择器运算器总原理图(3)乘法器部分采用并行乘法器(4)加法器:8位加法
18、器的设计和上一个试验类似,先设计一个4位加法器,进而编译8位加法器。三、实验代码Adder4:library ieee;use ieee.std_logic_1164.all; entity adder4 is port(a,b:in std_logic_vector(3 downto 0); sum:out std_logic_vector(3 downto 0); jin:out std_logic; cin:in std_logic:=0); end adder4; architecture adder4 of adder4 is signal c:std_logic_vector(4
19、downto 0); signal p:std_logic_vector(3 downto 0); signal g:std_logic_vector(3 downto 0); begin G1:for i in 0 to 3 generate p(i)=a(i) xor b(i); g(i)=a(i) and b(i); sum(i)=p(i) xor c(i);end generate;c(0)=cin;c(1)=(c(0) and p(0) or g(0);c(2)=(c(0)and p(0) and p(1) or (g(0) and p(1) or g(1);c(3)=(c(0) and p(0) and p(1) and p(2) or (g(0) and p(1) and p(2) or (g(1) and p(2) or g(2);c(4)=(c(0) and p(0) and p(1) and p(2) and p(3) or (g(0) and p(1) and p(2) and p(3) or (g(1) and p(2) and p(3) or (g(2) and p(3) or g(3);jin0); temp1:=(others=0); for i in 0 to 7 loop tem
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1