当前位置:文档之家› 北邮数电实验报告

北邮数电实验报告

北京邮电大学实验报告实验名称:数字电路与逻辑设计实验报告学院:信息与通信工程学院班级:姓名:学号:序号:日期:实验三:用VHDL语言设计与实现逻辑电路一、实验内容1. 用VHDL语言设计实现一个带异步复位的8421码十进制计数器,仿真验证其功能,并下载到实验版测试。

要求用按键设定输入信号,发光二极管显示输出信号;2.用VHDL语言设计实现一个分频系数为12,分频输出信号占空比为50%的分频器,仿真验证其功能;3.将(1),(2)和数码管译码器3个电路进行连接,并下载到实验板显示计数结果。

二、模块端口说明及连接图1.分频器2. 计数器clk: 时钟输入信号 clk: 时钟信号输入clear: 复位信号输入 clear: 复位信号输入clk_out: 时钟分频后的信号输出 q: 计数器的输出3.数码管显示b: 数码管的输入信号seg: 译码显示输出onoff: 数码管的输出控制4.连接图三、实验分析1.设计思路本实验将之前的分频器和计数器以及数码管显示模块组合起来,实现了单个数码管现显示0~9,每隔0.5s切换一次显示内容。

COMPONENT div_12实现了时钟分频,将50MHz的单片机晶振时钟进行分频,输出频率2HZ占空比50%的方波时钟,以此时钟作为内部时钟驱动计数器。

COMPONENT jishuqi是一个十进制计数器,NUM从“0000”到“1001”循环变化,模为10。

计数器的输出传递给数码管译码显示电路。

COMPONENT seg7_1是数码管译码显示电路,将收到的信号NUM译码并控制数码管的段锁存来控制数码管的显示。

整体来看,div-12提供了分频后2Hz的时钟,驱动计数器计数,计数的结果作为数码管译码显示模块的输入,根据计数器实时的数进行数码管的显示。

综合起来就实现了设计的功能。

在进行电路的连接时,可直接在代码中分成三个进程来实现,也可通过为每个模块建立符号,连接电路图来实现。

2. 具体代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY fenpinjishu ISPORT(clear2 :IN STD_LOGIC;clk1:IN STD_LOGIC;b1:OUT STD_LOGIC_VECTOR(6 downto 0);CAT:OUT STD_LOGIC_VECTOR(7 downto 0));end fenpinjishu;ARCHITECTURE a OF fenpinjishu ISCOMPONENT div_12PORT(clk :IN STD_LOGIC;clk_out:OUT STD_LOGIC);END COMPONENT;COMPONENT jishuqiPORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT seg7_1PORT(a:IN STD_LOGIC_VECTOR(3 downto 0);b:OUT STD_LOGIC_VECTOR(6 downto 0));END COMPONENT;SIGNAL na:STD_LOGIC;SIGNAL nb:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINu1:div_12 PORT MAP(clk_out=>na,clk=>clk1);u2:jishuqi PORT MAP(reset=clear2,clk=>na,q=>nb); u3:seg7_1 PORT MAP(a=>nb,b=>b1);CAT<="11111101";END a;3.波形图如下:4.波形分析:由波形图我们可以看出,输入的时钟信号经过分频器后产生了周期为输入信号12倍的时钟信号,实现了分频器的12倍分频功能,同时clear实现的是清零功能,为高电平有效,当输入clear信号时,分频器的输出重新进行周期分频,clear信号之后经过六个周期信号进行一次反转;接着进行上升沿有效的从0~9的8421十进制计数器,每个计数数字都对应一个七位输出来控制数码管。

四、分块实验分析1、数码管译码器:VHDL代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY seg7_1 ISPORT(a:IN STD_LOGIC_VECTOR(3 downto 0);b:OUT STD_LOGIC_VECTOR(6 downto 0);cat:out std_logic_vector(5 downto 0));end seg7_1;ARCHITECTURE seg7_1_arch OF seg7_1 ISBEGINPROCESS(a)BEGINCASE a ISWHEN"0000" => b <="1111110";--0WHEN"0001" => b <="0110000";--1WHEN"0010" => b <="1101101";--2WHEN"0011" => b <="1111001";--3WHEN"0100" => b <="0110011";--4WHEN"0101" => b <="1011011";--5WHEN"0110" => b <="1011111";--6WHEN"0111" => b <="1110000";--7WHEN"1000" => b <="1111111";--8WHEN"1001" => b <="1111011";--9WHEN OTHERS =>b <="0000000";END CASE;END PROCESS;cat<="111101";END;2、8421十进制计数器:VHDL代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jishuqi ISPORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END jishuqi;ARCHITECTURE a OF jishuqi ISSIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk,reset)BEGINIF reset='0' THENq_temp<="0000";ELSIF clk'EVENT AND clk='1' THENIF q_temp="1001" THENq_temp<="0000";ELSE q_temp<=q_temp+1;END IF;END IF;END PROCESS;q<= q_temp;END a;仿真波形图:分析:因为计数器采用的是异步复位,所以复位信号的优先级更高。

当复位信号为0时,输出变为0000当复位信号为1时,每当遇到时钟上升沿,输出加1,实现计数的功能,计算循环为0000到1010(二进制表示)。

3、分频器:VHDL 代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY div_12 ISPORT(clk :IN STD_LOGIC;clk_out:OUT STD_LOGIC);END div_12;ARCHITECTURE a OF div_12 ISSIGNAL tmp:INTEGER RANGE 0 TO 5;SIGNAL clktmp:STD_LOGIC;BEGINPROCESS(clear,clk)BEGINIF clk'event AND clk='1' THENIF tmp = 5 THENtmp<=0;clktmp<=NOT clktmp;ELSEtmp <=tmp+1;END IF;END IF;END PROCESS;clk_out<=clktmp;END a;仿真波形:分析:当clear=0时,将会重新计算6个时钟周期,因此输出波形中相邻两个输出为1的位置中间有12个代表半个周期的方格。

五、故障及问题分析1.程序运行时经常出现的是编译出错,可能有以下几种情况:(1)做实验时,由于不是很清楚VHDL语言和Quartus的命名规则,命名时VHDL 文件名与实体名不一致,导致文件运行不成功;或者文件夹中出现了中文名,运行也可能出错。

尽量用英文来命名,不知道的英文拼写用拼音,不能出现中文。

(2)在文件编译前一定记得要保存,仿真前也要保存。

(3)每次重启之前完成的工程,进行其他操作前一定要先编译,不然可能后续操作会出现莫名其妙的bug。

2.仿真出错,可能的原因有:(1)时间尺度设置不合适:在设置时间时,我们一般采用的微秒级的周期,若输入周期太短,经过电路的延迟后,输出波形可能与预计波形不同;(2)仿真文件名:保存的仿真文件名一定要与工程名一致,仿真才能成功;仿真时需注意:在实验三中进行信号的输入时,使用数组来实现比较简单;一般我们进行结果的验证时习惯用二进制结果来检查,这时我们需要在properties中将类型改为二进制;在输出信号的显示中出现毛刺是正常现象,这应属于电路的冒险。

3.下载编译出错,可能的原因有:(1)管脚输入有误,应检验相应的管脚连接是否正确;(2)管脚设置完成后一定要进行编译,否则管脚设置不起作用。

六、实验总结本学期接触了数字电路与逻辑设计这门课后,发现它是一门很有意思的课程,电路的设计很巧妙,最终的逻辑图也是通俗易懂,个人感觉没有模电的电路那么复杂,同时电路实现的功能也很强大,更贴近我们的生活,在VDHL语言的学习中,我有以下几点感触:VHDL语言的逻辑语法类似于C++语言,也和QSL语言有某些相似之处,它跟之前做FPGA实验时我们掌握的Verilog语言也很相似,因此有了编程的基础,学起VHDL语言会更得心应手。

相关主题