VHDL实验报告03137

合集下载

VHDL实验报告

VHDL实验报告

《创新实验》实验报告—基于VHDL的编程和硬件实现一、实验目的1.熟悉和掌握硬件描述语言VHDL的基本语法及编写;2.掌握软件Xilinx ISE 10.1的使用;3.熟悉SDZ-6电子技术实验箱的使用;4.了解节拍脉冲发生器等基本电路的实现;5.了解八位二进制计数器的功能与设计;6.学习键盘和七段数码管显示的控制和设计。

二、实验内容1.Xilinx ISE 10.1软件的使用;2.节拍脉冲发生器等基本电路的实现;3.八位二进制计数器的实现4.键盘扫描及显示的实现三、实验器材1、PC机2、SDZ-6电子技术实验箱3、正负5V电源4、I/O接口线四、软件的使用在安装Xilinx10.1软件时,需要一个ID号,其实这个ID号是可以重复使用的,几个同学在官网注册后就可以共享ID号了。

安装完成之后就可以使用这个软件编写相应的VHDL的程序。

1.新建工程File—>New Project 弹出下面的对话框输入工程名后单击Next。

然后根据本实验的实验箱进行以下设置。

以后的步骤一般都是单击Next(有些资料上会介绍有些这些步骤的具体功能,但对于本实验不必用到),最后单击Finish,完成新建一个工程。

在窗口的左边会出现刚刚新建的工程,如下:2.新建一个VHDL的源文件。

在上图中,右击工程选择New Source ,弹出如下对话框。

在对画框的左边选择VHDL Module,输入文件的名字(改名字最好是你定义的实体的名字)。

单击Next。

出现下面的对话框。

该对话框主要是对外部端口的编辑。

可以直接跳过,即单击Next,在源文件上编辑端口。

然后在接下来的对话框中单击Finish。

完成建立一个源文件。

窗口右边就会出现刚才编辑的源文件。

3.编写和编译代码将事先编好的代码复制到源文件里,然后保存文件。

选中左边的文件名,在窗体的左边出现如下编辑文档内容。

选择Synthesize —XST—》Check Syntax,双击Check Syntax,开始编译源文件。

VHDL实验报告

VHDL实验报告

6
#50 S1=1;S2=0; #50 A=0;B=0;C=1;D=0; #50 S1=0;S2=1; #50 A=1;B=0;C=0;D=1; #200 $stop; end MUX41b MUX41b1 (.A(A),.B(B),.C(C),.D(D),.S1(S1),.S2(S1),.Y(Y));//元件例化 endmodule If else 方法仿真图:
实验一 半加器电路的设计
一.实验目的 (1)掌握 Modelsim 软件的编译、仿真方法 (2)熟练运用 Modelsim 软件进行 VHDL 程序设计开发 (3)掌握基于 Modelsim 的组合逻辑电路设计方法 (4)利用 VHDL 的逻辑表达式描述门电路 (5)利用 VHDL 的代码完成半加器设计 二.实验内容 1.实验要求:设计一个两位二进制半加器,半加器只考虑了两个加数本身,没有考虑由低位 来的进位。 2.半加器的输入为 A 和 B。输出为 SO 和 CO。 使用 Verilog HDL 程序实现上述实验内容,并使用 modelsim 仿真 半加器主程序为: module adder(A,B,SO,CO); input A,B; output SO,CO; assign SO=A^B; //和值数据输出 assign CO=A&B; //进位数据输出 endmodule 测试程序为: `timescale 1ns/1ns //时间精度 `include "adder.v"; module addertest; reg A,B; //输入变量类型定义 wire SO,CO; //输出变量类型定义 initial begin A=0;B=0; #100 A=0;B=1 ; #100 A=1;B=1 ; #100 A=1;B=0 ; #100 $stop; end adder adder1(.SO(SO),.CO(CO),.A(A),.B(B)); endmodule

vhdl课程设计实验报告

vhdl课程设计实验报告

湖南科技大学信息与电气工程学院《课程设计报告》题目:电子技术课程设计报告专业:通信工程班级:一班姓名:何家乐学号: 1004040126指导教师:罗朝辉任务书题目《电子技术》课程设计时间安排课程设计时间为10天(2周)。

(1)调研、查资料1天。

(2)总体方案设计2 天。

(3)电路设计2天(画原理图,参数计算)。

(4)实验室完成相应电路的验证。

3天(5)撰写设计说明书 1 天。

(6)验收1 天。

目的:训练学生综合运用学过的电子技术原理的基础知识,独立进行查找资料、选择方案、设计电路、撰写报告,进一步加深对电子电路基本理论的理解,提高运用基本技能的能力,为今后的学习和工作打下坚实的基础。

要求:(1)能正确设计电路,画出线路图,分析电路原理。

(2)按时参加课程设计指导,定期汇报课程设计进展情况。

(3)广泛收集相关技术资料。

(4)独立思考,刻苦钻研,严禁抄袭。

(5)按时完成课程设计任务,认真、正确地书写课程设计报告。

(6)培养实事求是、严谨的工作态度和认真的工作作风。

总体方案实现:(1)明确设计任务,对所要设计的任务进行具体分析,充分了解电路性能、指标内容及要求。

(2)制定设计方案。

(3)迸行具体设计:单元电路的设计;参数计算;器件选择;绘制电路原理图。

(4)撰写课程设计报告(说明书):课程设计报告是对设计全过程的系统总结,也是培养综合科研素质的一个重要环节。

指导教师评语:评分等级:()指导教师签名:课程设计报告1.课题名称:RGB LED Control 原理图及PCB设计2.设计任务及要求⑴任务:完成RGB LED control 的设计,并画出原理图及其PCB设计。

⑵要求:①能正确设计电路,画出线路图,分析电路原理。

②按时参加课程设计指导,定期汇报课程设计进展情况。

③广泛收集相关技术资料。

④独立思考,刻苦钻研,严禁抄袭。

⑤按时完成课程设计任务,认真、正确地书写课程设计报告。

⑥培养实事求是、严谨的工作态度和认真的工作作风。

VHDL多路波形发生器实验报告

VHDL多路波形发生器实验报告

VHDL多路波形发生器实验报告一、基本要求:1、对输入时钟信号进行分频,实现三路互差120°的信号。

2、实现输出信号的占空比控制clk: 输入时钟信号reset: 同步复位信号(低电平有效)div: 输入分频控制信号(注意:6n分频)ctrl: 占空比控制信号ctrl=1时, 占空比为1:1ctrl=2时, 占空比为1:2ctrl=3时, 占空比为2:1A,B,C: 三路输出信号二、设计思路:1.实验为6n分频,用变量s来控制,0~6n-1这六个数,当时钟信号每来一个上升沿时加1,当为6n-1时清零;2.定义N为常量,通过改变N的值改变分频;3.ctrl值不同时,占空比不同,用case语句控制,ctrl分别为01,10,11和其他;4.具体波形的实现用if语句,当占空比为1时,A输出信号在s=0和s=3*n时翻转,B输出信号在s=2*n和s=5*n时翻转,C输出信号在s=4*n和s=n的时候翻转。

当占空比为1:2时,A输出信号在s=0和s=2*n时翻转,B输出信号在s=2*n和s=4*n时翻转,C输出信号在s=4*n和s=0的时候翻转。

当占空比为2:1时,A输出信号在s=0和s=4*n时翻转,B输出信号在s=2*n和s=0时翻转,C输出信号在s=4*n和s=2*n的时候翻转;5.在占空比为1和1:2时,C输出信号应比B慢120度,但是实际输出超前B,所以要对C输出进行反相;同理,在占空比为2:1时,要对B、C分别进行反向。

6.用if语句判断是否复位,若非,则执行case语句。

三、流程图:四、源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity top isport(clk,reset:in std_logic;ctrl:in std_logic_vector(1 downto 0);A,B,C:out std_logic);end top ;architecture rel of top issignal temp1,temp2,temp3,temp4,temp5 : std_logic; constant N: integer:=1;signal s:integer range 0 to 6*N-1 ;beginprocess(clk,reset,ctrl)beginif (reset='0') thentemp1<='0';temp2<='0';temp3<='0';temp4<='0';temp5<='0';s<=0;elsecase ctrl iswhen "01"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=3*N thentemp1<= not temp1;end if;if s=2*N thentemp2<= not temp2;end if;if s=5*N thentemp2<= not temp2;end if;if s=4*N thentemp4<= not temp4;end if;if s=N thentemp4<= not temp4;end if;end if;temp3<= not temp4;when "10"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=2*N thentemp1<= not temp1;end if;if s=2*N thentemp2<= not temp2;end if;if s=4*N thentemp2<= not temp2;end if;if s=4*N thentemp4<= not temp4;end if;if s=0 thentemp4<= not temp4;end if;end if;temp3<= not temp4;when "11"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=4*N thentemp1<= not temp1;end if;if s=2*N thentemp5<= not temp5;end if;if s=0 thentemp5<= not temp5;end if;if s=4*N thentemp4<= not temp4;end if;if s=2*N thentemp4<= not temp4;end if;end if;temp2<= not temp5;temp3<= not temp4;when others=>temp1<='0';temp2<='0';temp3<='0';end case;end if;end process;A<=temp1;B<=temp2;C<=temp3;end rel;五、仿真波形:整体波形:当ctrl=1 当ctrl=2 当ctrl=3复位当ctrl=其他:六、实验过程遇到的问题:在程序设计时,开始不知该怎样使A,B,C互差120度,开始是想通过定义一个变量,每来一个上升沿加1,从0开始,A路信号除3n 取余为0则翻转,B路信号除3n取余为1则翻转,C路信号除3n取余为2则翻转,我觉得这样的想法应该没有错,可是实际却调不出来,可能是某处逻辑有问题,后来就模仿老师给的6分频程序,设计了现在的程序。

vhdl实验报告

vhdl实验报告

vhdl实验报告VHDL实验报告引言:VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,广泛应用于数字电路设计和仿真。

本篇实验报告将介绍我在VHDL实验中的学习和实践经验,包括实验目的、实验过程、实验结果以及对VHDL的理解和展望。

一、实验目的VHDL实验的主要目的是让我们掌握VHDL语言的基本语法和使用方法,能够利用VHDL描述数字电路,并通过仿真和综合工具进行验证和实现。

通过这些实验,我们可以深入了解数字电路的原理和设计方法,提高我们的逻辑设计能力和工程实践能力。

二、实验过程在实验过程中,我们首先学习了VHDL的基本语法,包括实体声明、端口声明、信号声明等。

然后,我们通过实例学习了VHDL的建模方法,包括组合逻辑电路的建模和时序逻辑电路的建模。

在组合逻辑电路的建模中,我们学习了使用逻辑运算符和条件语句描述电路的功能;在时序逻辑电路的建模中,我们学习了使用过程语句和时钟信号描述电路的状态转换。

在学习了VHDL的基础知识后,我们开始进行实验设计。

我们选择了一个简单的数字电路,如4位加法器,来进行实验验证。

首先,我们通过VHDL语言描述了加法器的功能和结构,包括输入端口、输出端口和中间信号。

然后,我们使用仿真工具进行了功能仿真,验证了加法器的正确性。

接着,我们使用综合工具将VHDL代码综合成门级电路,并进行了时序仿真和时序优化,验证了加法器的时序正确性和性能。

三、实验结果通过实验,我们成功地实现了4位加法器的功能,并验证了其正确性和性能。

在功能仿真中,我们输入了不同的测试数据,观察了输出结果,发现加法器能够正确地进行加法运算,并得到了正确的结果。

在时序仿真中,我们观察了电路的时序行为,包括输入信号的变化、输出信号的响应和中间信号的传播延迟等,发现加法器能够在时序上满足要求,并且具有较好的性能。

vhdl设计实验报告

vhdl设计实验报告

vhdl设计实验报告VHDL设计实验报告引言VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,广泛应用于数字电路设计和验证。

本实验旨在通过设计一个简单的电路来熟悉VHDL语言的基本语法和设计流程。

一、实验背景数字电路是现代电子系统的基础,而VHDL则是描述和设计数字电路的重要工具。

VHDL可以帮助工程师们以一种形式化的语言来描述电路的功能和结构,从而实现电路的模拟和验证。

二、实验目的本实验的目的是通过使用VHDL语言设计一个简单的电路,加深对VHDL语言的理解,并掌握基本的电路设计流程。

三、实验步骤1. 确定电路功能在设计电路之前,首先需要明确电路的功能。

本实验中,我们选择设计一个4位加法器电路。

2. 设计电路结构根据电路功能的要求,设计电路的结构。

在本实验中,我们需要设计一个4位加法器,因此需要使用4个输入端口和一个输出端口。

3. 编写VHDL代码使用VHDL语言编写电路的描述代码。

在代码中,需要定义输入和输出端口的类型和位宽,并实现电路的功能。

4. 进行仿真使用仿真工具对设计的电路进行仿真,以验证电路的功能是否符合预期。

通过输入不同的测试数据,观察输出是否正确。

5. 下载到FPGA开发板将设计好的电路代码下载到FPGA开发板上进行验证。

通过连接输入信号和观察输出信号,验证电路在实际硬件上的运行情况。

四、实验结果与分析经过仿真和实际验证,我们设计的4位加法器电路在功能上符合预期。

输入不同的数据进行加法运算时,输出结果都正确。

五、实验总结通过本次实验,我们深入了解了VHDL语言的基本语法和设计流程。

通过设计一个简单的电路,我们掌握了VHDL的应用方法,并通过仿真和实际验证,加深了对电路设计的理解。

六、实验心得本实验让我对VHDL语言有了更深入的认识。

通过实际操作,我更加熟悉了VHDL的编写和仿真流程。

VHDL与数字电路设计实验报告

VHDL与数字电路设计实验报告

VHDL与数字电路设计实验报告引言本实验旨在通过使用VHDL编程语言和数字电路设计技术,实现特定功能的电路设计。

本文档将对实验的步骤、设计原理和结果进行详细描述。

实验步骤1. 步骤一:熟悉VHDL编程语言在实验开始之前,团队成员对VHDL编程语言进行了研究和熟悉。

我们了解了VHDL的基本语法、数据类型和结构,并获得了对VHDL设计原理的初步理解。

2. 步骤二:设计功能电路在本实验中,我们选择了一个特定的功能电路进行设计。

我们首先进行了功能需求分析,并根据需求确定了电路的输入输出信号以及主要的逻辑运算。

然后,我们使用VHDL编程语言将电路的逻辑运算实现为代码,并进行了仿真和测试。

3. 步骤三:电路仿真和验证为了验证我们设计的电路功能的正确性,我们使用了VHDL仿真工具进行了电路的仿真和验证。

我们根据输入信号的不同组合,观察输出信号的变化,并与我们预期的结果进行比较。

通过这一步骤,我们确认了我们设计的电路能够按照预期工作。

4. 步骤四:电路实现和测试在确认电路的设计和仿真结果无误之后,我们进一步将电路实现到实际的数字电路平台上,并进行了硬件测试。

我们使用实际的输入信号来测试电路的性能和稳定性,并对输出信号进行观察和分析。

通过这一步骤,我们验证了电路在实际环境中的可行性。

设计原理我们设计的电路基于特定的功能需求,采用了经典的数字电路设计原理。

通过使用VHDL编程语言,我们将电路的逻辑运算实现为逻辑门和触发器的组合。

通过将输入信号连接到适当的逻辑门和触发器,我们实现了所需的功能。

结果与分析经过实验步骤的完成,我们成功地设计和实现了一个具有特定功能的数字电路。

在仿真测试和实际测试中,电路都表现出了良好的性能和稳定性。

根据结果的分析,我们验证了电路的设计原理和逻辑的正确性。

结论本实验通过使用VHDL编程语言和数字电路设计技术,成功地实现了一个具有特定功能的电路设计。

我们的实验结果表明,VHDL和数字电路设计技术在电路设计领域具有重要的应用价值。

VHDL实验报告

VHDL实验报告

EDA课程设计项目——数字钟学院:机电工程学院专业年级:07级电子科学与技术学号:学生姓名:指导老师:成绩评定:数字钟设计1、课程设计目的1、熟悉和掌握VHDL模块间的组合设计思路了解数字钟的工作原理2、掌握各芯片的逻辑功能及使用方法。

3、了解数字钟的组成及工作原理。

4、熟悉数字钟的设计与制作。

5、掌握常用仪器、仪表的正确方法,学会电路整机指标的测试6、巩固和加深学生对模拟电子技术,数字逻辑电路等课程基本知识的理解。

2、课程设计内容基本要求:1. 设计一个按HH:MM:SS(六位七段LED)显示的24小时制数字钟。

2.通过三个按键能够实现复位和校对时间的功能。

3、设计条件硬件:利用PC设计软件:MAX+PLUS2实验总原理图4、设计思路:过一个数据选择器和一个3-8译码器分别控制数码管的段选和位选实现数码管的动态扫描。

5、设计步骤:设计步骤:1、24进制计数器的vhdl语言编译、仿真程序如下:LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;USE IEEE.std_logic_unsigned.ALL;ENTITY jjsqh ISPORT(rest,clk:IN std_logic;co:OUT std_logic;qh,ql:BUFFER std_logic_vector(3 DOWNTO 0));END jjsqh;ARCHITECTURE one OF jjsqh ISBEGINco<='1'WHEN(ql="1001"AND qh="0101")ELSE'0';PROCESS(clk,rest)BEGINIF(rest='0')THENql<="0000";qh<="0000";ELSIF(clk'EVENT AND clk='1')THEN IF(ql =3)THEN ql<="0000";IF(qh =2)THEN qh<="0000";ELSE qh<=qh+1;END IF;ELSE ql<=ql+1;END IF;END IF;END PROCESS;END one;2、60进制计数器的vhdl语言编译、仿真程序如下:LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;USE IEEE.std_logic_unsigned.ALL;ENTITY jsqm ISPORT(rest,clk:IN std_logic;co:OUT std_logic;qh,ql:BUFFER std_logic_vector(3 DOWNTO 0));END jsqm;ARCHITECTURE one OF jsqm ISBEGINco<='1'WHEN(ql="1001"AND qh="0101")ELSE'0';PROCESS(clk,rest)BEGINIF(rest='0')THENql<="0000";qh<="0000";ELSIF(clk'EVENT AND clk='1')THENIF(ql =9)THEN ql<="0000";IF(qh =5)THEN qh<="0000";ELSE qh<=qh+1;END IF;ELSE ql<=ql+1;END IF;END IF;END PROCESS;END one;3、6选1数据选择器(控制LED的段选和位选)的vhdl语言编译、仿真程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ledchoose isport(a,b,c,d,e,f: in std_logic_vector(3 downto 0);s: out std_logic_vector(2 downto 0);z: out std_logic_vector(3 downto 0);cp:in std_logic);end ledchoose;architecture behave of ledchoose isbeginprocess(cp)variable sn :std_logic_vector(2 downto 0);beginif cp'event and cp='1' then if sn="101"thensn:="000";elsesn:=sn+1;end if;case sn iswhen "000"=>z<=a;when "001"=>z<=b;when "010"=>z<=c;when "011"=>z<=d;when "100"=>z<=e;when "101"=>z<=f;when others=>null;end case;end if;s<=sn;end process;end behave;4、3-8译码器的vhdl语言编译、仿真程序如下:library ieee;use ieee.std_logic_1164.all;entity decode isport(iny:in std_logic_vector(2 downto 0);outy:out std_logic_vector(7 downto 0));end decode;architecture behave of decode isbeginprocess(iny)begincase iny iswhen "000"=>outy<="11111110";when "001"=>outy<="11111101";when "010"=>outy<="11111011";when "011"=>outy<="11110111";when "100"=>outy<="11101111";when "101"=>outy<="11011111";when "110"=>outy<="10111111";when "111"=>outy<="01111111";when others=>null;end case;end process;end behave;5、整点报时模块的编译、仿真Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_arith.all;Use ieee.std_logic_unsigned.all;Entity alarm isPort( a,b,c,d:in std_logic_vector(3 downto 0);q:out std_logic);End alarm;Architecture a of alarm isBeginprocess(a,b,c,d)beginif (a=0 and b=0 and c=0 and d=0) then q<='1' ;else q<='0';end if ;end process;end a;6、LED数码管显示模块的编译、仿真程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_unsigned.ALL;ENTITY led ISPORT( inp:IN STD_LOGIC_VECTOR(3 DOWNTO 0);outp:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END led;ARCHITECTURE be OF led ISBEGINprocess(inp)BEGINCASE inp isWHEN"0000"=>outp<="1111110";WHEN"0001"=>outp<="0110000";WHEN"0010"=>outp<="1101101";WHEN"0011"=>outp<="1111001";WHEN"0100"=>outp<="0110011";WHEN"0101"=>outp<="1011011";WHEN"0110"=>outp<="1011111";WHEN"0111"=>outp<="1110000";WHEN"1000"=>outp<="1111111";WHEN"1001"=>outp<="1111011";WHEN others=>outp<="0000000";end CASE;END process;END be;7、校时电路:校时、校分由两个或门组成,闲置是,按键开关一端与Vcc连接,当按下时,另一端与或门输入和下拉电阻连接,实现校时功能8、将所有模块合起来就是一个完整的动态扫描时钟之所以这样做是因为从流程图我们可以清晰的看到时钟的各部分组成,能够轻易的对其进行功能模块的拆分,好进行各个模块的vhdl语言的编译、仿真,从而使编译简化,不至于那么复杂,更易于编写vhdl语言程序,而且要是出现在错误的话可以直接到各个模块去找错误,更容易修改和解决错误问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VHDL实验报告60 庄炜旭实验三. 4位可逆计数器,4位可逆二进制代码-格雷码转换器设计一.实验目的学习时序电路的设计,仿真和硬件测试,进一步熟悉VHDL设计技术1. 学习4位可逆计数器的设计2. 学习4位可逆二进制代码-格雷码转换器设计二.实验内容设计4位可逆计数器,及4位可逆二进制代码-格雷码转换器,并仿真,下载。

[具体要求]1.4位可逆计数器a)使用CLOCK_50作为输入时钟,其频率为50MHz(对于频率大于50Hz的闪烁,人眼会看到连续的光),因而,对其进行225的分频后,再用于时钟控制。

(可利用实验一)b)使用拨码开关SW17作为模式控制,置‘1’时为加法计数器,置‘0’时为减法计数器,同时使用LEDR17显示SW17的值。

c)使用KEY3作为异步复位开关(按下时为0,不按为1),当为加法计数器时,置“0000”,当为减法计数器时,置“1111”。

d)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高位,LEDR0为低位。

2.4位可逆二进制代码――格雷码转换器a)使用拨码开关SW17作为模式控制,置‘1’时为二进制代码―>格雷码转换,置‘0’时为格雷码―>二进制代码,同时使用LEDR17显示SW17的值。

b)使用拨码开关SW3, SW2, SW1, SW0作为输入的被转换数,SW3为高位,SW0为低位。

c)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高位,LEDR0为低位。

三.管脚设定SW[0]PIN_N25SW[1]PIN_N26SW[2]PIN_P25SW[3] PIN_AE14SW[17] PIN_V2LEDR[0] PIN_AE23LEDR[1] PIN_AF23LEDR[2] PIN_AB21LEDR[3] PIN_AC22LEDR[17] PIN_AD12KEY[3] PIN_W26CLOCK_50 PIN_N2四.相关知识二进制代码与格雷码相互转换格雷码(Gray Code,简称G码)是典型的循环码,它是由二进制码(Binary,简称 B 码)导出的。

特点是序号相邻的两组代码只有一位码不同(包括头尾两组代码),且具有循环性。

上述特点使全部码组按序循环相邻,若以循环码表示一个循环过程中按顺序发生的状态,则任何状态变化只对应有一个变量发生变化,这个特点有助于提高电路的可靠性。

五.思路及原理框图本实验分两个部分,首先是一个四位可逆计数器。

这是一个比较基础的部分,每次时钟信号来的时候内置计数器加一或者减一,到十六或者零的时候相应跳变,然后再把这个相应的信号转换到led灯上输出。

第二部分是关于格雷码与二进制码的转换,如上表所示,它把转换关系都告诉我们,这样我们只需要读入单片机上面的输入,再通过几个简单的公式转化输出即可。

框图如下:六.源代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.All;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity count isport(clk_count:in std_logic;SW17:in std_logic;key3:in std_logic;led_out:out std_logic_vector(3 downto 0);ledr17:out std_logic);end count;architecture b of count issignal cntQ:std_logic_vector(3 downto 0);signal countQ:std_logic_vector(24 downto 0):= "0000000000000000000000000";beginprocess(clk_count,SW17,key3)begin--u1:DIV port map(clk_count,clk25);if(key3='0')thenif(sw17='1')thencntQ<="0000";elsecntQ<="1111";end if;elsif(clk_count'event and clk_count='1')thencountQ<=countQ+1;if(countQ(24)='1')thencountQ<=(others=>'0');if(sw17='1')thencntQ<=cntQ+1;elsif(sw17='0')thencntQ<=cntQ-1;end if;end if;end if;end process;led_out<=cntQ;ledr17<=sw17;end b;--------------entity gray isport(sw:in std_logic_vector(17 downto 0);ledr:out std_logic_vector(3 downto 0));end gray;architecture rtl of gray issignal gray:std_logic_vector(3 downto 0);beginprocess(sw)beginif(sw(17)='1')thengray(3)<=sw(3);gray(2)<=sw(3) xor sw(2);gray(1)<=sw(2) xor sw(1);gray(0)<=sw(1) xor sw(0);elsegray(3)<=sw(3);gray(2)<=gray(3) xor sw(2);gray(1)<=gray(2) xor sw(1);gray(0)<=gray(1) xor sw(0);end if;ledr<=gray;end process;end rtl;七.结论与心得体会这个实验难度不大,逻辑思路十分清晰简单,但我却做得很不顺利,做了两个半小时,主要原因是,我的代码中分了许多if循环,而且这些if语句又没有嵌套,这个造成的结果是程序只要检测到敏感列表中的变量的变化,就会在执行完本次循环后跳出,重新执行,这样有些语句就一直没法被执行。

这次实验给我的体会很深,上述失败也让我对VHDL语言编程有了深刻的了解,让我也让我体会到了之前的无知,我决定回去认真研读课本,好好学好这门课。

实验四. 7段数码管译码器设计与实现一.实验目的1.掌握7段数码管译码器的设计与实现2.掌握模块化的设计方法二.实验内容设计一个7段数码管译码器,带数码管的4位可逆计数器[具体要求]1. 7段数码管译码器a)使用拨码开关SW3, SW2, SW1, SW0作为输入,SW3为高位,SW0为低位。

b)将输出的结果在HEX1,HEX0显示。

当输入为‘0000’~‘1111’显示为00~15,2. 带数码管的4位可逆计数器将实验三的结果在数码管上显示。

结合上次实验,将4位可逆计数器,数码管显示,分别作为两个子模块,实现在数码管上显示的4位可逆计数器。

模块化的设计,可以参考《VHDL硬件描述语言与数字逻辑电路设计》一书的第九章三.管脚设定SW[0] PIN_N25SW[1] PIN_N26SW[2] PIN_P25SW[3] PIN_AE14SW[17] PIN_V2HEX0[0] PIN_AF10HEX0[1] PIN_AB12HEX0[2] PIN_AC12HEX0[3] PIN_AD11HEX0[4] PIN_AE11HEX0[5] PIN_V14HEX0[6] PIN_V13HEX1[0] PIN_V20HEX1[1] PIN_V21HEX1[2] PIN_W21HEX1[3] PIN_Y22HEX1[4] PIN_AA24HEX1[5] PIN_AA23HEX1[6] PIN_AB24LEDR[17] PIN_AD12KEY[3] PIN_W26CLOCK_50 PIN_N2四.相关知识数码管如右图所示:每一条线分别对应一个管脚,当管脚为‘0’时,这条线为亮,当管脚设置为‘1’时,这条线不亮。

在DE2中,共有8个数码管。

例如:设置HEX0[0]的管脚为‘0’,那么这条线就会亮。

要让HEX0显示数字0,那么我们可以设置HEX0为“1000000”.五.设计思路及实验框图首先是七段管码的编辑,这是一个相对简单的问题,只需要检测四个按键是否被按下,再转换为相应的数字大小,然后根据上图给的管脚定义,通过一个switch函数,转化为输出。

而第二个实验要求也同样简单,每个时钟就将内置的计数器加一,然后到16以后自动回零,只需相应地转换为数码管输出即可。

六.源代码--------------freqdiv--------------------LIBRARY ieee;USE ieee.std_logic_1164.all;-----------------------------------------ENTITY freqdiv ISPORT(clk: IN STD_LOGIC;out1: BUFFER STD_LOGIC);END freqdiv;-----------------------------------------ARCHITECTURE behavior OF freqdiv ISSIGNAL count1: INTEGER RANGE 1 TO 2**24;BEGINPROCESS(clk)BEGINIF( clk'EVENT AND clk = '1') THENcount1 <= count1 + 1;IF( count1 = 2**24 ) THENout1 <= NOT out1;count1 <= 1;END IF;END IF;END PROCESS;END behavior;--------------subcounter---------------------LIBRARY ieee;USE ieee.std_logic_1164.all;---------------------------------------------ENTITY subcounter ISPORT(clk,SW17,KEY3: IN STD_LOGIC;count2: BUFFER INTEGER RANGE 0 TO 15);END subcounter;---------------------------------------------ARCHITECTURE behavior OF subcounter ISBEGINPROCESS(clk,SW17,KEY3 )BEGINIF( KEY3 = '0' )THENIF( SW17 = '1' )THEN count2 <= 0;ELSE count2 <= 15;END IF;ELSIF( clk'EVENT AND clk = '1')THENIF( SW17 = '1' )THENIF( count2 = 15 )THEN count2 <= 0;ELSE count2 <= count2 + 1;END IF;ELSEIF( count2 = 0 )THEN count2 <= 15;ELSE count2 <= count2 - 1;END IF;END IF;END IF;END PROCESS;END behavior;----------------decoder-----------------------LIBRARY ieee;USE ieee.std_logic_1164.all;----------------------------------------------ENTITY decoder ISPORT(num: IN INTEGER RANGE 0 TO 15;digit1,digit2: OUT STD_LOGIC_VECTOR( 0 TO 6)); END decoder;----------------------------------------------ARCHITECTURE behavior OF decoder ISBEGINPROCESS(num)variable temp1:INTEGER RANGE 0 TO 9;variable temp2:INTEGER RANGE 0 TO 9;BEGINtemp1 := num/10;temp2 := num-temp1*10;CASE temp1 ISWHEN 0 => digit1 <= "0000001";WHEN 1 => digit1 <= "1001111";WHEN 2 => digit1 <= "0010010";WHEN 3 => digit1 <= "0000110";WHEN 4 => digit1 <= "1001100";WHEN 5 => digit1 <= "0100100";WHEN 6 => digit1 <= "0100000";WHEN 7 => digit1 <= "0001111";WHEN 8 => digit1 <= "0000000";WHEN 9 => digit1 <= "0000100";END CASE;CASE temp2 ISWHEN 0 => digit2 <= "0000001";WHEN 1 => digit2 <= "1001111";WHEN 2 => digit2 <= "0010010";WHEN 3 => digit2 <= "0000110";WHEN 4 => digit2 <= "1001100";WHEN 5 => digit2 <= "0100100";WHEN 6 => digit2 <= "0100000";WHEN 7 => digit2 <= "0001111";WHEN 8 => digit2 <= "0000000";WHEN 9 => digit2 <= "0000100";END CASE;END PROCESS;END behavior;----------------MAIN--------------------------LIBRARY ieee;USE ieee.std_logic_1164.all;----------------------------------------------ENTITY counter ISPORT(clk50,SW17,KEY3: IN STD_LOGIC;digit1,digit2: OUT STD_LOGIC_VECTOR(0 TO 6));END counter;----------------------------------------------ARCHITECTURE behavior OF counter IS----------------------------------------------COMPONENT freqdiv ISPORT(clk: IN STD_LOGIC; out1: BUFFER STD_LOGIC);END COMPONENT;----------------------------------------------COMPONENT subcounter ISPORT(clk,SW17,KEY3: IN STD_LOGIC; count2: BUFFER INTEGER RANGE 0 TO 15);END COMPONENT;----------------------------------------------COMPONENT decoder ISPORT(num: IN INTEGER RANGE 0 TO 15; digit1,digit2: OUTSTD_LOGIC_VECTOR( 0 TO 6));END COMPONENT;----------------------------------------------SIGNAL n: INTEGER RANGE 0 TO 15;SIGNAL clknew: STD_LOGIC;BEGINU1: freqdiv PORT MAP(clk50, clknew );U2: subcounter PORT MAP( clknew, SW17, KEY3, n );U3: decoder PORT MAP( n, digit1,digit2 );END behavior;七.结论与心得体会本次实验的逻辑部分都相当简单,但是关于模块化程序设计的思想与方法是十分深刻和复杂的。

相关文档
最新文档