可编程实验报告1
实验一 组合逻辑电路的设计
1. 实验目的
1、 学习简单组合电路的设计;
2、 熟悉Quartus II 的文本设计和波形仿真的全流程; 3、 熟悉VHDL 语言的书写规则和Quartus II软件的使用。
2. 实验内容
利用Quartus II完成下列组合逻辑电路的文本编辑输入并进行仿真测试
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_2 IS
PORT(a,b,c,d: IN STD_LOGIC;
f: OUT STD_LOGIC_VECTOR(3 downto 0));
END example3_2;
ARCHITECTURE Behavioral OF example3_2 IS END Behavioral;
BEGIN
f(0)
f(1)
f(2)
f(3)
((a AND b AND d)XOR(b AND AND d));
4. 仿真结果
5. 实验总结
由此设计可以看出组合逻辑电路在任意时刻的输出状态只取决于该时刻的输入状与该时刻前的电路状态无关;在代码中的括号是用来控制逻辑运算的优先级的, 由仿真波形可以看出,各信号按照逻辑公式输出。
1. 实验目的
进一步熟悉Quartus II 的文本设计和波形仿真的全流程、VHDL 语言的设计规则和Quartus II软件的使用;学习8线-3线优先编码器的设计方法,从而掌握各种编码器的设计。
2. 实验内容
用VHDL 设计一个8线-3线优先编码器,编码器输出编码为反码输出,并仿真验证。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_4 is port(sin:in std_logic;
i:in std_logic_vector(7 downto 0); a:out std_logic_vector(2 downto 0); e,s:out std_logic); end example3_4 ;
architecture Behavioral of example3_4 is begin
process(sin,i) begin
if sin='1' then
a
if i(7)='0' then a
elsif i(6)='0' then elsif i(5)='0' then
elsif i(4)='0' then elsif i(3)='0' then elsif i(2)='0' then elsif i(1)='0' then elsif i(0)='0' then else
a
`
a
end if;
end process; end Behavioral;
4. 仿真结果
5. 实验总结
从仿真波形图可以看出,当输入信号i 输入不同八位二进制编码时,输出信号输出相应不同的三位二进制码,转换为十进制分别为0—7。而sin 为使能控制信号,低电平有效,若为‘1’,则输出全‘1’信号。从而实现了8—3编码器的功能。
1. 实验目的
学习7段数码显示译码器的设计方法以及工作原理; 学习VHDL 语言的WITH …SELECT 语句的功能,从而进一步熟悉VHDL 语言的程序设计方法。
2. 实验内容
设计一个输出高有效的3线-8线二进制译码器,并完成仿真过程。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY exzmple3_5 is
port(a:in std_logic_vector(2 downto 0);
en:in std_logic;
y:out std_logic_vector(7 downto 0));
end exzmple3_5 ;
architecture Behavioral of exzmple3_5 is begin
process(en,a) begin
if (en='1') then
y
when"000"=>yyyyyyyyy
end process; end Behavioral;
4. 仿真结果
5. 实验总结
译码器是编码器的逆过程,从这次实验的仿真波形看出:输入信号三位二进制码a ,当他取“000”—“111”时,输出端输出不同数值的八位二进制码。当使能控制信号en 为‘1’时,译码无效,输出全‘0’。为‘0’时,译码正常,从而实现了3—8译码器的功能。
实验四 七段数码显示设计
1. 实验目的
学习7段数码显示译码器设计;学习VHDL 的CASE 语句应用及多层次设计方法。
2. 实验内容
设计一个半导体数码管的七段显示译码器
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_6 is
port(hex:in std_logic_vector(3 downto 0);
segment:out std_logic_vector(6 downto 0)); end example3_6 ;
architecture Behavioral of example3_6 is begin
with hex select
segment
"0011001" when "0100", "0010010" when "0101", "0000010" when "0110", "1111000" when "0111", "0000000" when "1000", "0010000" when "1001", "1000000" when others;
end Behavioral;
4. 仿真结果
5. 实验总结:
此程序是由hex 四位二进制输入信号,控制segment 七位的二进制输出信号,输出信号的高低电平控制数码管的亮暗情况,使数码管显示出0—9的数字。从波形图可以看出,输出信号segment 的7位分别接数码管的7个段g 、f 、e 、d 、c 、b 、a ,高位在左,低位在右。例如segment 输出为“1111001”时,数码管的7个段分别接1、1、1、1、0、0、1,接有低电平的段发亮,数码管显示“1”。
1. 实验目的
学习设计数据分配器的设计,熟悉数据分配器的工作原理;掌握IF 语句和CASE 语句的用法,掌握数据分配器的设计思想。熟悉数据选择器的设计方法;学习VHDL 语言的CASE 语句的功能,从而进一步熟悉VHDL 语言的程序设计方法。
2. 实验内容
设计一个四路数据分配器,并进行仿真验证。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_7 is
port(d:in std_logic_vector(3 downto 0); a:in std_logic_vector(1 downto 0); e:in std_logic; f:out std_logic); end example3_7 ;
architecture Behavioral of example3_7 is begin
process(e,a,d) begin if e='0'then case a is
when"00"=>fffff
4仿真结果
5. 实验总结
输入信号a 选择控制输出信号d 的输出位,f 信号显示d 的位输出情况,en 为使能信号,低电平有效。无效时输出低电平。从波形图看出,当d=”1001”时, ,en 有效,此时a=”00”,输出d(0),即f=d(0)=’1’。
1. 实验目的
学习设计数据分配器的设计,熟悉数据分配器的工作原理;掌握IF 语句和CASE 语句的用法,掌握数据分配器的设计思想。
2. 实验内容
设计一个两总线数据分配器,并进行仿真验证。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_10 is port(sel:in std_logic;
a,b:in std_logic_vector(7 downto 0);
mux_out:out std_logic_vector(7 downto 0));
end example3_10 ;
architecture Behavioral of example3_10
is begin
process(sel,a,b) begin
if sel='1'then mux_out
4. 仿真结果
5. 实验总结
从波形图可知:a,b 为输入八位二进制码,此设计实现并行输入且并行输出。sel 是选择控制信号,当sel=’0’时,输出信号mux_out输出b 的值,当sel=’1’时,则mux_out输出a 的值。
实验七 带符号位数字比较器的设计
1. 实验目的
学习数值比较器的设计,进一步熟悉CASE 语句的用法,掌握怎样比较有符号数的比较。
2. 实验内容
设计一个带符号位数字比较器,并进行仿真。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_12 is port(
a,b:in std_logic_vector(7 downto 0);
gt,eq,lt:out std_logic); end example3_12 ;
architecture Behavioral of example3_12 is signal sab:std_logic_vector(1 downto 0); begin
sab
if a(6 downto 0)> b(6 downto 0) then gt
elsif a(6 downto 0)= b(6 downto 0) then gt
gt
gt
if a(6 downto 0)>b(6 downto 0) then gt
elsif a(6 downto 0)=b(6 downto 0) then gt
gt
4. 仿真结果
5. 实验总结
此程序实现的是比较8位带符号位的二进制码的大小。从波形图可看出,a,b 为输入2二进制比较数信号,输出信号gt,eq,lt 分别代表“大于”,“等于”,“小于”。若a>b,则
gt 输出高电平,其余为低电平,例如如图所示a=“10001010”,b=”10100101”因为a,b 都是负数,所以若|a|b.输出gt=‘1’,其余为‘0’。
实验八 带进位的八位二进制数加法器设计
1. 实验目的
学习加法器电路的设计、仿真和测试。
2. 实验内容
设计一个八位二进制数的加法器,并进行仿真验证。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_13_2 is
port(a,b:in std_logic_vector(7 downto 0);
s:out std_logic_vector(7 downto 0); co:out std_logic); end example3_13_2 ;
architecture Behavioral of example3_13_2
is
signal ta,tb:std_logic_vector(8 downto 0);
signal ts:std_logic_vector(8 downto 0); begin ta
s
4. 仿真结果
5. 实验总结
此程序实现的是带进位的八位二进制加法器,ta,tb 为八位二进制数,s 为和数输出,co 为进位输出,若有进位,则co=’1’。从波形图看出:ta+tb256时有溢出,此时co 输出高电平,而s 输出ta+tb-256。
实验九 具有同步置位和异步清零D 触发器的设计
1. 实验目的
学会时序电路的设计,理解时钟信号在电路中的作用,并且与组合电路相区别,同时学会使用时钟边沿检测语句和IF 语句。
2. 实验内容
设计一个具有异步复位和同步置位的D 触发器,并进行仿真验证。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY example3_15 is
port(d,clk,clr,set:in std_logic;
q:out std_logic); end example3_15 ;
architecture Behavioral of example3_15 is begin
process(clk,clr,set)
begin
if clr='1' then q
q
end if;
end process; end Behavioral;
4. 仿真结果
5. 实验总结
此程序实现的是一个同步置位和异步清零的D 触发器。由仿真波形看出,输出信号q, 根据时钟信号clk 的上升沿控制输出。若clk=’0’,无论clk 为何,q 都被清零;当上升沿来临,若置位信号set=’1’, 则q 被置位,否则输出q 。
实验十 计数器的设计
1. 实验目的
学习使用IF 语句和PROCESS 语句来设计计数器,并进行仿真,从而熟悉计数器的工作原理;进一步熟悉VHDL 语言设计技术。
2. 实验内容
设计一个带异步复位和同步时钟使能的十进制加法计数器,并进行仿真验证。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_logic_1164.ALL; USE IEEE.STD_logic_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity example3_21 is port (en,clk:in std_logic;
q:out std_logic_vector(3 downto 0); qcc:out std_logic); end example3_21; ARCHITECTURE behavioral OF example3_21 is
signal qtemp:std_logic_vector(3 downto 0); begin
process(clk,en)
begin
if clk'event and clk='1' then if en='1' then
if qtemp= 9 then qtemp
else qtemp
qcc
4. 仿真结果
5. 实验总结
此程序实现的是十进制的计数器,变量qtemp 对时钟脉冲clk 进行计数,当记到9时,信号溢出,输出给进位信号qcc 。
实验十一 锁存器的设计
1. 实验目的
熟悉锁存器的设计方法,掌握其工作原理。学会使用多进程来设计电路。
2. 实验内容
设计一个8位锁存器,并进行仿真。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_logic_1164.ALL; USE IEEE.STD_logic_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity example3_17 is
port(d:in std_logic_vector(7 downto 0); le:in std_logic;
q: out std_logic_vector(7 downto 0)); end example3_17;
ARCHITECTURE behavioral of example3_17 is
signal qin: std_logic_vector(7 downto 0); begin
p1: process(d)
begin
if le='1' then qin
begin
if falling_edge(le) then q
4. 仿真结果
5. 实验总结
从波形图可知:在LE 为‘1’,将输入端数据D 锁存起来进来,在LE 的下降沿,将锁存的数据送出来。输出端的数据变化依赖于LE 的变化,即在LE 的下降沿才会有数据的更新。通过本实验,了解了锁存器和D 触发器的区别:触发器是边沿触发的,而锁存器是电平触发的。锁存器的输出对输入透明的,输入是什么,输出就是什么,锁存器对时钟脉冲电平(持续时间)敏感,在一持续电平期间都运作;而触发器对时钟脉冲边沿(上升或下降)敏感,在边沿来临时变化状态。
实验十二 Mealy 型的状态机的设计
1. 实验目的
熟悉Mealy 型的状态机的逻辑结构,并会设计简单的Mealy 型的状态机;进一步学会使用多进程来设计电路,学习状态机的设计方法和设计结构。
2. 实验内容
设计一个Mealy 型的状态机状态如下并进行仿真。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_logic_1164.ALL; USE IEEE.STD_logic_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity example3_23 is port(reset,clk:in std_logic; t1,t2,t3:in std_logic; r,g,y: out std_logic); end example3_23;
architecture behavioral of example3_23 is type state_type is(red,green,yellow); signal state,next_state:state_type; begin
sync_proc:process(clk)
begin
if(clk'event and clk='1') then if (reset='1') then state
output_decode:process(state,t1,t2,t3) begin
if(state=red and t1='0') then r
next_state_decode:process(state,t1,t2,t3) begin
next_state
when red=>if t1='1'then
next_state
when green=> if t2='1' then
next_state
when yellow=>if t3='1' then next_state
when others=> next_state
4. 仿真结果
5. 实验结论
此程序实现的是交通灯的设计,当ET 有效时,交通灯回到红灯状态使得输出r=’1’,g=’0’,y=’0’; 当RESET=‘0’时,定时器T1,T2,T3都没有溢出信号时,交通灯输出状态为红灯;T1,T2,T3分别代表红,绿,黄灯转换信号,当他们分别单独为高电平时,则状态转换。并输出相应颜色灯的响应信号,使灯亮。通过实验可知,ealy 型的状态机的输出信号与当前信号和所输入的信号都有关系,在其输入变化后,其输出立即变化。
实验十三 Moore 型的状态机的设计
1. 实验目的
熟悉Moore 型的状态机的逻辑结构,并会设计简单的Moore 型的状态机;进一步学会使用多进程来设计电路,学习状态机的设计方法和设计结构。
2.实验内容
用VHDL 设计实现空调系统的控制器的Moore 型的状态机状态如下,并进行仿真验证。
3. 实验程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ex3_24 IS
PORT(reset ,clk:IN STD_LOGIC;
High,Low:in STD_LOGIC; Cold,Heat:OUT STD_LOGIC); END ex3_24;
ARCHITECTURE Behav OF ex3_24 IS type state_type
is(too_high,too_low,well_situated);
signal state,next_state:state_type; begin
sync_proc:process(clk) BEGIN
if (clk'event and clk='1')then if (reset='1') then state
----moore state machine
output_decode:process(state)
begin
if state= too_high then old
next_state_decode:process(state,high,low) begin
next_state
when well_situated=> if high='1'
then next_state
when too_high=> if high='1'then
next_state
else next_state if low='1'then
next_state
else next_state next_state
4. 仿真结果
5. 实验结论
此程序实现的是一个温度控制系统,当复位信号RESET=‘1’时,输出Cold=’0’,Heat=’0’;RESET=‘0’,若温度过低,则输出Cold=’0’,Heat=’1’,从而进行制热操作;当温度过高时,输出Cold=’1’,Heat=’0’,从而进行制冷操作;当温度适中时,输出Cold=’0’,Heat=’0’,不制热也不制冷保持温度适中。当温度由过高转向温度适中的条件是:High=’0’或者High=’1’且RESET=‘1’;当一直是温度过低时,保持Low=’1’且RESET=‘0’的状态不变;当温度由过低转向温度适中的条件是:Low=’0’或者Low=’1’且RESET=‘1’;当温度由适中转向温度过高的条件是:High=’1’且RESET=‘0’且Low=’0’; 当温度由适中转向温度过低的条件是:Low=’1’且RESET=‘0’。