《VHDL数字系统设计与应用》在校课程记录——实验六:七段数码显示设计实验

一、模块准备:

创建工程时将老师给的显示模块和分频模块的 .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 的数字显示与之对应内容




四、实验板验证:

1、连接实验板

2、将电路图置顶,编译,并配置好引脚,点击运行

3、点击 Programmer,选择相应选项,点击 start 开始验证

在这里插入图片描述

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~莘莘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值