一、模块准备:
创建工程时将老师给的显示模块和分频模块的 .vhd 文件加入到工程中:
1、显示模块的 VHDL 模型:
--//**-----------------文件信息-----------------------------------
--//**文 件 名: decl7s.vhd
--//**创 建 人:
--//**最后修改日期:
--//**描 述: 显示模块
--//**
--//*------------------当前版本修订--------------------------------
--//** 修改人:
--//** 日 期:
--//** 描 述:
--//**
--//**------------------------------------------------------------
--//*************************************************************/
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_Arith.ALL;
USE IEEE.STD_LOGIC_Unsigned.ALL;
ENTITY decl7s IS
PORT(
clk_1k: IN STD_LOGIC;
d1: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入要显示的数据
d2: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
d3: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
d4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
d5: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
d6: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
d7: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
d8: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
dig: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --数码管选择输出引脚
seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --数码管段输出引脚
);
END ENTITY;
ARCHITECTURE one OF decl7s IS
SIGNAL seg_r: STD_LOGIC_VECTOR(7 DOWNTO 0); --定义数码管输出寄存器
SIGNAL dig_r: STD_LOGIC_VECTOR(7 DOWNTO 0); --定义数码管选择输出寄存器
SIGNAL disp_dat: STD_LOGIC_VECTOR(3 DOWNTO 0); --定义显示数据寄存器
SIGNAL count: STD_LOGIC_VECTOR(2 DOWNTO 0); --定义计数寄存器
BEGIN
dig<=dig_r;
seg<=seg_r;
PROCESS(clk_1k)
BEGIN
IF RISING_EDGE(clk_1k) THEN
count<=count+1;
END IF;
END PROCESS;
PROCESS(clk_1k)
BEGIN
IF RISING_EDGE(clk_1k) THEN
CASE count IS
WHEN "000"=> disp_dat<=d1(3 DOWNTO 0); --第一个数码管
WHEN "001"=> disp_dat<=d2(3 DOWNTO 0); --第二个数码管
WHEN "010"=> disp_dat<=d3(3 DOWNTO 0); --第三个数码管
WHEN "011"=> disp_dat<=d4(3 DOWNTO 0); --第四个数码管
WHEN "100"=> disp_dat<=d5(3 DOWNTO 0); --第五个数码管
WHEN "101"=> disp_dat<=d6(3 DOWNTO 0); --第六个数码管
WHEN "110"=> disp_dat<=d7(3 DOWNTO 0); --第七个数码管
WHEN "111"=> disp_dat<=d8(3 DOWNTO 0); --第八个数码管
END CASE;
CASE count IS --选择数码管显示位
WHEN "000"=> dig_r<="01111111"; --选择第一个数码管显示
WHEN "001"=> dig_r<="10111111"; --选择第二个数码管显示
WHEN "010"=> dig_r<="11011111"; --选择第三个数码管显示
WHEN "011"=> dig_r<="11101111"; --选择第四个数码管显示
WHEN "100"=> dig_r<="11110111"; --选择第五个数码管显示
WHEN "101"=> dig_r<="11111011"; --选择第六个数码管显示
WHEN "110"=> dig_r<="11111101"; --选择第七个数码管显示
WHEN "111"=> dig_r<="11111110"; --选择第八个数码管显示
END CASE;
END IF;
END PROCESS;
PROCESS(disp_dat)
BEGIN
CASE disp_dat IS
WHEN X"0"=> seg_r<=X"c0";--显示0
WHEN X"1"=> seg_r<=X"f9";--显示1
WHEN X"2"=> seg_r<=X"a4";--显示2
WHEN X"3"=> seg_r<=X"b0";--显示3
WHEN X"4"=> seg_r<=X"99";--显示4
WHEN X"5"=> seg_r<=X"92";--显示5
WHEN X"6"=> seg_r<=X"82";--显示6
WHEN X"7"=> seg_r<=X"f8";--显示7
WHEN X"8"=> seg_r<=X"80";--显示8
WHEN X"9"=> seg_r<=X"90";--显示9
WHEN X"a"=> seg_r<=X"88";--显示a
WHEN X"b"=> seg_r<=X"83";--显示b
WHEN X"c"=> seg_r<=X"c6";--显示c
WHEN X"d"=> seg_r<=X"a1";--显示d
WHEN X"e"=> seg_r<=X"86";--显示e
WHEN X"f"=> seg_r<=X"8e";--显示f
END CASE;
END PROCESS;
END;
2、分频模块的 VHDL 模型:
--//**-----------------文件信息---------------------------------
--//**文 件 名: int_div.vhd
--//**创 建 人:
--//**最后修改日期:
--//**描 述: 分频电路
--//**
--//*------------------当前版本修订------------------------------
--//** 修改人:
--//** 日 期:
--//** 描 述:此为任意分频模块
--//** 当为奇数倍分频时,输出的波形为对称方波,
--//** 奇数倍分频要比偶数倍分频复杂,实现奇数倍分频的方法不是惟一的,但最简单的是错位"异或"法(即相同时取"0",相反时取"1")
--//**-----------------------------------------------------------
--//**************************************************************-/
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; --这3个程序包足发应付大部分的VHDL程序设计
USE IEEE.STD_LOGIC_Arith.ALL;
USE IEEE.STD_LOGIC_Unsigned.ALL;
ENTITY int_div IS
GENERIC(N:Integer:=3);--此处定义了一个默认值N=3,即电路为3分频电路;
Port
(Clockin:IN STD_LOGIC;
ClockOut:OUT STD_LOGIC
);
END;
ARCHITECTURE Devider OF int_div IS
SIGNAL Counter:Integer RANGE 0 TO N-1;
SIGNAL Temp1,Temp2:STD_LOGIC; --信号的声明在结构体内,进程外部
BEGIN
PROCESS(Clockin)
BEGIN
IF RISING_EDGE(Clockin) THEN
IF Counter=N-1 THEN
counter<=0;
Temp1<=Not Temp1;
ELSE
Counter<=Counter+1;
END IF;
END IF;
IF falling_edge(clockin) THEN
IF Counter=N/2 THEN
Temp2<=NOT Temp2;
END IF;
END IF;
END PROCESS;
ClockOut<=Temp1 XOR Temp2;
END;
二、自建模块准备:
建立好满足自己显示需要的功能模块,如:8 个输出端口分别输出 1~8 的四位二进制数的模块,可以使 8 个数码管显示 “12345678” 这八个数
VHDL 模型:
library ieee;
use ieee.std_logic_1164.all;
entity clk_8out is
port
(
clk : in std_logic;
a1 : out std_logic_vector(3 downto 0);
a2 : out std_logic_vector(3 downto 0);
a3 : out std_logic_vector(3 downto 0);
a4 : out std_logic_vector(3 downto 0);
a5 : out std_logic_vector(3 downto 0);
a6 : out std_logic_vector(3 downto 0);
a7 : out std_logic_vector(3 downto 0);
a8 : out std_logic_vector(3 downto 0)
);
end entity;
architecture rtl of clk_8out is
begin
process (clk)
begin
if (clk'event AND clk='1') then
a1 <= "0001";
a2 <= "0010";
a3 <= "0011";
a4 <= "0100";
a5 <= "0101";
a6 <= "0110";
a7 <= "0111";
a8 <= "1000";
end if;
end process;
end rtl;
注意先仿真后使用,避免不可预期错误
三、连接电路:
将上述三个模块分别置顶、编译、生成模块后,创建 .bdf 文件,根据电路图连接电路:
注意 ①:
分频器的输入为实验板的晶振引脚
注意 ②:
由于人的视觉暂留效应,数码管闪烁频率达到一定值后,就看不见闪烁,所以显示模块的 clk 输入频率应为合理值,此处为 48000 分频(分频模块的 Value)
注意 ③:
注意到显示模块的输出端口 dig 和 seg,它们都是 8 位二进制格式,连接 output 时也应当把 output 设置为 8 位二进制格式,所以,可以分别把 output 命名为dig[7..0]
和seg[7..0]
注意 ④:
向显示模块的 d1~d8 输入相应 4 位二进制数值,数码管 1 到 8 的数字显示与之对应内容