第一篇:EDA实验4lxm
实验四 计数器与七段译码器及显示的设计
一 实验目的
1、掌握七段译码器的工作原理;
2、学会用VHDL硬件描述语言进行数字系统设计;
3、学会运用波形仿真测试检验程序的正确性;
4、用QuartusII完成基本组合电路的设计。
二 实验仪器
PC机、Quartus II 6.0软件、康芯EDA实验箱
三 实验内容
选GW48系统的实验电路模式6,用数码8显示译码输出(PIO46-PIO40),键3到键8作为控制输入端。完成计数器的数码管显示设计。
四 实验原理及步骤
7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。例6-18作为7段译码器,输出信号LED7S的7位分别接如图6-2数码管的7个段,高位在左,低位在右。例如当LED7S输出为“1101101”时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段h,例6-18中的LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)应改为...(7 DOWNTO 0)。
1、根据译码器真值表写出原程序。
译码器真值表:
数
输入
输出
值 A
B C D a b c d e f g 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 2 0 0 1 0 1 1 0 1 1 0 1 3 0 0 1 1 1 1 1 1 0 0 1 4 0 1 0 0 0 1 1 0 0 1 1 5 0 1 0 1 1 0 1 1 0 1 1 6 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 0 8 1 0 0 0 1 1 1 1 1 1 1 9 1 0 0 1 1 1 1 1 0 1 1 A 0 1 0 1 1 1 0 1 1 1 B 1 0 1 1 0 0 1 1 1 1 1 C 1 1 0 0 1 0 0 1 1 1 0 D 1 1 0 1 0 1 1 1 1 0 1 E 1 1 1 0 1 0 0 1 1 1 1 F 1 1 1 1 1 0 0 0 1 1 1
三、实验内容:
1、说明下列程序中各语句的含义,以及该例的整体功能。在Quartus II 6.0上对以下该例进行编辑、编译、综合、适配、仿真,给出其所有信号的时序仿真波形(提示:用输入总线的方式给出输入信号仿真数据)。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DecL7S IS PORT(A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END;ARCHITECTURE one OF DecL7S IS BEGIN PROCESS(A)BEGIN CASE A(3 DOWNTO 0)IS WHEN “0000” => LED7S <= “0111111”;--X“3F”0 WHEN “0001” => LED7S <= “0000110”;--X“06”1 WHEN “0010” => LED7S <= “1011011”;--X“5B”2 WHEN “0011” => LED7S <= “1001111”;--X“4F”3 WHEN “0100” => LED7S <= “1100110”;--X“66”4 WHEN “0101” => LED7S <= “1101101”;--X“6D”5 WHEN “0110” => LED7S <= “1111101”;--X“7D”6 WHEN “0111” => LED7S <= “0000111”;--X“07”7 WHEN “1000” => LED7S <= “1111111”;--X“7F”8 WHEN “1001” => LED7S <= “1101111”;--X“6F”9 WHEN “1010” => LED7S <= “1110111”;--X“77”10 WHEN “1011” => LED7S <= “1111100”;--X“7C”11 WHEN “1100” => LED7S <= “0111001”;--X“39”12 WHEN “1101” => LED7S <= “1011110”;--X“5E”13 WHEN “1110” => LED7S <= “1111001”;--X“79”14 WHEN “1111” => LED7S <= “1110001”;--X“71”15 WHEN OTHERS => NULL;END CASE;END PROCESS;END;
图3-1 共阴数码管及其电路
2、引脚锁定以及硬件下载测试。建议选实验电路模式6,用数码8显示译码输出(PIO46--PIO40),键
8、键
7、键
6、键5四位控制输入,硬件验证译码器的工作性能。
3、用VHDL完成四位二进制加法计数器设计,命名为CNT4B.4、用VHDL例化语句(参考实验1中的1位全加VHDL文本输入设计)按图3-2 的方式,完成顶层文件设计,并重复以上实验过程。注意图3-2中的tmp是4位总线,led是7位总线。对于引脚锁定和实验,建议仍选实验电路模式6,用数码8显示译码输出,用键3作为时钟输入(每按2次键为1个时钟脉冲),或直接时钟信号clock0。
图3-2 计数器和译码器连接电路的顶层文件原理图
(提示:
1、将教材P89页程序和P154页程序读懂,分别建立工程、生成各自原理图。
2、将上述两个原理图按教材P155页图6-19连接起来建立新的原理图设计文件。
3、将上述原理图文件编译、仿真、引脚绑定,下载到实验箱验证。)
四、实验报告要求
1、总结Quartus II 6.0 VHDL 中CASE语句应用及多层次设计方法
2、根据以上的实验内容写出实验报告,包括程序设计、软件编译、仿真分析、硬件测试和实验过程;设计程序、程序分析报告、仿真波形图及其分析报告;
3、心得体会――本次实验中你的感受;你从实验中获得了哪些收益;本次实验你的成功之处;本次实验中还有待改进的地方;下次实验应该从哪些地方进行改进;怎样提高自的实验效率和实验水平等等。
五、问题与思考:
只要求译出数字0~9和“-”,怎样修改程序?
第二篇:EDA实验总结报告
数字EDA实验报告--------------薛蕾0941903207
数字EDA实验 实验报告
学院: 计算机科学与工程学院 专业: 通信工程 学号: 0941903207 姓名: 薛蕾 指导老师: 钱强
数字EDA实验报告--------------薛蕾0941903207 实验一 四选一数据选择器的设计
一、实验目的
1、熟悉Quartus II软件的使用。
2、了解数据选择器的工作原理。
3、熟悉EDA开发的基本流程。
二、实验原理及内容
实验原理
数据选择器在实际中得到了广泛的应用,尤其是在通信中为了利用多路信号中的一路,可以采用数据选择器进行选择再对该路信号加以利用。从多路输入信号中选择其中一路进行输出的电路称为数据选择器。或:在地址信号控制下,从多路输入信息中选择其中的某一路信息作为输出的电路称为数据选择器。数据选择器又叫多路选择器,简称MUX。4选1数据选择器:
(1)原理框图:如右图。
D0、D1、D2、D3
:输入数据 A1、A0
:地址变量
由地址码决定从4路输入中选择哪1路输出。
(2)真值表如下图:(3)逻辑图
数据选择器的原理比较简单,首先必须设置一个选择标志信号,目的就是为了从多路信号中选择所需要的一路信号,选择标志信号的一种状态对应着一路信号。在应用中,设置一定的选择标志信号状态即可得到相应的某一路信号。这就是数据选择器的实现原理。
三.实验内容
1、分别采用原理图和VHDL语言的形式设计4选1数据选择器
2、对所涉及的电路进行编译及正确的仿真。电路图:
四、实验程序
library ieee;use ieee.std_Logic_1164.all;
ENTITY mux4 IS
PORT(a0, a1, a2, a3 :IN STD_LOGIC;
s :IN STD_LOGIC_VECTOR(1 DOWNTO 0);
y :OUT STD_LOGIC);END mux4;ARCHITECTURE archmux OF mux4 IS
BEGIN y <= a0 WHEN s = “00” else
--当s=00时,y=a0 a1 WHEN s = “01” else
--当s=01时,y=a1 a2 WHEN s = “10” else
--当s=10时,y=a2 a3;
--当s取其它值时,y=a2 END archmux;
五、运行结果
六.实验总结
真值表分析:
当js=0时,a1,a0取00,01,10,11时,分别可取d0,d1,d2,d3.实验二 血型配对器的设计
一、实验目的
1、进一步熟悉Quartus II软件的使用。
2、掌握简单组合逻辑电路的设计方法与功能仿真技巧。
3、进一步学习Quartus II中基于原理图设计的流程。
二、实验原理及内容
实验原理
人类有O、A、B、AB 4种基本血型,输血者与受血者的血型必须符合图示原则。设计一血型配对电路,用以检测输血者与受血者之间的血型关系是否符合,如果符合,输出为1,否则为0。
已知: AB血型是万能受血者,O血型是万能献血者!如果要输血给O型血,那么可以的血型是O型!如果要输血给A型血,那么可以的血型是A,O型!如果要输血给B型血,那么可以的血型是B,O型!
如果要输血给AB型血,那么可以的血型是A,B,AB,O型!
输血者
受血者
O A
O A B AB
B AB
三.实验内容
1、用VHDL语言编写程序实现血型配对器的功能 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Vxuexing IS PORT(P,Q,R,S:IN STD_LOGIC;F:OUT STD_LOGIC);END Vxuexing;ARCHITECTURE A OF Vxuexing IS BEGIN
F<=((NOT P)AND(NOT Q))OR(R AND S)OR((NOT P)AND S)OR((NOT Q)AND R);END A;
2、对所编写的电路进行编译及正确的仿真。
实验分析 真值表
PQRSF***************11111
P,Q表示输血者的血型;R,S,表示受血者的血型。当两者符合血型配合原则时,F=1,否则为0.四、运行结果
五、实验总结
本实验给出了四种不同的血型编码,PQ(1,1),RS(1,1)表示AB型血,P,Q(1,0),RS(1,0)表示B型血,PQ(0,1),RS(0,1)表示A型血,PQ(0,0),RS(0,0)表示O型血。根据真值表,并根据实验的原理图,画出电路图并进行连接。
实验三 简单数字钟的设计
一、实验目的
1、了解数字钟的工作原理。
2、进一步学习Quartus II中基于VHDL设计的流程。
3、掌握VHDL编写中的一些小技巧。
4、掌握简单时序逻辑电路的设计方法与功能仿真技巧。
二、实验原理及内容
实验原理
简单数字钟应该具有显示时-分-秒的功能。首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转
三.实验内容
1、用原理图的方式编写一个12/24进制的计数器,并创建为SYMBOL文件。
2、用VHDL的方式编写一个60进制的计数器,并创建为SYMBOL文件。
3、创建顶层文件。调用已编写的SYMBOL文件,设计简单的数字钟电路。
2、对所编写的电路进行编译及正确的仿真。
二十四进制VHDL LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT24 IS PORT(CP, EN, Rd, LD :IN STD_LOGIC;
D
:IN STD_LOGIC_VECTOR(5 DOWNTO 0);
Co
:OUT STD_LOGIC;Q
:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));END CNT24;ARCHITECTURE STR OF CNT24 IS
SIGNAL QN : STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN Co<= '1'WHEN(QN = “010111”AND EN='1')
ELSE '0';PROCESS(CP, RD)
BEGIN IF(Rd ='0')THEN
QN<= “000000”;ELSIF(CP'EVENT AND CP='1')THEN IF(LD='0')THEN QN <= D;
ELSIF(EN='1')THEN QN <= QN+1;END IF;END IF;END PROCESS;Q <= QN;END STR;
六十进制VHDL LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jsq60 IS PORT(en,rd,cp :IN STD_LOGIC;
qh:buffer STD_LOGIC_VECTOR(3 DOWNTO 0);
ql :buffer STD_LOGIC_VECTOR(3 DOWNTO 0);
Co :OUT STD_LOGIC);END jsq60;ARCHITECTURE b OF jsq60 IS BEGIN Co<='1'when(qh=“0101”and ql=“1001” and en='1')else'0';PROCESS(cp,rd)
BEGIN IF(rd='0')THEN qh<=“0000”;ql<=“0000”;ELSIF(cp'EVENT AND cp='1')THEN
IF(en='1')THEN
IF(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 IF;END PROCESS;END b;
原理图
四、运行结果
24进制
60进制
时钟仿真结果
五、实验总结
此设计问题可分为主控电路,计数器模块和扫描显示三大部分,计数器在之前的学习中已经非常熟悉,只要掌握60,12进制的技术规律,用同步或异步计数器都可以实现。二扫描电路我们学过两种驱动方式:BCD码驱动方式和直接驱动方式。
实验四 简单交通灯的设计
一、实验目的
1、了解交通灯的亮灭规律。
2、了解交通灯控制器的工作原理。
3、进一步熟悉VHDL语言编程,了解实际设计中的优化方案。
二、实验原理及内容
实验原理
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车子如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北和东西直行的情况。
要完成本实验,首先必须了解交通路灯的亮灭规律。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。
三.实验内容
1、用VHDL的方式编写一个简单的交通控制灯电路
2、对所编写的电路进行编译及正确的仿真。
程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity traffic is port(clk,enb : in std_logic;
ared,agreen,ayellow,bred,bgreen,byellow : buffer std_logic;
acounth,acountl,bcounth,bcountl : buffer std_logic_vector(3 downto 0));end traffic;
architecture one of traffic is begin process(clk,enb)variable lightstatus : std_logic_vector(5 downto 0);begin
if(clk'event and clk='1')then lightstatus := ared&agreen&ayellow&bred&bgreen&byellow;if((acounth=“0000” and acountl=“0000”)or(bcounth=“0000” and bcountl=“0000”))then Case lightstatus is When “010100”=> lightstatus:=“001100”;acountl<=“0101”;acounth<=“0000”;bcountl<=“0101”;bcounth<=“0000”;When “001100”=> if(enb='1')then lightstatus:=“100010”;acountl<=“0000”;acounth<=“0011”;bcountl<=“0101”;bcounth<=“0010”;
else lightstatus:=“010100”;acountl<=“0101”;acounth<=“0100”;bcountl<=“0000”;bcounth<=“0101”;end if;
when “100010”=>
lightstatus:=“100001”;acountl<=“0101”;acounth<=“0000”;bcountl<=“0101”;bcounth<=“0000”;
when “100001”=>
lightstatus:=“010100”;acountl<=“0101”;acounth<=“0100”;bcountl<=“0000”;bcounth<=“0101”;
when others=> lightstatus:=“010100”;acountl<=“0101”;acounth<=“0100”;bcountl<=“0000”;bcounth<=“0101”;
end case;else if(acountl=“0000”)then acounth<=acounth-1;acountl<=“1001”;
else acountl<=acountl-1;
end if;
if(bcountl=“0000”)then bcounth<=bcounth-1;bcountl<=“1001”;
else bcountl<=bcountl-1;end if;end if;end if;
ared<=lightstatus(5);agreen<=lightstatus(4);ayellow<=lightstatus(3);
bred<=lightstatus(2);bgreen<=lightstatus(1);byellow<=lightstatus(0);end process;end one;
四、运行结果
分析:
这里a代表东西方向,b代表南北方向,acounth是表示东西方向五进制计数acountl是东西方向六进制计数,bcounth则表示南北方向五进制,bounthl则是南北方向六进制计数 东西方向为0时,东西方向红灯亮(ared=1)
东西方向在1~4之间,东西方向绿灯亮(即agreen=1)南北方向 的红灯亮起(即bred=1)
五、实验总结
此设计问题可分为主控电路,译码驱动电路和扫描显示部分。
但是,这远远不能满足实际生活的需要,还应设置倒计时秒数,因此可在此电路基础上外加一个定时模块。
实验五 流水灯的设计
一、实验目的
1、了解流水灯的工作原理。
二、实验原理及内容
实验原理
要完成本实验,首先必须了解流水灯的原理。所谓的流水灯实际上就是由多个LED发光二极管构成的电路,当发光二极管可以依次点亮时,即能呈现流水的效果。实验内容
1、设计能带8个LED发光管发光,并按照要求轮流发光,产生流水灯的流动效果。
2、应具有两种以上不同风格的流动闪亮效果。比如依次点亮或者依次熄灭。(选作)
3、有起动、停止控制键。(选作)
4、有流动闪亮效果选择设置键。(选作)
5、对所编写的电路进行编译及正确的仿真。
三、实验程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY yiweijicun1 IS PORT(CP,R,DSR,DSL:IN STD_LOGIC;
S:STD_LOGIC_VECTOR(2 DOWNTO 0);
D:STD_LOGIC_VECTOR(7 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END yiweijicun1;ARCHITECTURE yiweijicun_arch OF yiweijicun1 IS
SIGNAL IQ: STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN PROCESS(CP,R,IQ)BEGIN IF(R='1')THEN IQ <=(OTHERS =>'0');ELSIF(CP'EVENT AND CP ='1')THEN CASE CONV_INTEGER(S)IS WHEN 0=>NULL;WHEN 1=> IQ <= D;WHEN 2=> IQ <= DSR & IQ(7 DOWNTO 1);WHEN 3=> IQ <=IQ(6 DOWNTO 0)& DSL;WHEN 4=> IQ <= IQ(0)& IQ(7 DOWNTO 1);WHEN 5=> IQ <=IQ(6 DOWNTO 0)& IQ(7);WHEN 6=> IQ <= IQ(7)& IQ(7 DOWNTO 1);WHEN 7=> IQ <= IQ(6 DOWNTO 0)& IQ(0);WHEN OTHERS => NULL;END CASE;END IF;Q <= IQ;END PROCESS;END yiweijicun_arch;
四、运行结果
结果分析:
d[0]~d[7]为八个输入端,s[0]和s[1]控制流水灯得输出,s=1保持,s=2实现左移功能,s=3实现右移功能,因为延迟的原因,在s=2时,需要经过一段时间才能实现循环右移的功能,流水灯的实现其实是运用了8位移位寄存器,它只是运用了其中的保持左移与右移的功能,8LO位移位寄存器还有循环右移,循环左移,算数右移,算数左移等功能。
五、实验总结
了解了移位寄存器的功能和原理
通过这次实验,加深了VHDL语言的运用能力,更进一步了解了8位移位寄存器的功能。
实验六 乘法器的设计
一、实验目的
1、了解乘法器的工作原理。
2、了解复杂时序电路的设计流程。
二、实验原理及内容
实验原理
具体设计原理参见教材188页。实验内容
1、设计一个能进行两个十进制数相乘的乘法器,乘数和被乘数均小于100。(可以参考教材231页的VHDL代码来设计)
2、对所编写的电路进行编译及正确的仿真。
三、实验程序
library IEEE;use IEEE.std_logic_1164.all;
entity one_bit_adder is port(A: in STD_LOGIC;B: in STD_LOGIC;C_in: in STD_LOGIC;S: out STD_LOGIC;C_out: out STD_LOGIC);end one_bit_adder;
architecture one_bit_adder of one_bit_adder is begin
S <= A xor B xor C_in;C_out <=(A and B)or(C_in and(A xor B));
end one_bit_adder;library IEEE;use IEEE.std_logic_1164.all;
entity sichen is port(A: in STD_LOGIC_VECTOR(3 downto 0);B: in STD_LOGIC_VECTOR(3 downto 0);data_out: out STD_LOGIC_VECTOR(6 downto 0));end sichen;
architecture multi_arch of sichen is signal A_MULT_B0: STD_LOGIC_VECTOR(2 downto 0);signal A_MULT_B1: STD_LOGIC_VECTOR(2 downto 0);signal A_MULT_B2: STD_LOGIC_VECTOR(2 downto 0);
signal S_TEMP1: STD_LOGIC_VECTOR(1 downto 0);signal S_TEMP2: STD_LOGIC_VECTOR(1 downto 0);
signal C_TEMP : STD_LOGIC_VECTOR(6 downto 0);
signal C0_out_B0, C1_out_B0, C2_out_B0 : STD_LOGIC;signal C0_out_B1, C1_out_B1, C2_out_B1 : STD_LOGIC;
signal ZERO: STD_LOGIC;
component one_bit_adder port(A: in STD_LOGIC;B: in STD_LOGIC;C_in: in STD_LOGIC;S: out STD_LOGIC;C_out: out STD_LOGIC);end component;begin U_0_0 : one_bit_adder port map(A => A_MULT_B0(1), B => A_MULT_B1(0), C_in => ZERO, S => C_TEMP(1), C_out => C0_out_B0);U_0_1 : one_bit_adder port map(A => A_MULT_B0(2), B => A_MULT_B1(1), C_in => C0_out_B0, S => S_TEMP1(0), C_out => C1_out_B0);U_0_2 : one_bit_adder port map(A => ZERO, B => A_MULT_B1(2), C_in => C1_out_B0, S => S_TEMP1(1), C_out => C2_out_B0);
U_1_0 : one_bit_adder port map(A => A_MULT_B2(0), B => S_TEMP1(0), C_in => ZERO, S => C_TEMP(2), C_out => C0_out_B1);U_1_1 : one_bit_adder port map(A => A_MULT_B2(1), B => S_TEMP1(1), C_in => C0_out_B1, S => S_TEMP2(0), C_out => C1_out_B1);U_1_2 : one_bit_adder port map(A => A_MULT_B2(2), B => C2_out_B0, C_in => C1_out_B1, S => S_TEMP2(1), C_out => C2_out_B1);
A_MULT_B0(0)<= A(0)and B(0);A_MULT_B0(1)<= A(1)and B(0);A_MULT_B0(2)<= A(2)and B(0);
A_MULT_B1(0)<= A(0)and B(1);A_MULT_B1(1)<= A(1)and B(1);A_MULT_B1(2)<= A(2)and B(1);
A_MULT_B2(0)<= A(0)and B(2);A_MULT_B2(1)<= A(1)and B(2);A_MULT_B2(2)<= A(2)and B(2);
ZERO <= '0';C_TEMP(0)<= A_MULT_B0(0);C_TEMP(4 downto 3)<= S_TEMP2(1 downto 0);C_TEMP(5)<= C2_out_B1;
C_TEMP(6)<= A(3)xor B(3);
data_out <= C_TEMP;
end multi_arch;
四、运行结果
乘法器实现A,B两数的相乘。A[0]~A[3]以及B[0]~B[3]是实现输入端的控制。由图看出,输出上产生了延迟是因为当A[3]输入1,对应了十进制的8,B[0]输入1,对应了十进制的1,两者相乘得8,即在data_out端应输出8,此处因仍存在竞争冒险。
五、实验总结
乘法器的设计的问题可以分为乘数和被乘数控制模块,寄存模块,乘法模块和扫描显示模块几个部分。
两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将被乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零。
第三篇:EDA实验六1315212017
《电子设计自动化实验》课程设计
题 目: 十六位硬件乘加器电路 姓 名: 江 璐 学院班级: 13级电子信息工程2班 学 号: 1315212017 指导老师: 邱应强老师 时 间: 20151122 目 录 一:摘要……………………………………………………3 二: 正文……………………………………………………3(一)系统设计………………………………………………3(二)单元电路设计…………………………………………4(三)仿真结果………………………………………………9(四)软件设计………………………………………………11(五)系统测试………………………………………………11(六)结论……………………………………………………14 三:参考文献………………………………………………14 四:附录……………………………………………………15 六:心得体会………………………………………………16 一:摘要
1.实验要求:采用并行、串行或流水线方式来实现对8个16位数据进行乘法和加法运算(yout=a0b0+a1b1+a2b2+a3b3),位宽16位。
2.实验方法:使用乘法器lpm_mult2、16位加法器ADDER16B、计数器cnt16以及锁存器en_dff四个模块。当clock出现上升沿时,对输入端输入的两个数dataa、datab进行乘法运算。将结果输入锁存器中,锁存上一阶段计算得到的值,16位加法器ADDER16B将锁存器锁存的上一阶段的值与进行完乘法计算得到的值dataa*datab加起来,并输出结果。计数器cnt16用于区分四组乘加所得数,当有一个上升沿脉冲送入cnt16时,若计数不到5,则进行计数+1,若计数达到5,COUT输出进位信号到锁存器en_dff的reset端口,将锁存器复位清零,重新进行计数。
3.实验结论:经过仿真与硬件测试检验后证实可行,但是是对8个8位数据进行乘法和加法运算。
二:正文
(一)系统设计
1.设计要求
采用并行、串行或流水线方式来实现对8个16位数据进行乘法和加法运算(yout=a0*b0+a1*b1+a2*b2+a3*b3),位宽16位。
2.系统设计方案
(1)系统设计思路:由十六位加法器构成以时序逻辑方式设计的十六位乘加器,流水线方式,以移位加法为核心器件。(2)总体方案的论证与比较
方案一:采用四个乘法器,以串行方式输入各数据。
方案二:采用一个乘法器,先输入两数据进行运算,将得到结果保存,并与下一组乘法运算得到的结果相加。
方案的选择:第一种方案浪费大量的资源,考虑到实验箱条件限制,采用第二种方案。尽管速度较慢,但可省下相当多的资源,并且实验室可以实现。(3)各功能块的划分与组成
共有4个设计模块,分别是乘法器lpm_mult0、16位加法器ADDER16B、计数器cnt16以及锁存器en_dff。(4)系统的工作原理
以上是电路原理图。乘数dataa与被乘数datab输入乘法器lpm_mult0中,当START有上升沿出现时,乘法器计算出dataa*datab的结果并有result[15..0]输出。result[15..0]输出的结果送入8位加法器ADDER8B的A[15..0]输入端,加法器的B[15..0]输入端连接到锁存器en_dff的输出端q[15..0],这样锁存器锁存的值就可以与加法器所得到的值相加,得到两对乘法计算后值得和,以此类推,可以得到不断累加的值。而CIN端口接地,这样可以确保CIN端口不影响加法器的计算。加法器计算A[15..0](dataa*datab)和锁存器锁存的值B[15..0]的和从输出端S[15..0]输出,输入锁存器en_dff的输入端d[15..0],将数值锁存起来,同时输出端S[15..0]接到输出端YOUT[15..0],从而从仿真中可以看到每一阶段累加的结果。而计数器cnt16的作用是区分四组乘加所得数与四组乘加所得数。EN接高电平,rst接低电平,保证计数器可用,clk接到START,每当有一个上升沿脉冲送入cnt16时,若计数不到5,则进行计数+1,若计数达到5,COUT输出进位信号到锁存器en_dff的reset端口,将锁存器复位清零,重新进行计数。
(二)单元电路设计
总共有四大模块,分别为乘法器lpm_mult0、16位加法器ADDER16B、计数器cnt16以及锁存器en_dff。
1.乘法器lpm_mult0:当clock出现上升沿时,对输入端输入的两个数dataa、datab进行乘法运算。程序:
--megafunction wizard: %LPM_MULT% 4--GENERATION: STANDARD--VERSION: WM1.0--MODULE: lpm_mult--==============--File Name: lpm_mult0.vhd--Megafunction Name(s):------Simulation Library Files(s):--lpm--==============--************************************************************--THIS IS A WIZARD-GENERATED FILE.DO NOT EDIT THIS FILE!----7.2 Build 151 09/26/2007 SJ Full Version--************************************************************--Copyright(C)1991-2007 Altera Corporation--Your use of Altera Corporation's design tools, logic functions--and other software and tools, and its AMPP partner logic--functions, and any output files from any of the foregoing--(including device programming or simulation files), and any--associated documentation or information are expressly subject--to the terms and conditions of the Altera Program License--Subscription Agreement, Altera MegaCore Function License--Agreement, or other applicable license agreement, including,--without limitation, that your use is for the sole purpose of--programming logic devices manufactured by Altera and sold by--Altera or its authorized distributors.Please refer to the--applicable agreement for further details.LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY lpm;USE lpm.all;ENTITY lpm_mult0 IS PORT();END lpm_mult0;ARCHITECTURE SYN OF lpm_mult0 IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR(15 DOWNTO 0);clock dataa datab result
: IN STD_LOGIC;
: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)lpm_mult 5 COMPONENT lpm_mult GENERIC();PORT();END COMPONENT;BEGIN result <= sub_wire0(15 DOWNTO 0);lpm_mult_component : lpm_mult GENERIC MAP()PORT MAP();END SYN;--==============--CNX file retrieval info--==============--Retrieval info: PRIVATE: AutoSizeResult NUMERIC “1”--Retrieval info: PRIVATE: B_isConstant NUMERIC “0”--Retrieval info: PRIVATE: ConstantB NUMERIC “0”--Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING “Cyclone II”--Retrieval info: PRIVATE: LPM_PIPELINE NUMERIC “1” dataa => dataa, datab => datab, clock => clock, result => sub_wire0 lpm_hint => “DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5”, lpm_pipeline => 1, lpm_representation => “UNSIGNED”, lpm_type => “LPM_MULT”, lpm_widtha => 8, lpm_widthb => 8, lpm_widthp => 16
dataa datab clock result
: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC;
: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)lpm_hint
: STRING;
: NATURAL;
: STRING;lpm_pipeline lpm_type lpm_widtha lpm_widthb lpm_widthp lpm_representation
: STRING;
: NATURAL;: NATURAL;: NATURAL 6--Retrieval info: PRIVATE: Latency NUMERIC “1”--Retrieval info: PRIVATE: OptionalSum NUMERIC “0”--Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING “1”--Retrieval info: PRIVATE: SignedMult NUMERIC “0”--Retrieval info: PRIVATE: USE_MULT NUMERIC “1”--Retrieval info: PRIVATE: ValidConstant NUMERIC “0”--Retrieval info: PRIVATE: WidthA NUMERIC “8”--Retrieval info: PRIVATE: WidthB NUMERIC “8”--Retrieval info: PRIVATE: WidthP NUMERIC “16”--Retrieval info: PRIVATE: WidthS NUMERIC “1”--Retrieval info: PRIVATE: aclr NUMERIC “0”--Retrieval info: PRIVATE: clken NUMERIC “0”--Retrieval info: PRIVATE: optimize NUMERIC “0”--Retrieval
info:
CONSTANT:
LPM_HINT
STRING “DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5”--Retrieval info: CONSTANT: LPM_PIPELINE NUMERIC “1”--Retrieval info: CONSTANT: LPM_REPRESENTATION STRING “UNSIGNED”--Retrieval info: CONSTANT: LPM_TYPE STRING “LPM_MULT”--Retrieval info: CONSTANT: LPM_WIDTHA NUMERIC “8”--Retrieval info: CONSTANT: LPM_WIDTHB NUMERIC “8”--Retrieval info: CONSTANT: LPM_WIDTHP NUMERIC “16”--Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL clock--Retrieval info: USED_PORT: dataa 0 0 8 0 INPUT NODEFVAL dataa[7..0]--Retrieval info: USED_PORT: datab 0 0 8 0 INPUT NODEFVAL datab[7..0]--Retrieval info: USED_PORT: result 0 0 16 0 OUTPUT NODEFVAL result[15..0]--Retrieval info: CONNECT: @dataa 0 0 8 0 dataa 0 0 8 0--Retrieval info: CONNECT: result 0 0 16 0 @result 0 0 16 0--Retrieval info: CONNECT: @datab 0 0 8 0 datab 0 0 8 0--Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0--Retrieval info: LIBRARY: lpm lpm.lpm_components.all--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.vhd TRUE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.inc FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.cmp TRUE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.bsf TRUE FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_inst.vhd FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_waveforms.html TRUE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_wave*.jpg FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_syn.v TRUE--Retrieval info: LIB_FILE: lpm
2.16位加法器ADDER16B:将锁存器锁存的上一阶段的值与进行完乘法计算得到的值dataa*datab加起来,并输出结果。程序:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER16B IS PORT(CIN:IN STD_LOGIC;A,B :IN STD_LOGIC_VECTOR(15 DOWNTO 0);S :OUT STD_LOGIC_VECTOR(15 DOWNTO 0);COUT:OUT STD_LOGIC);END ADDER16B;ARCHITECTURE behav OF ADDER16B IS SIGNAL SINT,AA,BB:STD_LOGIC_VECTOR(16 DOWNTO 0);BEGIN AA <= '0' & A;BB <= '0' & B;SINT <= AA+BB+CIN;S <= SINT(15 DOWNTO 0);COUT <= SINT(4);END behav;
3.计数器cnt16:区分每两组乘加所得数。clk接到START,每当有一个上升沿脉冲送入cnt16时,若计数不到5,则进行计数+1,若计数达到5,COUT输出进位信号到锁存器en_dff的reset端口,将锁存器复位清零,重新进行计数。程序:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt16 IS PORT(CLK,RST,EN:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC);END cnt16;ARCHITECTURE behav OF cnt16 IS BEGIN PROCESS(CLK,RST,EN)vARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN IF RST='1' THEN CQI:=(OTHERS=>'0');ELSIF CLK'EVENT AND CLK='1'THEN IF EN='1' THEN IF CQI < 5 THEN CQI:=CQI+1;ELSE CQI:=(OTHERS=>'0');END IF;END IF;END IF;IF CQI=5 THEN COUT<='1';ELSE COUT<='0';END IF;CQ<=CQI;8 END PROCESS;END behav;4.锁存器en_dff:锁存上一阶段计算得到的值,从而使加法器实现累加功能。程序:
library ieee;use ieee.std_logic_1164.all;entity en_dff is port(d: in std_logic_VECTOR(15 DOWNTO 0);reset,EN,clk:in std_logic;q: buffer std_logic_VECTOR(15 DOWNTO 0));end en_dff;architecture behavior of en_dff is begin process(reset,clk)begin if reset='1' then q<=“***0”;elsif clk'event and clk='1'then if EN='1'then q<=d;else q<=q;end if;end if;end process;end behavior;
(三)仿真结果
(1)乘法器
给clock一个时钟信号,验证得当clock处于上升沿时result=dataa*datab
(2)16位加法器ADDER16B 将CIN接低电平,随意设置A、B的值,S为A、B的和。
(3)计数器cnt16 给CLK一个时钟信号。首先将RST置低电平,EN置高电平,验证计数器的计数功能。再分别将RST置高电平、EN置低电平,验证计数器的复位清零以及使能端控制功能。
(4)锁存器en_dff 给clk一个时钟信号。当reset=1时,锁存器清零,当reset=0时有上升沿且使能端EN=1时,d锁存进锁存器中;当有上升沿但是使能端EN=0时,d值不锁存进锁存器中,锁存器的值不改变。
(四)软件设计
1.软件设计平台:QuartusII 7.2 2.实现方法:通过QuartusII 7.2进行VHDL语言编程、方阵、引脚配置,然后烧入 GW48实验平台,选择模式NO.1,进行硬件验证。
3.程序的流程方框图:
4.实现的功能:位宽16位;能对8个16位数据进行乘法和加法运算(yout=a0*b0+a1*b1+a2*b2+a3*b3),并行、串行或流水线方式。
(五)系统测试
1.系统的性能指标(1)总图(2)乘法器lpm_mult0
(3)8位加法器ADDER8B
(4)计数器cnt16(5)锁存器en_dff
2.功能仿真
3.引脚绑定
确定波形仿真成功后,再配置管脚,将程序烧录进EP2C5T144C8中,进行测试。选择模式1,管脚配置图如下(START设置为键8,使得人为可控,更方便调试)
(六)结论
根据硬件验证:键1和键2输入一个十六位数,键3和键4输入另一个十六位数,数码管1、2显示第一个数,3、4显示第二个数,键8是运算键,每点击一次运算一次,为一组运算,运算结果显示在数码管5、6、7、8,将显示这两个数的积,再次输入两个十六位数,数码管5、6、7、8将显示这两个数的积与前一组数积的和,依次输入四组十六位数,完成一次十六位乘加的运算,且结果显示在数码管5、6、7、8。能够实现对8个16位数据进行乘法和加法运算(yout=a0*b0+a1*b1+a2*b2+a3*b3)
三:参考文献
潘松,黄继业.EDA技术与VHDL(第3版)——清华大学出版社
潘松,黄继业.EDA技术实用教程—VHDL版(第4班)——科学出版社 四:附录
1.实验电路结构图
2.GW48系统引脚对照表
五.心得体会
本次的课程设计选题时间较短,由于不怎么会写程序,所以乘法器使用Quartus II生成,而其他模块是在网上找的资料,自己输入编译反复修改而成。总体来说过程比较顺利,但不足之处是不能完全实现设计要求。
第四篇:EDA实验二总结报告
实验二
数字秒表设计
一、实验目的
1、理解计时器的原理与Verilog/VHDL 的编程方法;
2、掌握多模块设计及层次设计的方法。
二、实验原理
秒计时器是由计数器和译码器、显示器组成,其核心是计数器与译码器。60 秒计时器可由二个计数器分别完成:个位为十进制计数器,十位为 6 进 制计数。个位计数器的计数信号由实验开发板上主频20MHZ分频产生的1Hz 时钟信号提供, 十位计数器的计数信号由个位的进位信号提供。然后由译码器 对计数结果进行译码,送LED 数码管进行显示。Clr为清零,se t为开始。
三、实验框图
四、实验任务
1、采用层次设计的方法,设计一个包括顶层及底层模块的60 秒计时器,底 层模块用Verilog/VHDL 设计,顶层用原理图设计。
2、秒计时器应当具有系统复位功能;
3、每十秒发出提示信号及计满60 秒时发出报警信号。(选做)
五、实验步骤与要求
1、分模块设计:首先分别设计10 进制、6 进制计数器、译码器模块;
2、顶层原理图如图7-1 所示;
3、编译完成后进行波形仿真;
4、进行引脚锁定,并下载至开发系统验证。
六、分模块设计 1.十进制计数器(1)程序代码:
module CNT10(CLK,RST,EN,COUT,DOUT);
input CLK,EN,RST;
output [3:0]DOUT;
output COUT;
reg[3:0]Q1;
reg COUT;
assign DOUT=Q1;
always@(posedge CLK or negedge RST)
begin
if(!RST)Q1<=0;
else if(EN)begin
if(Q1<9)Q1<=Q1+1;
else Q1<=4'b0000;end
end
always@(Q1)
if(Q1==4'h9)COUT=1'b1;
else COUT=1'b0;endmodule
(2)仿真波形
(3)模块符号
2.六进制计数器(1)程序代码:
module CNT6(CLK,RST,EN,COUT,DOUT);
input CLK,EN,RST;
output [3:0]DOUT;
output COUT;
reg[3:0]Q2;
reg COUT;
assign DOUT=Q2;
always@(posedge CLK or negedge RST)
begin
if(!RST)Q2<=0;
else if(EN)begin
if(Q2<5)Q2<=Q2+1;
else Q2<=3'b000;end
end
always@(Q2)
if(Q2==3'h5)COUT=1'b1;
else COUT=1'b0;endmodule
(2)仿真波形
(3)模块符号
3.分频器
(1)程序代码:
module FPQ(clk0,clk1);
input clk0;
output clk1;
reg[26:0] Q1;
reg clk1;always@(posedge clk0)
if(Q1<10)Q1<=Q1+1;
else
begin Q1<=0;
clk1<=~clk1;
end endmodule(2)模块符号
七.顶层原理图:
八.仿真波形
九.结果分析
当输入端CLK,EN,RST都不为0时,首先是十进制计数器开始进行计时,直到DOUT1输出端大于9时产生进位,并且自身变为0,同时使六进制计数器也开始计时,六进制输出端DOUT2大于5时产生进位,使COUT输出为1.
第五篇:EDA实验总结
EDA 实验总结
系别:物理系 专业:电子信息科学与技术 姓名:马亚伟 学号:2010171135
在本学期短短6周的EDA实验学习中,我初步对这一新的领域有了一个较为系统的理解,也为我的专业学习打开了一个新的思路,那就是EDA技术。
首先,通过对这门课程相关理论的学习,我掌握了EDA的一些基本的的知识,现代电子产品的性能越来越高,复杂度越来越大,更新步伐也越来越快。实现这种进步的主要原因就是微电子技术和电子技术的发展。前者以微细加工技术为代表,目前已进入超深亚微米阶段,可以在几平方厘米的芯片上集成几千万个晶体管;后者的核心就是电子设计自动化EDA技术。
EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
其次,通过对课程的实验的学习,我对EDA的学习和理解有了更深刻的认识和体会。因为只对课本知识的学习,我对实验做成功的把握不是很大。
EDA实验,作为一门实实在在的实验学科,它可以帮助我们进一步理解巩固电路学设计的知识,激发我们对EDA设计的学习兴趣。通过这六个实验,我对EDA实验有了更深刻的了解,体会到了EDA的神奇与奥妙。
不过说实话在做这次实验之前,我以为不会难做,就像以前做的实验一样,操作应该不会很难,做完实验之后两下子就将实验报告写完,直到做完这次EDA实验时,我才知道其实并不容易做。它真的不像我想象中的那么简单,天真的以为自己把平时的理论课学好就可以很顺利的完成实验,事实证明我错了,当我走上试验台,我意识到要想以优秀的成绩完成此次所有的实验,难度很大,但我知道这个难度是与学到的知识成正比的,因此我想说,虽然我在实验的过程中遇到了不少困难,但最后的成绩还是不错的,因为我毕竟在这次实验中学到了许多在课堂上学不到的东西,终究使我在这次实验中受益匪浅。
下面我想谈谈我在所做的实验中的心得体会:
我想无论你是学习理论知识还是进行实际操作,只要抓住这个中心,我想可能你所遇到的续都问题就可以迎刃而解。不过在做这个实验,我想我们应该注意Quarter Ⅱ使用,尽管它的操作很简单,但如果你马虎大意也是完全有可能出错的,是你整个的实验前功尽弃!
在接下来的实验中,我们通过对EDA设计软件Quarter Ⅱ使用,初步学会了EDA设计软件Quarter Ⅱ使用方法。在实验中我们编写程序,pin脚编写,时序仿真等。在完成VHDL的编辑以后,进行编译,结果出现了很多错误,在我们细心的检查和排查之下,最终将VHDL描述修改成功并且通过了编译。在编译过程中我了解到很多在书本上没有理解的知识。比如信号不能在多个并行进程中赋值,顺序语句必须在进程中才能描述等等。在时序仿真这一块我们也遇到了问题,起初我们没有考虑到信号赋值的延迟,也没有考虑到仿真延迟δ,取时钟周期为默认值10ns,这样仿真得到的结果就与预期的结果不符合,找到问题后我们采用了1us的始终周期,最终得到了想要的波形。
总的来说,通过实验,我激发了EDA学习的兴趣,也对这门课程有了更深的理解,对EDA设计软件Quarter Ⅱ的使用也更加熟练。更重要的是在此次实验过程中,更好的培养了我们的具体实验的能力。又因为在在实验过程中有许多实验现象,需要我们仔细的观察,并且分析现象的原因。特别有时当实验现象与我们预计的结果不相符时,就更加的需要我们仔细的思考和分析了,并且进行适当的调节。