第一篇:EDA分频器实验教案
实验三:整数分频器的设计
一 实验目的
了解利用类属设计可配置的重用设计技术。二 实验原理
利用类属n 可以改变分频器的分频系数,输出q的频率是输入信号clk频率的1/n。通过给n赋不同的值,就可以得到需要的频率。三 实验器材 EDA实验箱 四 实验内容
1.参考教材第5章中5.3.1,完成整数分频器的设计。
2.修改5.3.1中的分频系数n,观察仿真波形和实验箱输入/输出信号的变化。3.在试验系统上硬件验证分频器的功能。
在实验三中,建议将实验箱的实验电路结构模式设定为模式7。输入信号clk由键7的输出来模拟,输入信号reset_n由键8模拟,输出信号q接至LED:D14。当然,也可以由实验者设定到其它功能相似的键或者LED。
代码:(参考教材第5章中5.3.1)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity div is
generic(n:integer:=8);
port(clk,reset_n:in std_logic;
q: out std_logic);end div;architecture behavl_div of div is
signal count:integer range n-1 downto 0;begin
process(reset_n,clk)
begin
if reset_n='0' then q<='0';count<=n-1;
elsif(clk'event and clk='1' and clk'last_value='0')then
count<=count-1;
if count>=(n/2)then q<='0';
else q<='1';
end if;
if count<=0 then count<=n-1;
end if;
end if;end process;end behavl_div;
五 实验注意事项
1.编写代码时一定要书写规范
2模式的选择和引脚的配置一定要合理 六 实验报告
简述实验过程,将实验项目分析设计,仿真和测试写入实验报告。
第二篇:EDA技术实验教案
一、课程名称:
EDA技术实验
二、教材名称: 《EDA技术使用教程》,潘松等编著。
三、本课程教学目的、要求:
介绍EDA的基本知识、常用的EDA工具的使用方法和目标器件的结构原理、VHDL设计输入方法(图形和文本)、VHDL仿真、VHDL的设计优化等。
EDA技术作为重要的专业课程,其实践性强。在教学时要注重理论和实践的紧密结合,通过大量上机操作,使学生掌握VHDL的基本结构和编程思想。实验1 原理图输入方法及8位全加器设计(4课时)
1)实验目的:
熟悉利用MAX+plusⅡ的原理图输入方法设计简单组合电路,掌握层次化设计的方法,并通过一个8位全加器的设计把握利用EDA软件进行电子电路设计的详细流程。2)实验报告要求:
详细叙述8位加法器的设计流程;给出各层次的原理图及其对应的仿真波形图;给出加法器的延时情况。
3)实验步骤:
(1)设计一个一位半加器。
步骤1:输入设计项目和存盘 步骤2:输入半加器元件: 步骤3:将项目设置为工程文件 步骤4:选择目标器件并编译 步骤5:时序仿真 步骤6:包装元件入库
选择菜单“File”→“Open”,在“Open”对话框中选择原理图编辑文件选项“Graphic Editor Files”,然后选择h_adder.gdf,重新打开半加器设计文件,然后选择如图4-5中“File”菜单的“Create Default Symbol”项,将当前文件变成了一个包装好的单一元件(Symbol),并被放置在工程路径指定的目录中以备后用。
(2)利用半加器组成一个一位全加器,并记录仿真结果。(3)利用全加器组成一个八位全加器,并记录仿真结果。
实验二
简单组合电路和时序电路设计(4课时)
一、实验目的:
熟悉Max+plusⅡ的VHDL文本设计流程全过程,学习简单组合电路和时序电路的设计和仿真方法。
二、实验内容
1:首先利用MAX+plusⅡ完成2选1多路选择器和一位全加器的文本编辑输入和仿真测试等步骤,给出仿真波形,验证本项设计的功能。
2:设计触发器(J-K),给出程序设计、软件编译、仿真分析、硬件测试及详细实验过程。
3:先设计或门和一位半加器的VHDL描述文件,并进行仿真调试,再用元件例化的方法实现一位全加器,并仿真调试。要求记录VHDL文件内容和仿真波形结果。
4:用一位全加器设计8为全加器。要求记录VHDL文件内容和仿真波形结果。(选作)参考程序 ENTITY mux21a IS PORT(a, b : IN BIT;s : IN BIT;y : OUT BIT);END ENTITY mux21a;ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT;BEGIN d <= a AND(NOT S);e <= b AND s;y <= d OR e;END ARCHITECTURE one;
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY or2a IS PORT(a, b :IN STD_LOGIC;c : OUT STD_LOGIC);END ENTITY or2a;
ARCHITECTURE fu1 OF or2a IS BEGIN c <= a OR b;END ARCHITECTURE fu1;
半加器描述(1)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY adder IS PORT(a, b : IN STD_LOGIC;co, so : OUT STD_LOGIC);END ENTITY adder;ARCHITECTURE fh1 OF adder is BEGIN so <= NOT(a XOR(NOT b));co <= a AND b;END ARCHITECTURE fh1;
1位二进制全加器顶层设计描述 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY f_adder IS PORT(ain,bin,cin : IN STD_LOGIC;cout,sum : OUT STD_LOGIC);END ENTITY f_adder;ARCHITECTURE fd1 OF f_adder IS COMPONENT h_adder PORT(a,b : IN STD_LOGIC;co,so : OUT STD_LOGIC);END COMPONENT ; COMPONENT or2a PORT(a,b : IN STD_LOGIC;c : OUT STD_LOGIC);END COMPONENT;
SIGNAL d,e,f : STD_LOGIC;BEGIN u1 : h_adder PORT MAP(a=>ain,b=>bin,co=>d,so=>e);u2 : h_adder PORT MAP(a=>e,b=>cin,co=>f,so=>sum);u3 : or2a PORT MAP(a=>d,b=>f,c=>cout);END ARCHITECTURE fd1;二选一多路选择器仿真结果:
实验三
含异步清0和同步时钟使能的4位加法计数器(4课时)
一、实验目的:
学习计数器的设计、仿真,进一步熟悉VHDL设计技术。
二、实验内容:
设计一含计数使能、异步复位和能进行计数值并行预置功能的4位加法计数器。RST是异步清零信号,高电平有效;clk是时钟输入信号;D0、D1、D2、D3是4位数据输入端(数据预置输入端)。Q0、Q1、Q2、Q3为计数器输出端。COUT为进位输出端。ENA为使能端,为„1‟时,计数器实现对CLK时钟脉冲信号的加1计数,为0时停止计数。
参考程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4B IS PORT(CLK : IN STD_LOGIC;RST : IN STD_LOGIC;ENA : IN STD_LOGIC;OUTY : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT : OUT STD_LOGIC);END CNT4B;ARCHITECTURE behav OF CNT4B IS SIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN P_REG: PROCESS(CLK, RST, ENA)BEGIN IF RST = '1' THEN CQI <= “0000”;ELSIF CLK'EVENT AND CLK = '1' THEN IF ENA = '1' THEN CQI <= CQI + 1;ELSE CQI <= “0000”;END IF;END IF;OUTY <= CQI;END PROCESS P_REG;COUT <= CQI(0)AND CQI(1)AND CQI(2)AND CQI(3);--进位输出 END behav;
实验四
7段数码显示译码器设计(2课时)
一、实验目的:
1、学习7段数码显示译码器设计;
2、学习VHDL的多层次设计方法。
二、实验原理:
7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。但为了简化过程,首先完成7段BCD码译码器的设计。例如输出为“1101101”时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。
图6-21 共阴数码管及其电路
三、实验内容
1、编程实现7段数码显示译码器设计;
2、对7段数码显示译码器设计进行编辑、仿真,给出其所有信号的时序仿真波形; 参考程序: 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 IS WHEN “0000” => LED7S <= “0111111”;WHEN “0001” => LED7S <= “0000110”;WHEN “0010” => LED7S <= “1011011”;WHEN “0011” => LED7S <= “1001111”;WHEN “0100” => LED7S <= “1100110”;WHEN “0101” => LED7S <= “1101101”;WHEN “0110” => LED7S <= “1111101”;WHEN “0111” => LED7S <= “0000111”;WHEN “1000” => LED7S <= “1111111”;WHEN “1001” => LED7S <= “1101111”;WHEN OTHERS => NULL;END CASE;END PROCESS;END;仿真结果:
综合后的计数器和译码器连接电路的顶层文件原理图:
实验五
用状态机实现序列检测器的设计(4课时)
一、实验目的:
1、掌握状态机的编程方法和步骤;
2、掌握用状态机设计序列检测器的方法和步骤;
二、实验内容
用状态机编程实现对系列数“11100101”的检测,当某一系列串(以左移方式)进入检测器后,若该串与预置的系列数相同,则输出“A”,否则输出“B”。
三、实验步骤:
1、编辑系列检测器的VHDL程序;
2、仿真测试并给出仿真波形,了解控制信号的时序;
3、将上述方案改为系列检测密码为可预置(外部输入)情况,重新编写程序、编译和仿真,并记录仿真结果。参考程序:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SCHK IS PORT(DIN,CLK,CLR : IN STD_LOGIC;AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END SCHK;ARCHITECTURE behv OF SCHK IS SIGNAL Q:INTEGER RANGE 0 TO 8;SIGNAL D:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN D<=“11100101”;PROCESS(CLK,CLR)BEGIN IF CLR= '1' THEN Q <= 0;ELSIF clk='1' AND clk'EVENT THEN CASE Q IS WHEN 0 => IF DIN = D(7)THEN Q<=1;ELSE Q<=0;END IF;WHEN 1 => IF DIN = D(6)THEN Q<=2;ELSE Q<=0;END IF;WHEN 2 => IF DIN = D(5)THEN Q<=3;ELSE Q<=0;END IF;WHEN 3 => IF DIN = D(4)THEN Q<=4;ELSE Q<=0;END IF;WHEN 4 => IF DIN = D(3)THEN Q<=5;ELSE Q<=0;END IF;WHEN 5 => IF DIN = D(2)THEN Q<=6;ELSE Q<=0;END IF;WHEN 6 => IF DIN = D(1)THEN Q<=7;ELSE Q<=0;END IF;WHEN 7 => IF DIN = D(0)THEN Q<=8;ELSE Q<=0;END IF;WHEN OTHERS=> Q<=0;END CASE;END IF;END PROCESS;PROCESS(Q)BEGIN IF Q=8 THEN AB<=“1010”;ELSE AB<=“1011”;END IF;END PROCESS;END behv;仿真结果:
提高型实验:
实验六
用VHDL实现数字钟及校园打铃系统(6课时)
一、实验目的及要求:
1、掌握VHDL语言的基本结构及编程思想。
2、掌握VHDL语言的进行系统设计的方法和步骤。
3、提高学生综合应用能力。
二、实验内容:
1、用VHDL实现数字钟及校园打铃系统的软件编辑。
2、用VHDL实现数字钟及校园打铃系统的软件仿真。
三、实验步骤
1、用VHDL编辑60进制计数器,并进行软件仿真。
2、用VHDL编辑24进制计数器,并进行软件仿真。
3、用VHDL编辑30进制计数器,并进行软件仿真。
4、用元件例化的方法实现数字钟的软件编辑及软件仿真。
5、实现数字钟的校时功能。
6、实现数字钟的打铃功能。
7、完成数字钟及校园打铃系统的实验报告。
实验七
A/D采样控制器设计
一、实验目的及要求:
1、掌握VHDL语言的基本结构及编程思想。
2、掌握A/D采样控制器的工作原理。
3、掌握A/D采样控制器的VHDL语言编程方法。
二、实验内容:
1、设计一A/D0809模数转换器控制器。
2、将转换结果送数码管显示器显示(2位)。
3、模拟输入通道为IN0。
三、实验步骤:
1、ADC0809特点介绍
(1)、单极性输入,8位A/D转换精度。(2)、逐次逼近式,每次采样时间约为100US(3)、8通道模拟输入
2、A/D转换器外部引脚功能结构图
3、A/D转换器时序图
4、AD转换控制器与AD转换器的接口电路框图
5、状态控制
S0状态:初始状态。ADDC=‘1’,选择1通道模拟信号输入。
ALE=START=OE=LOCK=‘0’;
S1状态:通道锁存。ALE=‘1’, START=OE=LOCK=‘0’;
S2状态:启动A/D转换。ALE=‘1’,START=‘1’,OE=LOCK=‘0’; S3状态:A/D转换等待状态。
ALE=START=‘0’,OE=LOCK=‘0’;
IF EOC=‘0’
保持当前状态不变,继续等待A/D转换。
ELSE
转换结束,进入下一状态。
S4状态:数据输出允许状态。A/D转换完毕,开启数据输出允许信号。
ALE=‘0’,START=‘0’,OE=‘1’,LOCK=‘0’;
S5状态:数据锁存状态。开启数据锁存信号,将转换结果送锁存器锁存。
ALE=‘0’,START=‘0’,OE=‘1’,LOCK=‘1’; S6状态:延时状态。为了保证数据可靠锁存,延时一个时钟状态周期。
ALE=‘0’,START=‘0’,OE=‘1’,LOCK=‘1’; 其它状态:返回到初始状态。ALE=START=OE=LOCK=‘0’;
6、参考程序: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY AD0809 IS
PORT(D :IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CLK0,EOC : IN STD_LOGIC;
ADDA,OE : OUT STD_LOGIC;
ALE,START : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
QQ : OUT INTEGER RANGE 15 DOWNTO 0);END AD0809;ARCHITECTURE behav OF AD0809 IS
TYPE ST_TYPE IS(S0, S1, S2, S3,S4,S5,S6,S7);
SIGNAL CURRENT_STATE,NEXT_STATE : ST_TYPE;
SIGNAL REGL:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL LOCK :STD_LOGIC;
BEGIN
ADDA<='1';
PRO: PROCESS(CURRENT_STATE,EOC)
BEGIN
CASE CURRENT_STATE IS
WHEN S0 => QQ<=0;ALE<='0';START<='0';OE<='0';LOCK<='0';NEXT_STATE <= S1;
WHEN S1 => QQ<=1;ALE<='0';START<='0';OE<='0';LOCK<='0';NEXT_STATE <= S2;
WHEN S2 => QQ<=2;ALE<='1';START<='1';OE<='0';LOCK<='0';NEXT_STATE <= S3;
WHEN S3 => QQ<=3;ALE<='1';START<='1';OE<='0';LOCK<='0';
IF EOC='0' THEN NEXT_STATE <= S4;
ELSE NEXT_STATE <= S3;
END IF;
WHEN S4 => QQ<=4;ALE<='0';START<='0';OE<='0';LOCK<='0';
IF EOC='1' THEN NEXT_STATE <= S5;
ELSE NEXT_STATE <= S4;
END IF;
WHEN S5 => QQ<=5;ALE<='0';START<='1';OE<='1';LOCK<='0';NEXT_STATE <= S6;
WHEN S6 => QQ<=6;ALE<='0';START<='0';OE<='1';LOCK<='1';NEXT_STATE <= S7;
WHEN S7 => QQ<=7;ALE<='0';START<='0';OE<='1';LOCK<='1';NEXT_STATE <= S0;
WHEN OTHERS => NEXT_STATE <= S0;
END CASE;
END PROCESS PRO;REG:PROCESS(CLK0)
BEGIN
IF CLK0'EVENT AND CLK0='1' THEN
CURRENT_STATE<=NEXT_STATE;
END IF;
END PROCESS REG;
COM:PROCESS(LOCK)
BEGIN
IF LOCK'EVENT AND LOCK='1' THEN
REGL<=D;
END IF;
END PROCESS COM;
Q<=REGL;END behav;
实验八
数字频率计设计
一、实验目的及要求:
1、掌握VHDL语言的基本结构及编程思想。
2、掌握数字频率计的工作原理。
3、掌握数字频率计的VHDL语言编程方法。
二、实验内容:
1、设计8位十进制数字频率计。
2、测量频率范围为1Hz-50MHz
三、实验原理: 测频原理框图
四、实验步骤 1、8位十进制计数器设计
(1)用VHDL设计十进制计数器,并进行软件和硬件仿真 参考程序如下: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 IS
PORT(CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC);
END CNT10;ARCHITECTURE behav OF CNT10 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 < “1001” THEN
CQI := CQI + 1;--允许计数
ELSE
CQI :=(OTHERS =>'0');--大于9,计数值清零
END IF;
END IF;
END IF;
IF CQI = “1001” THEN COUT <= '1';--计数大于9,输出进位信号
ELSE
COUT <= '0';
END IF;
CQ <= CQI;
--将计数值向端口输出
END PROCESS;END behav;(2)8位十进制频率计电路图 2、32位锁存器设计 参考程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY reg32b IS
PORT(load : IN STD_LOGIC;
din: in STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END reg32b;ARCHITECTURE behav OF reg32b IS BEGIN
PROCESS(load,din)
BEGIN
IF load'EVENT AND load='1' THEN
dout<=din;
END PROCESS;END behav;3控制器设计
(1)控制器时序图
(2)参考程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY testctl IS
PORT(clk : IN STD_LOGIC;
tsten:out
STD_LOGIC;
clr_cnt: out
STD_LOGIC;
load:out
STD_LOGIC);
END testctl;ARCHITECTURE behav OF testctl IS
signal div2clk:std_logic;BEGIN
PROCESS(clk)
BEGIN
IF clk'EVENT AND clk='1' THEN
div2clk<=not div2clk;
END PROCESS;
process(clk,div2clk)
begin
if clk='0' and div2clk='0'
then
clr_cnt<='1';
else clr_cnt<='0';
end if;
end process;
load<=not div2clk;
tsten<=div2clk;END behav;
END IF;END IF;
实验九
DAC接口电路与波形发生器设计
一、实验目的及要求:
1、掌握VHDL语言的基本结构及编程思想。
2、掌握DA转换器接口方法。
3、掌握DA转换器的VHDL语言编程方法。
二、实验内容:
1、设计一DAC0832数模转换器控制器。
2、要求使用DAC转换器输出一正弦波,最大值为5V。(使用单缓冲方式)
3、要求正弦波频率能步进可调,步进间隔为100Hz。(使用2个按键控制,一个步进为加,另一个为步进减)
三、实验原理
1、DAC0832特点(1)、8位电流DAC转换,输出为电流信号,因此要转换为电压输出,必须外接集成运算放大器。(2)、转换时间约为50---500ns,转换速度比电压型DAC转换器快,电压型一般为1---10us(3)、20脚双列直插式封装的CMOS型器件。(4)、内部具有两极数据寄存器,可采用单或双缓冲方式。
2、D/A转换器外部引脚功能及内部结构图
3、工作方式
方式一:直通工作方式(本实验采用此种方式)
一般用于只有一路输出信号的情况。
接线情况:ILE=1,CS=WR1=WR2
=XFER=0 方式
二、双缓冲器工作方式
采用两步操作完成,可使DA转换输出前一数据的同时,将采集下一个数据送到8位输入寄存器,以提高转换速度。
一般用于多路DA输出。
4、DA转换器与控制器接口电路设计
5、实验仪实际接口电路图
6、DA转换器输出波形步进可调控制电路设计 设计思想:
设输入控制器的时钟频率为50MHz。
1、DA转换一次,需要一个时钟周期。若采用64点输出,则需要64个时钟周期。如果控制器时钟频率为64Hz,则输出的正弦波频率为1Hz。
2、因此,只需要控制DA转换控制器的时钟频率,则就可以控制正弦波频率,正弦波频率与时钟频率的 关系为1:64。
3、题目要求正弦波步进频率为100Hz,则时钟频率步进应为6400Hz。按“加”键,则时钟频率增加6400Hz,按“减”减,时钟频率减小6400Hz。
7、带按键控制DA转换器与控制器接口电路设计
四、实验程序 参考程序:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DAC0832 IS
PORT(CLK :IN STD_LOGIC;
DD : OUT INTEGER RANGE 255 DOWNTO 0);END DAC0832;ARCHITECTURE behav OF DAC0832 IS SIGNAL Q:INTEGER RANGE 63 DOWNTO 0;SIGNAL D : INTEGER RANGE 255 DOWNTO 0;BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN Q<=Q+1;
END IF;
END PROCESS;PROCESS(Q)
BEGIN
CASE Q
IS
WHEN 00=>D<=254;WHEN 01=>D<=252;WHEN 02=>D<=249;WHEN 03=> D<=245;
WHEN 04=>D<=239;WHEN 05=>D<=233;WHEN
06=> D<=225;WHEN
07=> D<=217;
WHEN 08=>D<=207;WHEN 09=>D<=197;WHEN
10=> D<=186;WHEN
11=> D<=174;
WHEN 12=>D<=162;WHEN 13=>D<=150;WHEN 14=> D<=137;WHEN
15=> D<=124;
WHEN 16=>D<=112;WHEN 17=>D<=99;WHEN 18=> D<=87;
WHEN
19=> D<=75;
WHEN 20=>D<=64;WHEN
21=>D<=53;WHEN 22=>D<=43;
WHEN 23=> D<=34;
WHEN 24=>D<=26;WHEN 25=>D<=19;WHEN
26=> D<=13;
WHEN
27=> D<=8;
WHEN 28=>D<=4;
WHEN
29=>D<=1;
WHEN 30=>D<=0;
WHEN
31=> D<=0;
WHEN 32=>D<=1;WHEN 33=>D<=4;
WHEN 34=> D<=8;
WHEN 35=> D<=13;WHEN 36=>D<=19;WHEN 37=>D<=26;
WHEN 38=> D<=34;
WHEN
39=> D<=43;
WHEN 40=>D<=53;WHEN
41=>D<=64;WHEN 42=> D<=75;
WHEN
43=> D<=87;
WHEN 44=>D<=99;WHEN 45=>D<=112;WHEN 46=>D<=124;WHEN
47=> D<=137;
WHEN 48=>D<=150;WHEN 49=>D<=162;WHEN 50=> D<=255;WHEN 51=> D<=174;
WHEN 52=>D<=186;WHEN 53=>D<=197;WHEN 54=>D<=207;WHEN 55=> D<=217;
WHEN 56=>D<=225;WHEN 57=>D<=233;WHEN 58=> D<=239;WHEN
59=> D<=245;
WHEN 60=>D<=249;WHEN 61=> D<=252;WHEN 62=> D<=254;WHEN 63=>D<=255;WHEN OTHERS=>NULL;END CASE;END PROCESS;
DD<=D;
END;
实验十
七段显示器动态扫描电路设计(提高型)
实验目的及要求:
1、掌握VHDL语言的基本结构及编程思想。
2、掌握七段显示器动态扫描电路设计方法。设计要求:
1、设计一个七段数码管动态扫描电路。
2、数码管个数为8个,共阴极接法。
3、设计BCD码--七段字符码的转换电路;
4、设计一电路,控制上述电路实现“12345678”八个数字的显示,要求显示方式为:
(1)自左至右逐个点亮数码管,最后全亮;再重复以上动作,每次变化时间间隔为1秒。
(2)自左至右点亮数码管,每次只点亮一个,最后全息灭,再重复以上动作,每次变化时间间隔为1秒。
(3)先中间两个点亮,再依次向外点亮;全亮后,再依次向中间熄灭;重复上述步骤,每次变化时间间隔为1秒。一、七段显示器动态扫描电路设计框图
二、存储器设计(8位8字节静态随机存储器SRAM)LIBRARY ieee;
USE ieee.std_logic_1164.all;ENTITY MEMO_RD_WR IS PORT(WR,RD: IN STD_LOGIC;
A : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END MEMO_RD_WR;ARCHITECTURE a OF MEMO_RD_WR IS
SIGNAL Q0,Q1,Q2,Q3: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL Q4,Q5,Q6,Q7: STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN PROCESS(WR,A)
BEGIN
IF WR='1' THEN
CASE
A
IS
WHEN “000”=>Q0<=D;
WHEN “001”=> Q1<=D;
WHEN “010”=>Q2<=D;
WHEN “011”=> Q3<=D;
WHEN “100”=>Q4<=D;
WHEN “101”=> Q5<=D;
WHEN “110”=>Q6<=D;
WHEN “111”=> Q7<=D;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS;PROCESS(RD,B)
BEGIN
IF RD='1' THEN
CASE
B
IS
WHEN “000”=>Q<=Q0;
WHEN “001”=> Q<=Q1;
WHEN “010”=>Q<=Q2;
WHEN “011”=> Q<=Q3;
WHEN “100”=>Q<=Q4;
WHEN “101”=> Q<=Q5;
WHEN “110”=>Q<=Q6;
WHEN “111”=> Q<=Q7;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS;END a;
四、循环取数电路设计 LIBRARY ieee;
USE ieee.std_logic_1164.all;ENTITY GET_CODE IS PORT(CLK1: IN STD_LOGIC;
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
RD:OUT STD_LOGIC;
A : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END GET_CODE;ARCHITECTURE a OF GET_CODE
IS
SIGNAL LOAD: STD_LOGIC;
SIGNAL QQ : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL NUM: INTEGER RANGE 7 DOWNTO 0;BEGIN
RD<=„1‟;
LOAD<=CLK1;PROCESS(CLK1)
BEGIN
IF CLK1'EVENT AND CLK1='1' THEN
IF NUM<=7
THEN
NUM<=NUM+1;
ELSE NUM<=0;
END IF;
END IF;END PROCESS;PROCESS(NUM)
BEGIN
CASE NUM IS
WHEN 0 =>A<=“000”;
WHEN 1 =>A<=“001”;
WHEN 2 =>A<=“010”;
WHEN 3 =>A<=“011”;
WHEN 4 =>A<=“100”;
WHEN 5 =>A<=“101”;
WHEN 6 =>A<=“110”;
WHEN 7 =>A<=“111”;
WHEN OTHERS =>NULL;
END CASE;
END PROCESS;PROCESS(LOAD)
BEGIN
IF LOAD„EVENT AND LOAD=„1‟
THEN-------上升沿锁存
QQ<=D;
END IF;END PROCESS;DOUT(7 DOWNTO 0)<=QQ(7 DOWNTO 0);END a;
五、扫描控制器设计 LIBRARY ieee;
USE ieee.std_logic_1164.all;ENTITY SCAN_8 IS PORT(CLK2: IN STD_LOGIC;
C : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END SCAN_8;ARCHITECTURE a OF SCAN_8
IS
SIGNAL NUM: INTEGER RANGE 7 DOWNTO 0;BEGIN PROCESS(CLK2)
BEGIN
IF CLK2'EVENT AND CLK2=‘1' THEN
IF NUM<=7
THEN
NUM<=NUM+1;
ELSE NUM<=0;
END IF;
END IF;END PROCESS;Process(num)
begin
CASE
NUM
IS
WHEN 1=>C<=“11111110”;WHEN 2=> C<=“11111101”;
WHEN 3=>C<=“11111011”;WHEN 4=> C<=“11110111”;
WHEN 5=>C<=“11101111”;WHEN 6=> C<=“11011111”;
WHEN 7=>C<=“10111111”;WHEN 0=> C<=“01111111”;
WHEN
OTHERS=>NULL;
END CASE;END PROCESS;END A;
应用实例一:显示“01234567”八个数字
LIBRARY ieee;
USE ieee.std_logic_1164.all;ENTITY disp_data IS PORT(CLK: IN STD_LOGIC;
WR:OUT STD_LOGIC;
A:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END disp_data;ARCHITECTURE a OF disp_data
IS
--SIGNAL QQ : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL NUM: INTEGER RANGE 7 DOWNTO 0;BEGIN
WR<=„1‟;PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF NUM<=7
THEN
NUM<=NUM+1;
ELSE NUM<=0;
END IF;
END IF;END PROCESS;PROCESS(NUM)
BEGIN
CASE NUM IS
WHEN 0 =>Q<=“00111111”;A<=“000”;
WHEN 1 =>Q<=“00000110”;A<=“001”;
WHEN 2 =>Q<=“01011011”;A<=“010”;
WHEN 3 =>Q<=“01001111”;A<=“011”;
WHEN 4 =>Q<=“01100110”;A<=“100”;
WHEN 5 =>Q<=“01101101”;A<=“101”;
WHEN 6 =>Q<=“01111101”;A<=“110”;
WHEN 7 =>Q<=“01111111”;A<=“111”;
WHEN OTHERS =>NULL;
END CASE;END PROCESS;END a;实验十一
彩灯控制器设计(提高型实验)
实验目的及要求:
1、掌握VHDL语言的基本结构及编程思想。
2、掌握VHDL语言的进行系统设计的方法和步骤。
3、培养学生综合应用能力。实验内容:
1、了解各类节日彩灯的显示方式(主要是动态方式)(上街观察);
2、将你所了解的情况,画出你的设计思想框图;
3、根据框图画出电路框图(用EDA技术);
4、用VHDL语言编程实现;
5、完成课程设计报告(约2000字)
实验
十二、红绿交通灯控制系统
实验目的及要求:
1、掌握VHDL语言的基本结构及编程思想。
2、掌握VHDL语言的进行系统设计的方法和步骤。
3、培养学生综合应用能力。实验内容:
设计一个简易十字路口交通灯控制器。要求:
1、每个路口有红、绿、黄三个指示灯指示交通运行情况。红灯亮,禁止车辆通行;绿灯亮,车辆正常通行。
2、利用两位数码管显示通行到计时时间。
3、用VHDL语言编程实现;
4、完成课程设计报告 实验步骤:
1、红绿黄灯秒计数选择控制电路(traffic_mux)SING_STATE:
00
绿灯20秒(横向路口);
01
黄灯5秒(横向路口)
绿灯20秒(直向路口)
黄灯5秒(直向路口)
RECOUNT:重新计数信号。=„1‟,发送倒计时时间数据; =„0‟,正常倒计时; LIBRARY IEEE;
USE IEEE.std_logic_1164.all;USE IEEE.std_logic_unsigned.all;
USE IEEE.std_logic_arith.all;entity traffic_mux is
port(reset,clk_1Hz,recount: in std_logic;
sign_state: in std_logic_vector(1 downto 0);
load: out integer range 255 downto 0);end;
begin
process(reset,clk_1s)
begin
if reset='1' then
load<=“00000000”;
elsif(clk_1Hz'event and clk_1Hz='1')
then
if
recount = '1‘
then
CASE sign_state IS
WHEN “00” => load <= 20;
WHEN “01” => load <= 5;
WHEN “10” => load <= 20;
WHEN “01” => load <= 5;
WHEN OTHERS =>null;
END CASE;
end if;
end if;end process;end BEHAVIOR;
2、倒计时控制电路(count_down)library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity count_down is port(reset,clk_1Hz: in std_logic;recount:in std_logic;load: in integer range 255 downto 0;seg7:out std_logic_vector(15 downto 0);next_state: out std_logic);end;architecture BEHAVIOR of count_down is signal cnt_ff: integer range 255 downto 0;begin process(clk_1Hz,reset)begin if(reset='1')then cnt_ff<=“00000000”;seg7<=“***0”;elsif(clk_1Hz'event and clk_1Hz='1')then if recount='1‘ then cnt_ff<=load-1;else cnt_ff<=cnt_ff-1;end if;end if;end process;process(cnt_ff)begin case cnt_ff is when 0=>seg7<=“***1”;when 1=>seg7<=“***0”;when 2=> seg7<=“***1”;when 3=> seg7<=“***1”;when 4=> seg7<=“***0”;when 5=> seg7<=“***1”;when 6=> seg7<=“***1”;when 7=> seg7<=“***1”;when 8=> seg7<=“***1”;when 9=> seg7<=“***1”;when 10=> seg7<=“***1”;when 11=> seg7<=“***0”;when 12=> seg7<=“***1”;when 13=> seg7<=“***1”;when 14=> seg7<=“***0”;when 15=> seg7<=“***1”;when 16=> seg7<=“***1”;when 17=> seg7<=“***1”;when 18=> seg7<=“***1”;when 19=> seg7<=“***1”;when 20=> seg7<=“***1”;when 21=> seg7<=“***0”;when 22=> seg7<=“***1”;when 23=> seg7<=“***1”;when 24=> seg7<=“***0”;when 25=> seg7<=“***1”;when 26=> seg7<=“***1”;when 27=> seg7<=“***1”;when 28=> seg7<=“***1”;when 29=> seg7<=“***1”;when others=> seg7<=“***1”;end case;end process;next_state <= '1' when cnt_ff=1 else '0';end BEHAVIOR;
3、红绿灯信号控制电路(traffic_fsm)LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_unsigned.all;entity traffic_FSM is port(reset,clk,clk_1Hz,flash_1Hz: in std_logic;a_m:in std_logic;next_state: in std_logic;recount: out std_logic;sign_state: out std_logic_vector(1 downto 0);red: out std_logic_vector(1 downto 0);green: out std_logic_vector(1 downto 0);yellow: out std_logic_vector(1 downto 0));end;architecture BEHAVIOR of traffic_FSM is type Sreg0_type is(r0g1, r0y1, g0r1, y0r1, y0y1, y0g1, g0y1, r0r1);signal state : Sreg0_type;signal light: std_logic_vector(5 downto 0);begin if(reset='1')then state<=r0g1;
----设定当前为横向红灯亮,竖向绿灯亮 sign_state<=“01”;------选择20秒倒计时
recount<=‘1’;------装入计数初值并启动倒计时 else if(clk'event and clk='1')then case STATE is when r0g1 => if(a_m='1' and clk_1Hz='1')then if(next_state = ‘1’)then--当前计数完毕,转入下一种计时
recount<='1';state<=r0y1;sign_state <= “01”;else recount<=‘0’;state<=r0g1;----否则,继续倒计时 end if;when r0y1 =>--now state: red0 on yellow1 flash if(a_m='1' and clk_1Hz='1')then if(next_state = '1')then recount<='1';state<=g0r1;sign_state <= “10”;else recount<='0';state<=r0y1;end if;when g0r1 =>--now state: green0 on red1 on if(a_m='1' and ena_1Hz='1')then if(next_state = '1')then recount<='1';state<=y0r1;sign_state <= “11”;else recount<='0';state<=g0r1;end if;when y0r1 =>--now state: green0 on red1 on if(a_m='1' and ena_1Hz='1')then if(next_state = '1')then recount<='1';state<=r0g1;sign_state <= “00”;else recount<='0';state<=y0r1;--red=2'b10;green=2'b00;yellow=2'b01;end if;when others => state<=r0g1;recount<='0';sign_state <= “00”;end case;end if;end if;end process;--light: r(10)y(10)g(10)light <= “010010” when(state=r0g1)else “011000” when(state=r0y1)else “100001” when(state=g0r1)else “100100” when(state=y0r1)else “110000”;red <= light(5 downto 4);yellow <= light(3 downto 2)and(flash_1Hz & flash_1Hz);green <= light(1 downto 0);end BEHAVIOR;
第三篇:EDA技术基础实验教案
实验一 2选1多路选择器VHDL设计
一、实验目的:
熟悉利用MAX+plusⅡ的VHDL文本设计流程全过程,学习简单组合逻辑电路的设计、多层次电路的设计、仿真和硬件测试。
二、实验内容:
按照MAX+plusⅡ的文本输入设计方法与流程完成2选1多路选择器的输入(mux21a.vhd)和仿真测试等步骤,给出仿真波形图。最后在实验系统上进行硬件测试,实际验证本项设计的功能。
三、实验步骤:
1、根据2选1多路选择器的工作原理,编写2选1的VHDL源程序,并输入计算机,mux21a.vhd文件名将源程序存盘。2选1多路选择器的参考程序如下:
【例1-1】
ENTITY mux21a IS PORT(a, b : IN BIT;s : IN BIT;y : OUT BIT);END ENTITY mux21a;ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT;BEGIN d <= a AND(NOT S);e <= b AND s;y <= d OR e;END ARCHITECTURE one;
【例1-2】
ENTITY mux21a IS PORT(a, b : IN BIT;s : IN BIT;y : OUT BIT);END ENTITY mux21a;ARCHITECTURE one OF mux21a IS BEGIN y <=(a AND(NOT s))OR(b AND s);END ARCHITECTURE one;
【例1-3】 ENTITY mux21a IS PORT(a, b, s: IN BIT;y : OUT BIT);END ENTITY mux21a;ARCHITECTURE one OF mux21a IS BEGIN PROCESS(a,b,s)BEGIN IF s = '0' THEN y <= a;ELSE y <= b;END IF;END PROCESS;END ARCHITECTURE one;
2、对mux21a.vhd文件编译后,再进行波形仿真,完成输入信号a、b、s 输入电平的设置,启动仿真器Simulator,观察输出波形的情况。
3、锁定引脚、编译并编程下载。参选实验电路模式5和附表一,键
1、键
2、键3为输入信号a、b、s分别锁定在EP1K30/50144-PIN TQFP 目标芯片的8、9、10引脚,输出信号y锁定在目标芯片的20引脚。
4、硬件实测2选1多路选择器的逻辑功能。按动GW48实验板上的高低电平输入键
1、键
2、键3,得到不同的s、b、a输入组合;观察输出发光二极管D1的亮灭,检查2选1多路选择器的设计结果是否正确。
思考题
用以上同样的方法设计4选1数据选择器mux41a.vhd,并仿真设计结果。
实验报告要求:
写出实验源程序,画出仿真波形。分析实验结果,以及它们的硬件测试实验结果写进实验报告。写出心得体会。
实验二 D触发器的VHDL设计
一、实验目的:
熟悉利用MAX+plusⅡ的VHDL文本设计流程全过程,学习简单时序电路的设计、仿真和硬件测试。
二、实验内容:
按MAX+plusⅡ的文本输入设计方法与流程完成D触发器的VHDL设计、软件编译、仿真分析、硬件测试及详细实验过程。
D触发器的VHDL设计的参考程序如下:
【例2-1】
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFF1 IS PORT(CLK : IN STD_LOGIC;D : IN STD_LOGIC;Q : OUT STD_LOGIC);END;ARCHITECTURE bhv OF DFF1 IS BEGIN SIGNAL Q1 : STD_LOGIC;--类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS(CLK)BEGIN IF CLK'EVENT AND CLK = '1' THEN Q1 <= D;END IF;Q <= Q1;--将内部的暂存数据向端口输出 END PROCESS;END bhv;
三、实验步骤:
1、打开文本编辑器,输入D触发器的VHDL源程序,并用D_ff.vhd文件名将源程序存盘。
2、选择目标器件EP1K30/50144-PIN TQFP。
3、对D_ff.vhd文件编译后,再进行波形仿真,完成输入信号d、clk输入电平的设置,启动仿真器Simulator,观察输出波形的情况。
4、锁定引脚、编译并编程下载。参选实验电路模式5和附表一,键1为输入信号d锁定在EP1K30/50144-PIN TQFP 目标芯片的8引脚,输出信号q和nq锁定在目标芯片的20和21引脚。
实验报告要求:
写出实验源程序,画出仿真波形。分析实验结果,以及它们的硬件测试实验结果写进实验报告。写出心得体会。
实验三 含异步清0同步时钟使能的4位加法计数器设计
一、实验目的:
学习时序电路的设计、仿真和硬件测试,进一步熟悉VHDL设计技术。
二、实验原理:
图4-1 含计数使能、异步复位和计数值并行预置功能4位加法计数器
图4-1是一含计数使能、异步复位和计数值并行预置功能4位加法计数器,例4-1是其VHDL描述。由图4-1所示,图中间是4位锁存器;rst是异步清信号,高电平有效;clk是锁存信号;D[3..0]是4位数据输入端。当ENA为'1'时,多路选择器将加1器的输出值加载于锁存器的数据端;当ENA为'0'时将“0000”加载于锁存器。
三、实验内容:
1、按照VHDL文本输入设计方法和步骤,在MAX+plusII上对例4-1 进行编辑、编译、综合、适配、仿真。说明例4-1中各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形。
[例4-1] LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4B IS PORT(CLK : IN STD_LOGIC;RST : IN STD_LOGIC;ENA : IN STD_LOGIC;OUTY : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT : OUT STD_LOGIC);END CNT4B;ARCHITECTURE behav OF CNT4B IS SIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN P_REG: PROCESS(CLK, RST, ENA)BEGIN IF RST = '1' THEN CQI <= “0000”;ELSIF CLK'EVENT AND CLK = '1' THEN IF ENA = '1' THEN CQI <= CQI + 1;END IF;END IF;
OUTY <= CQI;END PROCESS P_REG;--进位输出
COUT<=CQI(0)AND CQI(1)AND CQI(2)AND CQI(3);END behav;
2、引脚锁定以及硬件下载测试。
建议选实验电路模式5,用键8(PIO7)控制RST;用键7(PIO6)控制ENA;计数溢出COUT接发光管D8(PIO15);OUTY是计数输出,接数码1(PIO19-PIO16,低位靠右);时钟CLK接clock0(引脚号为54),通过短路帽选择4Hz信号。引脚锁定窗后进行编译、下载和硬件测试实验。将实验过程和实验结果写进实验报告。
结合第五章例题使学生能够提高对具有计数使能、异步复位和计数值并行预置功能功能的计数器中各功能的实现的认识、并能完成设计。
思考题1:
在例4-1 中是否可以不定义信号 CQI,而直接用输出端口信号完成加法运算,即 : OUTY <= OUTY + 1 ?
思考题2:
修改例4-1,用进程语句和IF语句实现进位信号的检出。
实验报告要求:
写出实验源程序,画出仿真波形。分析实验结果,以及它们的硬件测试实验结果和附加内容实验情况写进实验报告。写出心得体会。
实验四 7段数码显示译码器设计
一、实验目的:
学习7段数码显示译码器设计;学习多层次设计方法。
二、实验原理:
7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用VHDL译码程序在FPGA或CPLD中实现。本项实验很容易实现这一目的。例5-1作为7段BCD码译码器的设计,输出信号LED7S的7位分别接如图5-1数码管的7个段,高位在左,低位在右。例如当LED7S输出为 “1101101” 时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1,接有高电平的段发亮,于是数码管显示“5”。
三、实验内容:
1、说明例5-1中各语句的含义,以及该例的整体功能。在MAX+plusII上对以下该例进行编辑、编译、综合、适配、仿真,给出其所有信号的时序仿真波形(提示:用输入总线的方式给出输入信号仿真数据)。
[例5-1] 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;
2、引脚锁定以及硬件下载测试。建议选实验电路模式6,用数码8显示译码输出(PIO46--PIO40),键
8、键
7、键
6、键5四位控制输入,硬件验证译码器的工作性能。
3、用VHDL例化语句(参考实验1中的1位全加VHDL文本输入设计)按图5-2 的方式,以例4-1和例5-1为底层元件,完成顶层文件设计,并重复以上实验过程。注意图5-2中的tmp是4位总线,led是7位总线。对于引脚锁定和实验,建议仍选实验电路模式6,用数码8显示译码输出,用键3作为时钟输入(每按2次键为1个时钟脉冲),或直接时钟信号clock0。
实验报告要求:
写出实验源程序,画出仿真波形。分析实验结果,以及它们的硬件测试实验结果写进实验报告。写出心得体会。
实验五 2位数的十进制计数器的设计
一、实验目的:
通过实验让读者掌握复杂时序逻辑电路的EDA原理图输入设计法和文本输入设计法,通过电路仿真,进一步了解有时钟使能的2位十进制计数器的功能和特性。
二、实验原理:
有时钟使能的2位十进制计数器是频率计的核心元件之一,这里用2个74162来设计完成。
三、实验内容:
1.用文本输入设计方法编写2位十进制计数器的VHDL源程序,并用twin10_g.vhd文件名存盘,参考程序如下: LIBRARY ieee;
USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY twin10_v IS PORT(Clrn,Ent1,Enp,Clk : IN STD_LOGIC;
Qa,Qb
: OUT STD_LOGIC_VECTOR(3 downto 0);
Co
: OUT STD_LOGIC);END twin10_v;ARCHITECTURE a OF twin10_v IS SIGNAL Ent2 : STD_LOGIC;BEGIN
PROCESS(Clk)
VARIABLE tmpa,tmpb :STD_LOGIC_VECTOR(3 downto 0);
BEGIN IF(Clk'event AND Clk='1')THEN
IF Clrn='0' THEN tmpa := “0000”;tmpb := “0000”;
ELSIF(Ent1 AND Enp)='1' THEN
IF tmpa=“1001” THEN
tmpa:=“0000”;
IF tmpb=“1001” THEN tmpb:=“0000”;
ELSE tmpb:= tmpb+1;
END IF;
ELSE tmpa := tmpa+1;
END IF;
END IF;
END IF;
Qa <= tmpa;Ent2<=tmpa(0)AND tmpa(3)AND Ent1;
Qb <= tmpb;Co<= tmpb(0)AND tmpb(3)AND Ent2;END PROCESS;END a;2.同样编译后再进行波形仿真
按照波形仿真的操作步骤,对2位十进制计数器进行波形仿真。
3.锁定引脚、编译并编程下载。参选实验电路模式5和附表一,引脚锁定目标芯片为EP1K30/50144-PIN TQFP 实验报告要求:
写出实验源程序,画出仿真波形。对设计的2位十进制计数器进行实验结果的分析,以及硬件测试实验结果写进实验报告。写出心得体会。
第四篇: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,此处因仍存在竞争冒险。
五、实验总结
乘法器的设计的问题可以分为乘数和被乘数控制模块,寄存模块,乘法模块和扫描显示模块几个部分。
两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将被乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零。