8位数码扫描显示电路设计
一、实验目的
学习硬件扫描显示电路的设计;
二、实验原理
动态数码扫描显示方式是利用了人眼的视觉暂留效应,把八个数码管按一定顺序进行点亮,当点亮的频率不大时,我们看到的是数码管一个个的点亮,然而,当点亮频率足够大时,我们看到的不再是一个一个的点亮,而是全部同时显示,与传统方式得到的视觉效果完全一样。因此我们只要给数码管这样一个扫描频率,那么就可以实现两个以上的数码管同时点亮。而这个频率我们可以通过一个计数器来产生,只要计数频率足够大,就可以实现我们的要求。事实上,因为数码管点亮不是瞬间就可以的,它也需要一定的时间,该时间与数码管的选择有关系。为了折中这一对矛盾,实验中一般可将计数频率选择在100Hz左右。
图示8位数码扫描显示电路,其中每个数码管的8 个段:h、g、f、e、d、c、b、a(h 是小数点)都分别连在一起,8 个数码管分别由8 个选通信号k1、k2、… k8 来选择。被选通的数码管显示数据,其余关闭。如在某一时刻,k3 为高电平,其余选通信号为低电平,这时仅k3 对应的数码管显示来自段信号端的数据,而其它7 个数码管呈现关闭状态。根据这种电路状况,如果希望在8 个数码管显示希望的数据,就必须使得8 个选通信号k1、k2、… k8 分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。
实验参考扫描显示程序中clk 是扫描时钟;SG 为7 段控制信号,由高位至低位分别接g、f、e、d、c、b、a 7个段;BT 是位选控制信号,接图5-2 中的8 个选通信号:k1、k2、… k8 。程序中CNT8 是一个3 位计数器,作扫描计数信号,由进程P2 生成;进程P3 是7 段译码查表输出程序,进程P1 是对8 个数码管选通的扫描程序,例如当CNT8 等于
"001" 时,K2 对应的数码管被选通,同时,A 被赋值3,再由进程P3 译码输出"1001111",显示在数码管上即为“3”;当CNT8 扫变时,将能在8 个数码管上显示数据:13579BDF 。原理图如图1所示。
图1 八位数码管显示电路
三、实验步骤
1、建立一个工程项目,设置路径,项目名和顶层实体名一致;
2、、设计一个动态扫描显示电路,在8 个数码管上显示数据:13579BDF;并进行编译仿真与下载测试;
四、8位数码扫描显示电路的VHDL描述:
LIBRARY IEEE;
USE SCAN_LED IS
PORT ( CLK : IN STD_LOGIC;
SG : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
BT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );
END;
ARCHITECTURE one OF SCAN_LED IS
SIGNAL CNT8 : STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL A : INTEGER RANGE 0 TO 15;
BEGIN
P1:PROCESS( CNT8 )
BEGIN
CASE CNT8 IS
WHEN "000" => BT <= "00000001" ; A <= 1 ;
WHEN "001" => BT <= "00000010" ; A <= 2 ;
WHEN "010" => BT <= "00000100" ; A <= 3 ;
WHEN "011" => BT <= "00001000" ; A <= 4 ;
WHEN "100" => BT <= "00010000" ; A <= 5 ;
WHEN "101" => BT <= "00100000" ; A <= 6 ;
WHEN "110" => BT <= "01000000" ; A <= 7 ;
WHEN "111" => BT <= "" ; A <= 8 ;
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS P1;
P2:PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN CNT8 <= CNT8 + 1;
END IF;
END PROCESS P2 ;
P3:PROCESS( A )
BEGIN
CASE A IS
WHEN 0 => SG <= "0111111"; WHEN 1 => SG <= "0000110";
WHEN 2 => SG <= "1011011"; WHEN 3 => SG <= "1001111";
WHEN 4 => SG <= "1100110"; WHEN 5 => SG <= "1101101";
WHEN 6 => SG <= "1111101"; WHEN 7 => SG <= "0000111";
WHEN 8 => SG <= "1111111"; WHEN 9 => SG <= "1101111";
WHEN 10 => SG <= "1110111"; WHEN 11 => SG <= "1111100";
WHEN 12 => SG <= "0111001"; WHEN 13 => SG <= "1011110";
WHEN 14 => SG <= "1111001"; WHEN 15 => SG <= "1110001";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS P3;
END;
五、仿真波形
功能仿真波形
时序仿真波形
32位并进/并出移位寄存器设计
一、实验原理
用一个8位移位寄存器,再增加一些电路,如4个8位锁存器等,设计成为一个能为32位二进制数进行不同方式移位的移位寄存器。
二、实验步骤
1、建立一个工程项目,设置路径,项目名和顶层实体名一致;
2、设计一个8位移位寄存器电路;
3、设计一个8位锁存器电路;
4、运用元件调用声明语句和元件例化语句完成顶层设计。
三、实验程序
1、八位移位寄存器程序
LIBRARY IEEE;
USE jicun IS
PORT ( CLK,CO: IN STD_LOGIC;
MD : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
QB : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
CN : OUT STD_LOGIC);
END jicun;
ARCHITECTURE behav OF jicun IS
SIGNAL REG : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL CY : STD_LOGIC;
BEGIN
PROCESS(CLK,CO,MD)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
CASE MD IS
WHEN "001"=> REG(0)<=CO;
REG(7 DOWNTO 1)<= REG(6 DOWNTO 0);CY<=REG(7); WHEN "010" => REG(0)<=REG(7); ---自循环左移
REG(7 DOWNTO 1)<= REG(6 DOWNTO 0);
WHEN "011"=>REG(7)<=REG(0); ---自循环右移
REG(6 DOWNTO 0)<=REG(7 DOWNTO 1);
WHEN "100" =>REG(7)<=CO; ---带进位循环右移
REG(6 DOWNTO 0)<=REG(7 DOWNTO 1);CY<=REG(0);
WHEN "101" =>REG(7 DOWNTO 0)<=D(7 DOWNTO 0); --加载待移数 WHEN OTHERS=>REG<=REG;CY<=CY;--保持
END CASE;
END IF;
END PROCESS;
QB(7 DOWNTO 0)<=REG(7 DOWNTO 0);CN<=CY;
END behav;
2、锁存器程序
library ieee ;
use ;
entity suocun is
port(d : in std_logic_vector(7 downto 0) ;
q: out std_logic_vector(7 downto 0);
clk : in std_logic );
end suocun ;
architecture one of suocun is
signal q1: std_logic_vector(7 downto 0);
begin
process(clk,q1)
begin
if clk'event and clk='1'
then
q1<=d;
end if;
end process;
q<=q1;
end one;
3、顶层设计程序
LIBRARY IEEE;
USE jicun32 IS
PORT ( clk0,co: IN STD_LOGIC;
md : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
db : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
qb : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
cn : OUT STD_LOGIC);
END jicun32;
ARCHITECTURE one OF jicun32 IS
COMPONENT jicun
PORT ( CLK,CO: IN STD_LOGIC;
MD : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
QB : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
CN : OUT STD_LOGIC);
END COMPONENT;
COMPONENT suocun
port(d : in std_logic_vector(7 downto 0) ;
q: out std_logic_vector(7 downto 0);
clk : in std_logic );
END COMPONENT;
SIGNAL e,f,g,h : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL l,m,n : STD_LOGIC;
BEGIN
u1: suocun PORT MAP(d=>db(7 DOWNTO 0),q=>e,clk=>clk0);
u2: jicun PORT MAP (D=>e,QB=>qb(7 DOWNTO 0),
CLK=>clk0,CO=>co,CN=>l,MD=>md);
u3: suocun PORT MAP(d=>db(15 DOWNTO 8),q=>f,clk=>clk0); u4: jicun PORT MAP(D=>f,QB=>qb(15 DOWNTO 8),
CLK=>clk0,CO=>l,CN=>m,MD=>md);
u5: suocun PORT MAP(d=>db(23 DOWNTO 16),q=>g,clk=>clk0); u6: jicun PORT MAP(D=>g,QB=>qb(23 DOWNTO 16),
CLK=>clk0,CO=>m,CN=>n,MD=>md);
u7: suocun PORT MAP(d=>db(31 DOWNTO 24),q=>h,clk=>clk0); u8: jicun PORT MAP(D=>h,QB=>qb(31 DOWNTO 24),
CLK=>clk0,CO=>n,CN=>cn,MD=>md);
END ARCHITECTURE one;
四、仿真结果
1、锁存器仿真
2、八位寄存器仿真
3、顶层设计仿真