实验4 扫描显示驱动电路
- 格式:doc
- 大小:85.50 KB
- 文档页数:5
内蒙古工业大学信息工程学院实验报告课程名称: CPLD/FPGA应用开发技术实验名称:扫描驱动显示电路设计实验类型:验证性□ 综合性□设计性■实验室名称:班级:学号:姓名:组别:同组人:成绩:实验日期: 2012-5-9月日预习报告一、实验目的:1.了解实验箱中8位七段数码管显示模块的工作原理。
2.熟悉VHDL 硬件描述语言及设计专用数字集成电路的自顶向下的设计思想。
3.掌握利用CPLD/FPGA设计8位七段数码管扫描显示驱动电路的方法。
二、实验设备:1.计算机(配置为:P4 CPU 128M内存);2. MAX+plusⅡ开发工具软件;3. EL教学实验箱;4.万用表;5. DS 5022M型双踪数字示波器;三、实验内容:本实验要求在给定子模块程序的基础上,画出设计原理图。
自行编写顶层模块程序,完成扫描显示驱动电路的设计,实现在8个数码管上轮流显示字符0-F的功能。
四、设计要求1.要求在Max+plusⅡ平台上用VHDL语言编写顶层模块程序,调试、仿真成功后,下载至ALTER EPM7128SLC84-15 芯片,再利用外接电路实现以上设计功能。
2.扫描驱动显示电路有 2 个输入端(clk,reset),14 个输出端(a,b,c,d,e,f,g)和(y0,y1,y2,y3,y4,y5,y6,y7),全部为TTL 电平,管脚分配任意,如下图所示。
3.根据芯片特点,管脚分配时将时钟信号分配给83 脚,复位信号分配给1 脚,使能信号分配给84 脚。
月日实验报告一、实验内容:本实验要求在给定子模块程序的基础上,画出设计原理图。
自行编写顶层模块程序,完成扫描显示驱动电路的设计,实现在8 个数码管上轮流显示字符0-F 的功能。
二、实验程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY XS ISPORT(CLK,RESET: IN STD_LOGIC;A,B,C,D,E,F,G: OUT STD_LOGIC;Y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END XS;ARCHITECTURE BEHA OF XS ISCOMPONENT COUNTER16PORT(CLK,CLR: IN STD_LOGIC;COUNT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT DECDISPPORT(DATAIN: IN STD_LOGIC_VECTOR(3 DOWNTO 0);A,B,C,D,E,F,G: OUT STD_LOGIC);END COMPONENT;COMPONENT YIMA3PORT(X: IN STD_LOGIC_VECTOR(2 DOWNTO 0);Y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END COMPONENT;SIGNAL CONT: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SEL3: STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIND1:COUNTER16 PORT MAP(CLK=>CLK,CLR=>RESET,COUNT=>CONT);D2:DECDISP PORT MAP(DATAIN=>CONT,A=>A,B=>B,C=>C,D=>D,E=>E,F=>F,G=>G);D3:YIMA3 PORT MAP(X=>CONT(2 DOWNTO 0),Y=>Y);END BEHA;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY YIMA3 ISPORT( X: IN STD_LOGIC_VECTOR(2 DOWNTO 0);Y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END YIMA3 ;ARCHITECTURE BEHA OF YIMA3 ISBEGINY<=X;END BEHA;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECDISP ISPORT(DATAIN: IN STD_LOGIC_VECTOR(3 DOWNTO 0);A,B,C,D,E,F,G: OUT STD_LOGIC);END DECDISP;ARCHITECTURE BEHA OF DECDISP ISSIGNAL DATAOUT: STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINA<=DATAOUT(6);B<=DATAOUT(5);C<=DATAOUT(4);D<=DATAOUT(3);E<=DATAOUT(2);F<=DATAOUT(1);G<=DATAOUT(0);PROCESS(DATAIN)BEGINCASE DATAIN ISWHEN "0000"=> DATAOUT<="1111110"; WHEN "0001"=> DATAOUT<="0110000"; WHEN "0010"=> DATAOUT<="1101101"; WHEN "0011"=> DATAOUT<="1111001"; WHEN "0100"=> DATAOUT<="0110011"; WHEN "0101"=> DATAOUT<="1011011"; WHEN "0110"=> DATAOUT<="1011111"; WHEN "0111"=> DATAOUT<="1110000"; WHEN "1000"=> DATAOUT<="1111111"; WHEN "1001"=> DATAOUT<="1111011"; WHEN "1010"=> DATAOUT<="1110111"; WHEN "1011"=> DATAOUT<="0011111"; WHEN "1100"=> DATAOUT<="1001110"; WHEN "1101"=> DATAOUT<="0111101"; WHEN "1110"=> DATAOUT<="1001111"; WHEN "1111"=> DATAOUT<="1000111"; WHEN OTHERS=> DATAOUT<="XXXXXXX"; END CASE;END PROCESS;END BEHA;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER16 ISPORT(CLK,CLR: IN STD_LOGIC;COUNT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); SEL: OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END COUNTER16;ARCHITECTURE BEHA OF COUNTER16 ISSIGNAL CNT: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(CLK,CLR)BEGINIF CLR='0'THENCNT<="0000";ELSIF CLK='1' AND CLK'EVENT THENCNT<=CNT+'1';END IF;COUNT<=CNT;SEL<=CNT(2 DOWNTO 0);END PROCESS;三、仿真结果:四、管脚分配:。
实验一 maxplusII 软件的初步使用(图形的设计)一、实验目的:1、初步掌握Max+PlusII 软件的基本操作与应用。
2、初步了解可编程器件的设计全过程。
二、实验仪器: 1. 电脑一台 2. 实验箱一个三、实验内容:(一)设计输入:1、软件的启动:单击“开始”进入“程序”选中“Max+PlusII 10.1 BASELINE ”,打开“”MaxplusII 软件,如图1.1-1所示。
2、启动File\New 菜单,弹出设计输入选择窗口,如图1.1-2所示:3、选择Graphic Editor File ,单击OK ,打开原理图编辑器,进入原理图设计输入电路编辑状态。
如图1.1-3所示。
4、设计输入1)放置一个器件在原理图上 01.1-4图1.1-1图1.1-2图1.1-3 图1.1-4b 、在光标处输入元件名称(如:input ,output ,and2,and3,nand2,or2,not ,xor ,dff 等)或用鼠标点击库元件,按下OK 即可。
c 、如果安放相同的元件,只要按住Ctrl 键,同时用鼠标按左键拖动该元件复制即可。
d 、一个完整的电路包括:输入端口input 、电路元件集合、输出端口output 。
e 、图1.1-5为3-8译码器元件安放结果。
2)添加连线到器件的引脚上:把鼠标移到元件引脚附近,则鼠标自动由箭头变为十字,按住鼠标左键拖动,即可画出连线。
3-8译码器原理图连线后如图1.1-6所示。
3)标记输入/输出端口属性分别双击输入端口的“PINNAME ”,当变成黑色时,即可输入标记符并回车确认;输出端口标记方法类似。
本译码器的三输入端分别标记为:A 、B 、C ;其八输出端分别为:D0、D1、D2、D3、D4、D5、D6、D7。
如图1.1-7所示。
4)保存原理图单击保存按钮图表,对于新建文件,出现类似文件管理器图框,请选择保存路径/文件名称保存原理图,原理图的扩展名为.gdf ,本实验中取名为test1.gdf 。
实验二:计数器动态扫描实验一实验目的熟悉译码扫描动态显示的工作原理、设计过程和实现方法。
二实验内容与要求学习用VHDL设计译码扫描动态显示电路,完成编译、综合、适配、仿真和实验箱上的硬件测试。
三实验平台(1)硬件:计算机、GX-SOC/SOPC-DEVLABCycloneII EP2C35F672C8核心扳(2)软件:Quartus II四实验原理通过动态扫描一组4BIT 的输入,有控制开关控制数据的流向,即在哪个数码管上显示,在允许的条件产生后,扫描记录响应位置上的输入数据(开关选择),将结果动态地显示在共阴数码管上。
在能满足人眼要求的一定的扫描频率下,对数据进行动态显示。
五程序--显示电路--显示电路整合--ledscan.vhd 4 digit bcd-to-7 segment scan displaylibrary ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ledscan isport(clk : in std_logic; --synchronousenable : in std_logic; --scan clockdata_bcd :in std_logic_vector(3 downto 0);--input bcdctrl : in std_logic_vector(2 downto 0);---ctrl the order of inputi.e. bcd_dataledseg : out std_logic_vector(6 downto 0);--output to 7 segmentledcom : out std_logic_vector(5 downto 0));--7 segment enableend ledscan;architecture behavior of ledscan issignal com_clk : std_logic_vector(2 downto 0);signal bcd_led : std_logic_vector(3 downto 0);signal data2show : std_logic_vector(23 downto 0);component comcounport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output count end component;component com_encodeport(com_clk : in std_logic_vector(2 downto 0);--input countledcom : out std_logic_vector(5 downto 0));--output encodeend component;component bcd_muxport(com_clk : in std_logic_vector(2 downto 0);--input countbcd_data : in std_logic_vector(23 downto 0);--input display databcd_led : out std_logic_vector(3 downto 0));--output to 7 segment end component;component bcd_7segport(bcd_led : in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segment end component;begininput_control:process(clk)beginif (clk'event and clk='1') thenif ctrl="000" thendata2show(3 downto 0)<=data_bcd;-- first value to showelsif ctrl="001" thendata2show(7 downto 4)<=data_bcd;-- 2nd value to showelsif ctrl="010" thendata2show(11 downto 8)<=data_bcd;-- 3rd value to showelsif ctrl="011" thendata2show(15 downto 12)<=data_bcd;-- 4th value to showelsif ctrl="100" thendata2show(19 downto 16)<=data_bcd;-- 5th value to showelsif ctrl="101" thendata2show(23 downto 20)<=data_bcd;-- 6th value to showelsedata2show<="000000000000000000000000";end if;end if;end process ;u0: comcoun port map (clk=>clk,enable=>enable,comclk=>com_clk);-- 7 segment com scan counteru1: com_encode port map(com_clk=>com_clk,ledcom=>ledcom);-- 7 segment com scan counter--u1: com_encode port map (com_clk,ledcom); --7 segment com encode u2: bcd_mux port map (com_clk=>com_clk,bcd_data=>data2show,bcd_led=>bcd_led);--multiplexeru3: bcd_7seg port map (bcd_led=>bcd_led,ledseg=>ledseg); --bcd to7 segment encoderend behavior;--七段显示扫描电路--comcoun.vhd 7 segment com scan counterlibrary ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity comcoun isport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output countend comcoun;architecture behavior of comcoun issignal q : std_logic_vector(2 downto 0);--internal counted signal beginfscan:process(clk)beginif (clk'event and clk='1') thenif (enable='1') thenif q>=6 thenq<="000";--initial counterelseq<=q+1;--countingend if;end if;end if;end process fscan;comclk<=q; --output internal countend behavior;--计数译码电路 -- 6 共阴--com_encode.vhd 7 segment com encoderlibrary ieee ;use ieee.std_logic_1164.all;entity com_encode isport(com_clk :in std_logic_vector(2 downto 0);--input countledcom :out std_logic_vector(5 downto 0));--output encodeend com_encode;architecture behavior of com_encode isbeginledcom<="000001" when com_clk="001" else"000010" when com_clk="010" else"000100" when com_clk="011" else"001000"when com_clk="100" else"010000"when com_clk="101" else"100000";end behavior;--bcd_mux.vhd multiplexer of bcd-selectionlibrary ieee ;use ieee.std_logic_1164.all;entity bcd_mux isport(com_clk : in std_logic_vector(2 downto 0);--input countbcd_data :in std_logic_vector(23 downto 0);--input display data bcd_led : out std_logic_vector(3 downto 0));--output to 7 segment end bcd_mux;architecture behavior of bcd_mux isbeginbcd_led<=bcd_data(3 downto 0) when com_clk="001" elsebcd_data(7 downto 4) when com_clk="010" elsebcd_data(11 downto 8) when com_clk="011" elsebcd_data(15 downto 12)when com_clk="100" elsebcd_data(19 downto 16)when com_clk="101" elsebcd_data(23 downto 20)when com_clk="110" else"----";end behavior;--bcd对应七段显示器编码电路--bcd_7seg.vhd bcd to 7 segment encoderlibrary ieee ;use ieee.std_logic_1164.all;entity bcd_7seg isport(bcd_led :in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segment end bcd_7seg;architecture behavior of bcd_7seg isbeginwith bcd_led selectledseg<="0111111" when "0000",--0"0000110" when "0001",--1"1011011" when "0010",--2"1001111" when "0011",--3"1100110" when "0100",--4"1101101" when "0101",--5"1111101" when "0110",--6"0100111" when "0111",--7"1111111" when "1000",--8"1101111" when "1001",--9"1110111" when "1010",--A"1111100"when "1011",--b"0111001"when "1100",--c"1011110" when "1101",--d"1111001"when "1110",--E"1110001" when "1111",--F"0000000" when others;end behavior;六引脚定义及代码图2-1引脚定义代码:# Copyright (C) 1991-2008 Altera Corporation# Your use of Altera Corporation's design tools, logic functions # and other software and tools, and its AMPP partner logic# functions, and any output files from any of the foregoing# (including device programming or simulation files), and any# associated documentation or information are expressly subject # to the terms and conditions of the Altera Program License# Subscription Agreement, Altera MegaCore Function License# Agreement, or other applicable license agreement, including,# without limitation, that your use is for the sole purpose of# programming logic devices manufactured by Altera and sold by# Altera or its authorized distributors. Please refer to the# applicable agreement for further details.# Quartus II: Generate Tcl File for Project# File: ACOUNT10.tcl# Generated on: Tue Nov 03 11:40:42 2009# Load Quartus II Tcl Project packagepackage require ::quartus::projectset need_to_close_project 0set make_assignments 1# Check that the right project is openif {[is_project_open]} {if {[string compare $quartus(project) "ACOUNT10"]} {puts "Project ACOUNT10 is not open"set make_assignments 0}} else {# Only open if not already openif {[project_exists ACOUNT10]} {project_open -revision ACOUNT10 ACOUNT10} else {project_new -revision ACOUNT10 ACOUNT10}set need_to_close_project 1}# Make assignmentsif {$make_assignments} {set_global_assignment -name FAMILY "Cyclone II"set_global_assignment -name DEVICE EP2C35F672C8set_global_assignment -name ORIGINAL_QUARTUS_VERSION 8.0set_global_assignment -name PROJECT_CREATION_TIME_DATE "11:03:58 NOVEMBER 03, 2009"set_global_assignment -name LAST_QUARTUS_VERSION 8.0set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_palaceset_global_assignment -name DEVICE_FILTER_PACKAGE FBGAset_global_assignment -name DEVICE_FILTER_PIN_COUNT 672set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85set_global_assignment -name VHDL_FILE com_encode.vhdset_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Topset_global_assignment -name PARTITION_COLOR 14622752 -section_id Top set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region"set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region"set_global_assignment -name VHDL_FILE comcoun.vhdset_global_assignment -name VHDL_FILE COUNT10a.vhdset_global_assignment -name VHDL_FILE bcd_7seg.vhdset_global_assignment -name VHDL_FILE clkgen.vhdset_global_assignment -name VHDL_FILE ACOUNT10.vhdset_global_assignment -name VECTOR_WAVEFORM_FILE warefare.vwfset_global_assignment -name INCREMENTAL_VECTOR_INPUT_SOURCE warefare.vwfset_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Topset_location_assignment PIN_P25 -to clkset_location_assignment PIN_F6 -to Clrset_location_assignment PIN_B22 -to enset_location_assignment PIN_H23 -to LEDCOM[5]set_location_assignment PIN_G26 -to LEDCOM[4]set_location_assignment PIN_G25 -to LEDCOM[3]set_location_assignment PIN_G24 -to LEDCOM[2]set_location_assignment PIN_G23 -to LEDCOM[1]set_location_assignment PIN_P18 -to LEDCOM[0]set_location_assignment PIN_F26 -to LEDSEG[6]set_location_assignment PIN_F25 -to LEDSEG[5]set_location_assignment PIN_J20 -to LEDSEG[4]set_location_assignment PIN_J21 -to LEDSEG[3]set_location_assignment PIN_F23 -to LEDSEG[2]set_location_assignment PIN_F24 -to LEDSEG[1]set_location_assignment PIN_E25 -to LEDSEG[0]set_location_assignment PIN_B21 -to EN6# Commit assignmentsexport_assignments# Close projectif {$need_to_close_project} {project_close}}七仿真图2-2 创建VHDL文件图2-3 PIN口设置图2-4 创建VERILOG文件图2-5 运行八导入程序图2-7 下载图2-8 实验结果。
4led 动态扫描显示及按键实验感想
在完成4LED动态扫描显示及按键实验后,我深深感受到了科技的实际应用与电路设计的美妙结合。
这不仅是一次对于理论知识的学习和巩固,更是一次将知识转化为实践的宝贵体验。
实验中,我们通过编程控制4个LED灯的亮灭,使其按照特定的模式进行动态扫描。
这其中涉及到了数字信号处理、逻辑门电路、微控制器等多个知识点。
每一个LED灯的亮与灭,都代表着一串代码的执行,每一次的动态扫描,都是程序在控制板上跑动的轨迹。
在实验过程中,我深刻体会到了编程的魅力。
通过编写程序,我可以精确地控制每一个LED灯的亮灭时间,甚至可以创造出复杂的扫描效果。
而按键的部分更是增添了实验的趣味性。
通过按键,我可以随时改变LED的扫描模式,每一次按键,都像是给程序注入了一个新的灵魂,使其焕发出不同的光彩。
当然,实验过程中也遇到了不少困难。
例如,如何确保4个LED 灯能够均匀地亮起与熄灭,如何处理按键抖动问题等。
但正是这些问题的存在,使得整个实验更加具有挑战性。
通过不断地尝试、调试,我最终克服了这些困难,也更加深入地理解了相关知识。
这次实验让我认识到,理论知识的学习固然重要,但只有将其应用于实践中,才能真正体会到知识的价值。
同时,实验中的每一个细节、每一个问题,都是对自身能力的锻炼与提升。
通过不断地实践与
尝试,我相信自己能够更好地掌握知识,更好地将理论知识与实践相结合。
未来,我计划进一步深入学习微控制器编程、电路设计等相关知识,希望能够为未来的科技应用做出更大的贡献。
同时,我也希望能够将这次实验的经验分享给更多的同学,共同探索科技的奥秘。
实验四数码管扫描显示控制器设计与实现2011211208班2011211055 4 于圣泽一、实验目的1.掌握VHDL语言的语法规范, 掌握时序电路描述方法;2.掌握多个数码管动态扫描显示的原理及设计方法。
二、实验原理三、多个数码管动态扫描显示, 是将所有数码管的相同段并联在一起, 通过选通信号分时控制各个数码管的公共端, 循环依次点亮多个数码管, 利用人眼的视觉暂留现象, 只要扫描的频率大于50Hz, 将看不到闪烁现象。
一个数码管要稳定显示要求显示频率大于50Hz, 那么6个数码管则需要50×6=300Hz以上才能看到持续稳定点亮的现象。
四、cat1~cat6是数码管选通控制信号, 分别对应于6个共阴极数码管的公共端, 当catn=‘0’时, 其对应的数码管被点亮。
因此, 通过控制cat1~cat6, 就可以控制6个数码管循环依次点亮。
五、实验内容1.用VHDL语言设计并实现六个数码管串行扫描电路, 要求同时显示0、1.2.3.4.5这6个不同的数字图形到6个数码管上, 仿真验证其功能, 并下载到实验板测试。
2.用VHDL语言设计并实现六个数码管滚动显示电路六、循环左滚动, 始终点亮6个数码管, 左出右进。
状态为: 012345→123450→234501→3450123→450123→501234→012345七、向左滚动, 用全灭的数码管填充右边, 直至全部变灭, 然后再依次从右边一个一个地点亮。
状态为:012345→12345X→2345XX→345XXX→45XXXX→5XXXXX→XXXXXX→XXXXX0→XXXX01→XXX012→XX0123→X01234→012345,其中‘X’表示数码管不显示。
八、设计思路和过程对50MHz时钟进行5000分频, 得到10kHZ时钟scanclk。
把scanclk作为6进制计数器的时钟, 对计数器的状态进行译码, 得到cat(5 downto 0)的选通脉冲。
4.2 扫描数码显示器实验4.2.1 实验目的1. 学习状态机的原理及使用VHDL语言设计的方法;2.学习复杂数学系统的设计方法;3.掌握动态扫描数码显示器的设计方法。
4.2.2 实验设备PC微机一台,TD-EDA试验箱一台,SOPC开发板一块。
4.2.3 实验内容状态机是一类很重要的时序电路,是许多数字电路的核心部件。
根据状态机的输出方式可以分为Mealy型和Moore型两种状态机。
输出与状态有关而与输入无关的状态机类型称为Moore型状态机。
输出与状态及输入皆有关系的状态机称为Mealy型状态机。
状态机通常包含:说明部分、主控时序进程、主控组合进程、辅助进程几个部分。
利用状态机进行设计的步骤如下:1.分析设计要求,列出状态机所有可能的状态,并对每一个状态进行状态编码;2.根据状态转移关系和输出函数画出状态转移图;3.由状态转移图,用状态机语句描述状态机。
是数码管动态扫描显示的方式主要是为了节省I/O管脚和内部逻辑资源,它利用人的视觉暂留现象,将6位数数码管分别循环选通,配合传送相应的要显示的数据,只要扫描的速度足够快,就可以使人的视觉感到好像是6位数码管的同时显示。
一般扫描频率使用1KHz 就可以了。
本实验设计一个可以使6位数码管动态刷新显示的扫描电路。
分析系统的要求可知此设计需要包括6进制计数器、BCD译码器、数据选择多路开关等多个小单元模块。
实验需要设计一个模块来为6个数码块提供要显示的数据,设计一个六位数123456从左向右移动的方式,直到最高一位移出最右边数码块后,最低位6再从最左面数码块移进,从而实现循环移动。
4.2.4 实验步骤1.运行QuartusⅡ软件,建立新工程,工程名称及顶层文件名称为SCANLED。
2.选择File→New菜单,创建图形设计文件,在图形编辑器界面中选择Block Tool工具按钮,分别新建DAT、MULX、BCD_LED子模块,完成模块的定义及模块之间的连接,完成如图4-2-1所示的数码扫描显示器顶层设计电路图。
多位L E D-显示器动态扫描驱动电路设计完整版《多位LED 显示器动态扫描驱动电路》报告(一)目的:1、了解多位LED 显示器动态扫描驱动电路的基本工作原理;2、完成多位LED 显示器动态扫描驱动电路设计并分析计算单元电路;3、绘制多位LED 显示器动态扫描驱动电路图,针对工作原理进行参数估算;4、电路功能的检测和调试;5、设计答辩,完成设计报告。
(二)结构图(三)电路总体功能概述该电路的功能是通过控制数据选择器输入端的高低电平来使四个LED显示器可以显示0-9任意一个数字,实现动态扫描功能。
由振荡电路,控制电路,四位四选一数据选择器,一位LED译码驱动电路和四位LED显示电路组成。
首先用555定时器构成频率为1000赫兹多谐振荡器产生脉冲信号,再将信号传输到74构成的二位二进制触发器,使该触发器输出00,01,10,11。
将触发器的两输出端分别接到数据选择器153的S1,S0,将四个输入D0或D1D2D3信号传输到LED显示电路,使LED显示不同数字,将触发器的两输出端接到138的A1,A0(A2接0),再将138的输出Y0,Y1,Y2,Y3接到四个LED的共阴极,控制LED的显示状态,把74ls153的输出端与cc4511的四个输入端相连,把LED显示器的a,b,c,d,e,f,g与cc4511的输出端相连,这样便可以通过555定时器产生的脉冲控制四个LED的显示顺序,同时调整153的输入端的高低电位,这样便实现了对四个LED的显示控制,可随意现实0至9的数字。
振荡电路由555定时器构成的多谐振荡电路组成,有振荡电路提供脉冲,振荡周期T=Tpl+Tph=R1*C*ln2+(R1+R2)*C*ln2=0.001s,则其振荡频率为1000Hz,多谐振荡器在接通电源后无需外接触发信号就可以产生矩形脉冲或方波。
控制电路是一片74LS74构成的两位二进制触发器,它接收到控制电路的振荡脉冲,产生00,01,10,11的输出信号。
实验-扫描显示驱动电路————————————————————————————————作者:————————————————————————————————日期:2实验4 扫描显示驱动电路一、实验目的了解教学系统中8位八段数码管显示模块的工作原理,设计标准扫描驱动电路模块,以备后面实验用。
二、硬件要求主芯片Altera EPM7128SLC84-15,时钟,8位八段数码管显示器,四位拨码开关。
三、实验内容用四位拨码开关产生8421BCD码,用CPLD分别产生字形编码电路和扫描驱动电路,然后进行仿真,观察波形,正确后编程下载实验测试。
1、编一个简单的从0~F轮换显示十六进制数的电路。
2、用计数器产生数码管扫描驱动信号,调节时钟频率,感受扫描的过程,并观察字符的亮度和显示刷新的效果。
7段数码管显示字符0~F,显示字符与7段数码管驱动线的对应关系如下:二进制数字符7段数码管(gfedcba)0000 0 0111111(3F)0001 1 0000110(06)0010 2 1011011(5B)0011 3 1001111(4F)0100 4 1100110(66)0101 5 1101101(6D)0110 6 1111101(7D)0111 7 0000111(07)1000 8 1111111(7F)1001 9 1101111(6F)1010 A 1110111(77)1011 B 1111100(7C)1100 C 0111001(39)1101 D 1011110(5E)1110 E 1111001(79)34 1111F 1110001(71)四、实验原理四位拨码开关提供8421BCD 码,经译码电路DECL7S 后连接8段数码管的字形显示驱动信号a,b,c,d,e,f,g 。
数码管扫描电路可通过片选地址SEL[2..0]控制。
由SEL[2..0]和a,b,c,d,e,f,g 决定了8位数码管中的那一位显示和显示什么字形。
电子设计自动化实验报告实验四译码扫描显示电路设计一、实验目的1.熟悉QuartusⅡ软件应用环境,了解实验流程。
2.编写简单的Verilog代码,并在QuartusⅡ中进行调试和验证,并在EDA6000中下载代码和验证。
3.用扫描方式驱动8x8显示点阵,显示预定的字符”A”。
二、实验原理本实验要实现8x8显示点阵的控制电路,采用扫描方式驱动,分为8条行线,和八条列线,其中列线经反向驱动后接显示点阵。
用一个三位2进制数进行计数,控制扫描的过程,时钟信号有效,计数加一,用case语句实现扫描行列的变换。
当某一列为高电平,此列选通,当相应行为高电平时,相交点的led灯点亮,动态扫描,由于视觉延迟最终显示设定的字符”A”。
三、实验内容1、实现8x8点阵扫描驱动的“ Verilog ”语言设计。
2、编程下载并在实验箱上进行验证四、实验步骤与结果1、新建Verilog工程项目,编写代码并保存至与模块名对应的项目文件夹。
2、编译程序,编译无误后,在【tools】里面选择RTL视图,观察电路结构。
3、将实验箱和PC合理连接起来。
打开EDA6000软件,设置好芯片类型为ACEX1K (EP1K30TC144-3),载入模式11。
4、根据EDA6000界面内管脚对应芯片的实际管脚在QUARTUSⅡ里面设定管脚号并检查无误。
5、将程序下载至FPGA试验箱内,并在EDA6000软件界面内进行验证测试。
程序源代码:module ymsm(CLK,row,col);input CLK; output [7:0]row,col;reg [7:0]row,col;reg [2:0]a;always @(posedge CLK) beginif(a<7) a=a+1;else a=0;case(a)3'b000:begin row=10000000;col=00100000;end3'b001:begin row=01000000;col=01010000;end3'b010:begin row=00100000;col=10001000;end3'b011:begin row=00010000;col=10001000;end3'b100:begin row=00001000;col=11111000;end3'b101:begin row=00000100;col=10001000;end3'b110:begin row=00000010;col=10001000;end3'b111:begin row=00000001;col=10001000;endendcaseendendmodule编译:选择processing---start compilation命令,开始编译。
实验7 4*4 键盘扫描控制器1.实验任务说明:设计并实现4*4 键盘扫描控制电路,判断哪个按键被按下,在数码管上显示键值,并通过蜂鸣器发出按键音。
要求:●键值采用16 进制编码,即16 个按键分别对应显示16 进制数0~F,按键对应关系如下:最上面一行从左至右依次为0~3,第二行从左至右依次为4~7,第三行从左至右依次为8~B,最下面一行从左至右依次为C~F,其中b、d 显示为小写,其他字母大写;●按键按下时显示当前键值并保持,直到下一按键被按下时更新显示;●只有按键被按下时蜂鸣器发出按键音,放开后蜂鸣器不发声。
●选做:每个按键对应不同的按键音。
●2.实验设计思路将本实验分为4个部分,分别是顶层,分频器(扫描时钟的分频器和为蜂鸣器提供频率的分频器),数码管译码电路,扫描信号发生电路。
顶层利用状态机实现,状态转移为s0->s1->s2->s3->s0,分别对应扫描到col[0->3->0]。
同时把row 信号转化为一个“时钟信号”clock_change,当有按键按下就输出1,没有则输出0。
并以这个时钟设计一个时序逻辑,当clock_change的上升沿到来才更新tempSegin(传递给数码管的输入信号)和choose(传递给蜂鸣器分频器的输入信号),输出sound信号时,将蜂鸣器输出的信号与clock_change信号相与,以达到按下一次键盘蜂鸣器发声,数码管显示的目的。
3.源程序:1)分频器扫描时钟的分频器:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;entity divide is--divide the frequency to 1/ngeneric( n:natural:=200);port( clk: in std_logic;clk_out: out std_logic);end divide;architecture div_arch of divide is--temporary signalsignal temp: std_logic;beginprocess( clk )--count variable count from 0 to n/2-1--means every n/2 period reverse the clk variable count: integer range 0 to n/2-1;beginif (clk'event and clk='1') thenif( count = n/2-1) thentemp <= not temp;count := 0;elsecount := count + 1;end if;end if;end process;clk_out <= temp;end div_arch;为蜂鸣器提供频率的分频器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;entity divide_sound is--the origin clk is 50MHz--divide the frequency to 1/ngeneric( n0:natural:=4;n1:natural:=8;n2:natural:=12;n3:natural:=16;n4:natural:=20;n5:natural:=24;n6:natural:=28;n7:natural:=42;n8:natural:=46;n9:natural:=50;n10:natural:=54;n11:natural:=58;n12:natural:=62;n13:natural:=66;n14:natural:=70;n15:natural:=74);port( clk: in std_logic;choose: in integer range 0 to 15;sound_out: out std_logic);end divide_sound;architecture div_arch of divide_sound is --temporary signalsignal temp: std_logic;beginprocess( clk )--count variable count from 0 to n/2-1--means every n/2 period reverse the clk variable count: integer range 0 to 100;variable n:integer range 0 to 200;--count'max is over the n(max)/2 - 1begincase choose iswhen 0 =>n := n0;when 1 =>n := n1;when 2 =>n := n2;when 3 =>n := n3;when 4 =>n := n4;when 5 =>n := n5;when 6 =>n := n6;when 7 =>n := n7;when 8 =>n := n8;when 9 =>n := n9;when 10 =>n := n10;when 11 =>n := n11;when 12 =>n := n12;when 13 =>n := n13;when 14 =>n := n14;when 15 =>n := n15;when others => n:= n0;end case;if(clk'event and clk='1') thenif( count = n/2 - 1) thentemp <= not temp;count := 0;elsecount := count + 1;end if;end if;end process;sound_out <= temp;end div_arch;2)扫描信号发生电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity scan_seq is--produce the column scan signalport( clk,reset: in std_logic;col: out std_logic_vector(3 downto 0));end scan_seq;architecture arch of scan_seq isbeginprocess(clk)variable count: integer range 0 to 3;--M=4 counter,every count output the porper impulse beginif( reset ='1')thencount := 0;elsif( clk'event and clk='1' )thenif( count = 3)thencount := 0;elsecount := count +1;end if;end if;case count iswhen 0 => col<="1110";when 1 => col<="1101";when 2 => col<="1011";when 3 => col<="0111";end case;end process;end arch;3)数码管译码电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY seg7_1H IS --seg7 decoding PORT(a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --inputb: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --outputcat: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --selcect);END seg7_1H;ARCHITECTURE aa OF seg7_1H ISsignal temp: std_logic_vector(3 downto 0);BEGINprocess(a)beginCASE a IS --b6-0 -> abcdefg WHEN "0000" => b <= "1111110"; --0WHEN "0001" => b <= "0110000"; --1WHEN "0010" => b <= "1101101"; --2WHEN "0011" => b <= "1111001"; --3WHEN "0100" => b <= "0110011"; --4WHEN "0101" => b <= "1011011"; --5WHEN "0110" => b <= "1011111"; --6WHEN "0111" => b <= "1110000"; --7WHEN "1000" => b <= "1111111"; --8WHEN "1001" => b <= "1111011"; --9WHEN "1010" => b <= "1110111"; --AWHEN "1011" => b <= "0011111"; --bWHEN "1100" => b <= "1001110"; --CWHEN "1101" => b <= "0111101"; --dWHEN "1110" => b <= "1001111"; --EWHEN "1111" => b <= "1000111"; --FWHEN others => b <= "0000000"; --others END CASE;end process;cat <= "11111110";END aa;4)顶层LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity scanKeyboard is--scan the keyboard and display, sound at the same time port(clk,reset: in std_logic;row: in std_logic_vector(3 downto 0);col: out std_logic_vector(3 downto 0);sound: out std_logic;b: out std_logic_vector(6 downto 0);cat: out std_logic_vector(7 downto 0);seeclk: out std_logic);end scanKeyboard;architecture arch of scanKeyboard iscomponent divide_sound is--the origin clk is 50MHz--divide the frequency to 1/ngeneric( n0:natural:=4;n1:natural:=8;n2:natural:=12;n3:natural:=16;n4:natural:=20;n5:natural:=24;n6:natural:=28;n7:natural:=42;n8:natural:=46;n9:natural:=50;n10:natural:=54;n11:natural:=58;n12:natural:=62;n13:natural:=66;n14:natural:=70;n15:natural:=74);port( clk: in std_logic;choose: in integer range 0 to 15;sound_out: out std_logic);end component;component scan_seq is--produce the column scan signalport( clk,reset: in std_logic;col: out std_logic_vector(3 downto 0));end component;component seg7_1H IS --seg7 decoding PORT(a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --inputb: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --outputcat: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --selcect);END component;component divide is--divide the frequency to 1/ngeneric( n:natural:=200);port( clk: in std_logic;clk_out: out std_logic);end component;--clk_scan is the scan signal for column--tempSound is the output of the sound divider--tempSegin is the input of the seg7 translate part--clock_change is disgned to record the row's impulse appear--choose is the select of the keyboardsignal clk_scan: std_logic;signal tempSound:std_logic;signal tempSegin:std_logic_vector(3 downto 0);signal clock_change:std_logic;signal choose: integer range 0 to 15;type state is (s0,s1,s2,s3);signal presentstate, nextstate : state;beginu0:divide_sound port map(clk => clk,choose=>choose,sound_out=>tempSound);u1:divide port map(clk =>clk, clk_out=>clk_scan);u2:scan_seq port map(clk=>clk_scan,reset=>reset,col=>col);u3:seg7_1H port map(a=>tempSegin,b=>b,cat=>cat); --discrible the register for clk_scanp1_reg:process(clk_scan,reset)beginif(reset ='1')thenpresentstate<= s0;elsif( clk_scan'event and clk_scan='1' )thenpresentstate<= nextstate;end if;end process;--discrible the state for clk_scanp2_stateChange:process(presentstate)begincase presentstate iswhen s0 => nextstate<= s1;when s1 => nextstate<= s2;when s2 => nextstate<= s3;when s3 => nextstate<= s0;end case;end process;--discrible the outputp3_out:process(presentstate,row,clock_change)begin--behave synchronize with the clock_changeif( clock_change'event and clock_change = '1')then case presentstate is-- column[0]when s0 => case row iswhen "1110"=>choose <= 12;tempSegin <= "1100";when "1101"=>choose <= 8;tempSegin <= "1000";when "1011"=>choose <= 4;tempSegin <= "0100";when "0111"=>choose <= 0;tempSegin <= "0000";when others=>choose <= 0;tempSegin <= tempSegin;end case;-- column[1]when s1 => case row iswhen "1110"=>choose <= 13;tempSegin <= "1101";when "1101"=>choose <= 9;tempSegin <= "1001";when "1011"=>choose <= 5;tempSegin <= "0101";when "0111"=>choose <= 1;tempSegin <= "0001";when others =>choose <= 0;tempSegin <= tempSegin;end case;-- column[2]when s2 => case row iswhen "1110"=>choose <= 14;tempSegin <= "1110";when "1101"=>choose <= 10;tempSegin <= "1010";when "1011"=>choose <= 6;tempSegin <= "0110";when "0111"=>choose <= 2;tempSegin <= "0010";when others=>choose <= 0;tempSegin <= tempSegin;end case;-- column[3]when s3 => case row iswhen "1110"=>choose <= 15;tempSegin <= "1111";when "1101"=>choose <= 11;tempSegin <= "1011";when "1011"=>choose <= 7;tempSegin <= "0111";when "0111"=>choose <= 3;tempSegin <= "0011";when others=>choose <= 0;tempSegin <= tempSegin;end case;end case;end if;end process;--discrible clkchangep3_clkchange:process(row)beginif( row = "1111")thenclock_change <='0';elseclock_change<='1';end if;end process;--output the sound signalsound <= tempSound and clock_change;--to see the clock_change in waveformseeclk <= clock_change;end arch;4.仿真波形及分析1)分频器1(扫描时钟的分频器)图1-1分频器整体图1-2 分频器计数到99翻转(高翻低)图1-3 分频器计数到99翻转(低翻高)实际应采用分频比为,50k,现仿真时为方便仿真取为200分频,由图1-1可以看到整体分频的情况,由图1-2可以看到分频器在计数到99时由高电平翻为低电平,由图1-3可以看到分频器在计数到99时由低电平翻为高电平。
实验4 扫描显示驱动电路
一、实验目的
了解教学系统中8位八段数码管显示模块的工作原理,设计标准扫描驱动电路模块,以备后面实验用。
二、硬件要求
主芯片Altera EPM7128SLC84-15,时钟,8位八段数码管显示器,四位拨码开关。
三、实验内容
用四位拨码开关产生8421BCD码,用CPLD分别产生字形编码电路和扫描驱动电路,然后进行仿真,观察波形,正确后编程下载实验测试。
1、编一个简单的从0~F轮换显示十六进制数的电路。
2、用计数器产生数码管扫描驱动信号,调节时钟频率,感受扫描的过程,并观察字符的亮度和显示刷新的效果。
7
四、实验原理
四位拨码开关提供8421BCD 码,经译码电路DECL7S 后连接8段数码管的字形显示驱动信号a,b,c,d,e,f,g 。
数码管扫描电路可通过片选地址SEL[2..0]控制。
由SEL[2..0]和a,b,c,d,e,f,g 决定了8位数码管中的那一位显示和显示什么字形。
SEL[2..0]变化的快慢决定了扫描频率的快慢。
1、参考电路:如图4-1所示(时钟频率
>40Hz)
实验连线:把RESET 和rst0接高电平,CLK 接上时钟信号,可观察到第一个数码管循环显示字符0~F 。
2、参考电路:如图4-2所示
图4-1(t4-1.gdf )
图4-1’(t4-11.gdf )
图4-2(t4_2.gdf)
五、实验连线
输入信号:
D3,D2,D1,D0所对应的管脚同四位拨码开关相连;
清零信号RESET所对应的管脚同按键开关相连;
时钟CLK所对应的管脚同试验箱上的时钟源相连。
输出信号:
代表扫描片选地址信号SEL2,SEL1,SEL0的管脚同四位扫描驱动地址的低三位相连,最高位地址接“0”(也可悬空);
代表七段数码驱动信号a, b, c, d, e, f, g的管脚分别同扫描数码管的段输入a,b,c,d,e,f,g相连。
六、实验报告
1、字形编码的种类,即一个8段数码管可产生多少种字符,产生所有字符需多少根译码信号线?
2、字符显示亮度和扫描频率的关系,且让人感觉不出光烁现象的最低扫描频率是多少?
七、附录
(1) 字符译码器DECL7S的VHDL源程序
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 "1010" => led7s<="1110111";
when "1011" => led7s<="1111100";
when "1100" => led7s<="0111001";
when "1101" => led7s<="1011110";
when "1110" => led7s<="1111001";
when "1111" => led7s<="1110001";
when others => null;
end case;
end process;
end;
(2) 16进制4位计数器的VHDL源程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt4b is
port(clk,rst,en : in std_logic;
cq : out std_logic_vector(3 downto 0);
cout : out std_logic );
end cnt4b;
architecture behave of cnt4b is
begin
process(clk,rst,en)
variable ci:std_logic_vector(3 downto 0);
begin
if rst='1' then ci:=(others=>'0');--计数器异步复位
elsif clk'event and clk='1' then
if en='1' then --检测是否允许计数
if ci<"1111" then ci:=ci+1; --允许计数,
else ci:=(others=>'0'); --等于15,计数值清零
end if;
end if;
cq<=ci;
end if;
if ci="1111" then cout<='1'; --输出进位信号
else cout<='0';
end if;
end process;
end behave;
※文本编辑器的使用说明
MAX+PLUSII支持AHDL,VHDL及Verilog HDL等硬件描述语言。
下面通过一个例子说明采用文本方式进行设计的步骤。
首先选择File/New,在对话框中选择Text Editor File,打开一个无标题的Text Editor窗口。
然后选择File/Save As,在File Name框内输入文件名为——实体名.vhd,保存文件。
将上面的源程序输入。
完成后,可选择File/Project/Set Project to Current File,将文件设为当前项目。
然后同图形编辑一样,进行编译通过,波形仿真。
为了能在图形编辑器中调用,可以通过File/Greate Default Symbol将这部分生成一个可调用的图形元件符号,可以通过File/Edit Symbol对生成的图形符号进行简单编辑。
注意,只有在同一个文件夹中才可直接调用。
为了在任意文件中调用,可以将编译生成的扩展名为sym的符号文件和扩展名为vhd的文本源程序文件放在同一个文件夹中,通过Option/User library命令建立自己的元件库。