EDA实验四 扫描显示电路设计
- 格式:doc
- 大小:58.00 KB
- 文档页数:3
实验一QuartusII软件应用一、实验目的1、熟悉EDA开发平台的基本操作。
2、掌握EDA开发工具的图形设计方法。
3、掌握图形设计的编译与验证方法。
二、实验仪器PC机一台QuartusII软件三、实验内容1、实验原理图:建立一个4-bit 计数器图形设计文件(如图1.1示);图 1.1 图形设计例图对上述计数器进行功能和时间仿真,验证其功能并测试其最高工作频率。
利用向导创建一个新器件(6位全加器:使能、流水线等参数自行设定)。
2、实验步骤:①新建一个文件夹,一般在F盘里。
②打开QuartusII软件,选择File/New,在弹出的窗口中选Device Design Files选项卡,再选择Block Diagram/Schematic 选项,单击OK后打开图形编辑窗口。
③选择File/Save As命令,保存文件在已经创建的文件夹里。
当出现询问是否创建工程的窗口,应当单击是进入创建工程流程,否则要重新创建工程把文件添加进去。
④打开工程中的原理图文件,在原理图编辑窗口的任何一个位置右击,将出现快捷菜单,选择Insert /Symbol命令,出现元件输入对话框,选择相应的器件,并连接好电路,然后分别在input和output 的PIN NAME上双击使其变黑色,再分别输入引脚名。
⑤选择Processing/Start Compilation命令,进行全程编译。
⑥打开波形编辑器,选择File/New,在New中选择Other Files中的 Vector Waveform File 选项,单击OK,出现空白的波形编译窗口⑦选择File/Save As命令,存盘。
文件名一定要与原理图文件名一致。
然后添加相应的端口信号节点到波形编辑器中,设置合理的输入信号。
⑧选择Processing/Start Simulation,进行波形仿真。
⑨选择Tools/MegaWizard Plug-In M anager,根据向导提示创建一个6位全加器。
实验二:计数器动态扫描实验一实验目的熟悉译码扫描动态显示的工作原理、设计过程和实现方法。
二实验内容与要求学习用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 实验结果。
实验一组合逻辑器件设计一、实验目的1、通过一个简单的3-8译码器的设计,掌握组合逻辑电路的设计方法。
2、掌握组合逻辑电路的静态测试方法。
3、初步了解QUARTUS II原理图输入设计的全过程。
二、实验主要仪器与设备1、输入:DIP拨码开关3位。
2、输出:LED灯。
3、主芯片:EP1K10TC100-3。
三、实验内容及原理三-八译码器即三输入,八输出。
输出与输入之间的对应关系如表1-1-1所示。
表1-1 三-八译码器真值表四、预习要求做实验前必须认真复习数字电路中组合逻辑电路设计的相关内容(编码器、译码器)。
五、实验步骤1、利用原理图设计输入法画图1-1-1。
2、选择芯片ACEX1K EP1K10TC100-3。
3、编译。
4、时序仿真。
5、管脚分配,并再次编译。
6、实验连线。
7、编程下载,观察实验结果。
图1-1 三-八译码器原理图六、实验连线用拨码开关的低三位代表译码器的输入(A,B,C),将之与EP1K10TC100-3的管脚相连;用LED灯来表示译码器的输出(D0~D7),将之与EP1K10TC100-3芯片的管脚相连。
拨动拨档开关,可以观察发光二极管与输入状态的对应关系同真值表中所描述的情况是一致的。
七、实验结果八、思考题在输入端加入使能端后应如何设计?附:用硬件描述语言完成译码器的设计::LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY T2 ISPORT(A: IN STD_LOGIC_VECTOR(2 DOWNTO 0);Y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END T2;ARCHITECTURE A OF T2 ISBEGINWITH A SELECTY <= "00000001" WHEN "000","00000010" WHEN "001","00000100" WHEN "010","00001000" WHEN "011","00010000" WHEN "100","00100000" WHEN "101","01000000" WHEN "110","10000000" WHEN OTHERS;END A;实验二组合电路设计一、实验目的1、掌握组合逻辑电路的设计方法。
EDA设计课程实验报告实验题目:数码管动态显示实验学院名称:专业:电子信息工程班级:姓名:高胜学号小组成员:指导教师:一、实验目的学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
二、设计任务及要求1、在SmartSOPC实验箱上完成数码管动态显示自己学号的后八个数字。
2、放慢扫描速度演示动态显示的原理过程。
三、系统设计1、整体设计方案数码管的八个段a,b,c,d,e,f,g,h(h是小数点)都分别连接到SEG0~SEG7,8个数码管分别由八个选通信号DIG0~DIG7来选择,被选通的数码管显示数据,其余关闭。
如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口SEG0~SEG7加上该对应数码管上显示的数据,于是随着选通信号的扫描就能实现动态扫描显示的目的。
虽然每次只有1个数码管显示,但只要扫描显示速率足够快,利用人眼的视觉余辉效应,我们仍会感觉所有的数码管都在同时显示。
2、功能模块电路设(1)输入输出模块框图(见图1)图1(2)模块逻辑表达(见表1)表1(数码管显示真值表)clk_1k dig seg↑01111111 C0↑10111111 F9注:数码管显示为01180121(3)算法流程图(见图2)(4)Verilog源代码module scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0]count; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule四、系统调试(1)仿真代码`timescale 1ns/1nsmodule scan_ledfz;reg clk_1k;reg[31:0] d;wire[7:0] dig;wire[7:0] seg;parameter dely=100;scan_led u1(clk_1k,d,dig,seg);always #(dely/2)clk_1k=~clk_1k;initial beginclk_1k=0;d=32'h01180134;#dely ;#dely ;#dely ;#dely ;#dely ;#(dely*20);#dely $finish;endinitial $monitor($time,,,"%b,%d,%h,%h",clk_1k,d,dig,seg); endmodulemodule scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0] count=3'b000; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule位码代码仿真代码`timescale 1ns/1nsmodule smg_tp; //测试模块的名字reg [2:0] c; //测试输入信号定义为reg型wire[7:0] dig; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒wei u1(c,dig); //调用测试对象initial begin //激励波形设定c=3'b0;#DEL Y c=3'b001 ;#DEL Y c=3'b010 ;#DEL Y c=3'b100 ;#DEL Y c=3'b101 ;#DEL Y c=3'b110 ;#DEL Y c=3'b111 ;#DEL Y $finish;endinitial $monitor($time,,,"dig=%d,c=%b ",dig,c); //输出格式i定义endmodulemodule wei(c,dig); //命名模块名字input[2:0] c;output[7:0] dig; //定义输入与输出reg[7:0] dig_r;reg[2:0] c_r; // 定义dig_r与c_r2个reg型数据assign dig=dig_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin c_r=c;case (c_r)3'b000:dig_r=8'b11111110; //c_r的数据变化而dig_r对于的数据变化3'b001:dig_r=8'b11111101;3'b010:dig_r=8'b11111011;3'b011:dig_r=8'b11110111;3'b100:dig_r=8'b11101111;3'b101:dig_r=8'b11011111;3'b110:dig_r=8'b10111111;3'b111:dig_r=8'b01111111;default: dig_r=8'b11111111;endcase //结束case语句end //结束always语句endmodule //结束程序译码器代码仿真代码`timescale 1ns/1nsmodule duan_tp; //测试模块的名字reg[3:0] a; //测试输入信号定义为reg型wire[7:0] seg; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒duan u1(a,seg); //调用测试对象initial begin //激励波形设定a=4'b0;#DELY a=4'b0001;#DELY a=4'b0010;#DELY a=4'b0011;#DELY a=4'b0100;#DELY a=4'b0101;#DELY a=4'b0110;#DELY a=4'b0111;#DELY a=4'b1000;#DELY a=4'b1001;#DELY a=4'b1010;#DELY a=4'b1011;#DELY a=4'b1100;#DELY a=4'b1101;#DELY a=4'b1110;#DELY a=4'b1111;#DELY $finish;endinitial $monitor($time,,,"seg=%d,a=%b",seg,a); //输出格式i定义endmodulemodule duan(a,seg); //命名模块名字input[3:0] a;output[7:0] seg; //定义输入与输出reg[7:0] seg_r;reg[3:0] a_r; // 定义seg_r与a_r2个reg型数据assign seg=seg_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin a_r=a;case(a_r) //七段译码4'b0000:seg_r = 8'hc0; //显示04'b0001:seg_r = 8'hf9; //显示14'b0010:seg_r = 8'ha4; //显示24'b0011:seg_r = 8'hb0; //显示34'b0100:seg_r = 8'h99; //显示44'b0101:seg_r = 8'h92; //显示54'b0110:seg_r = 8'h82; //显示64'b0111:seg_r = 8'hf8; //显示74'b1000:seg_r = 8'h80; ///显示84'b1001:seg_r = 8'h90; //显示94'b1010:seg_r = 8'h88; //显示a4'b1011:seg_r = 8'h83; //显示b4'b1100:seg_r = 8'hc6; //显示c4'b1101:seg_r = 8'ha1; //显示d4'b1110:seg_r = 8'h86; //显示e4'b1111:seg_r = 8'h8e; ///显示f endcase //结束case语句end //结束always语句endmodule //结束程序(2)仿真波形图(3)引脚图五、实验感想通过这次实验,让我学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
实验四译码扫描显示电路设计一.实验目的:1. 熟悉QuartusⅡ软件应用环境,了解实验流程。
2. 编写简单的Verilog代码,并在QuartusⅡ中进行调试和验证,并在EDA6000中下载代码和验证。
3. 用扫描方式驱动8x8显示点阵.二.实验内容1.实现8x8点阵扫描驱动的“ Verilog ”语言设计。
2.编程下载并在实验箱上进行验证三.实验原理本实验要实现8x8显示点阵的控制电路,采用扫描方式驱动,分为8条行线,和八条列线,其中列线经反向驱动后接显示点阵。
用一个三位2进制数进行计数,控制扫描的过程,时钟信号有效,计数加一,用case语句实现扫描行列的变换。
当某一列为高电平,此列选通,当相应行为高电平时,相交点的led灯点亮,动态扫描,由于视觉延迟最终显示设定的字符”A”。
四.实验步骤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六.编译仿真结果七.心得与体会通过本次实验掌握了如何用Verilog HDL语言实现8x8点阵显示驱动的原理,达到运用Verilog语言实现物理电路驱动点阵,并且能够随意设定显示的字符的目的。
实验三数码管扫描显示电路一、实验目的1、掌握数码管动态扫描显示数据的原理;2、掌握利用EDA软件和VHDL语言设计较复杂时序逻辑电路的方法;二、实验原理实验参考程序:LIBRARY IEEE;USE IEEE.Std_Logic_1164.ALL;USE IEEE.Std_Logic_Unsigned.ALL;ENTITY Dynamic_Disp ISPORT(Clock:IN Std_Logic;En:OUT Std_Logic_Vector(0 to 7); --分别接到八个数码管的公共端Disp:OUT Std_Logic_Vector(0 to 6)); --接数码管的7个控制端END ENTITY Dynamic_Disp;ARCHITECTURE behav OF Dynamic_Disp ISSIGNAL Counter:Integer Range 0 to 7;BEGINPROCESS(Clock)V ARIABLE Num:Integer Range 0 to 9;BEGINIF rising_edge(Clock) THENIF Counter=7 THENCounter<=0;ELSECounter<=Counter+1;END IF;Num:=Counter;CASE Counter ISWHEN 0=>En<="01111111";WHEN 1=>En<="10111111";WHEN 2=>En<="11011111";WHEN 3=>En<="11101111";WHEN 4=>En<="11110111";WHEN 5=>En<="11111011";WHEN 6=>En<="11111101";WHEN 7=>En<="11111110";WHEN OTHERS=>En<="111111";END CASE;CASE Num ISWHEN 0 =>Disp<="1111110";WHEN 1 =>Disp<="0110000";WHEN 2 =>Disp<="1101101";WHEN 3 =>Disp<="1111001";WHEN 4 =>Disp<="0110011";WHEN 5 =>Disp<="1011011";WHEN 6 =>Disp<="1011111";WHEN 7 =>Disp<="1110000";WHEN 8 =>Disp<="1111111";WHEN 9 =>Disp<="1110011";WHEN OTHERS=>Disp<="0000000";END CASE;END IF;END PROCESS;END;常用的显示器件有发光二极管、数码管、液晶显示器等,其中最常用的是数码管。
实验一、应用QuartusII完成基本组合电路设计一、实验目的:熟悉QuartusⅡ的VHDL文本设计流程全过程,学习简单组合电路的设计、多层次电路设计、仿真和硬件测试。
二、实验内容1:首先利用QuartusⅡ完成2选1多路选择器的文本编辑输入(mux21a.vhd)和仿真测试等步骤,给出仿真波形。
最后在实验系统上进行硬件测试,验证本项设计的功能。
三、实验步骤1、先新建一个文件夹存放该工程,例如,D:\学生学号\mux21a (E:\experiment\mux21a);打开Quartus Ⅱ的操作界面,新建一个VHDL文件用VHDL编写程序entity mux21a isport (a,b,s:in bit;y:out bit);end entity mux21a;architecture one of mux21a isbeginy<=a when s='0' else b;end architecture one;(关键词不区分大小写)2、保存到所新建的目录下,即D:\学生学号\mux21a (E:\experiment\mux21a )。
并在“Create new project based on this file "前划勾,以新建一个新的工程。
(如需给工程增加文件,可在“File name”键入文件名)选择器件如下图所示:Cyclone EP1C6Q240C8出现此目录,则表明工程新建完毕。
3、编译:"processing"—>"start compliation",或者用快捷键"Ctrl+L",有误则对原文件进行修改,直到编译成功。
4、波形仿真:先新建一个波形文件,选择菜单 File-->New 命令,在New 窗口中选择Other File 的Vector Waveform File 选项,单击OK 按钮,即出现空白的波形编辑器。
设计任务本实验要求在给定子模块程序的基础上,画出设计原理图。
自行编写顶层模块程序,完成扫描显示驱动电路的设计,实现在8 个数码管上轮流显示字符0-F 的功能。
library ieee;use ieee.std_logic_1164.all;entity disp 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 disp;architecture beha of disp 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;end beha;。
实验四扫描驱动显示电路设计(设计性实验)一、实验目的1.了解实验箱中 8 位七段数码管显示模块的工作原理。
2.熟悉 VHDL 硬件描述语言及设计专用数字集成电路的自顶向下的设计思想。
3.掌握利用 CPLD/FPGA设计 8 位七段数码管扫描显示驱动电路的方法。
二、实验设备1.计算机(配置为:P4 CPU 128M 内存);2. MAX+plusⅡ开发工具软件;3.EDA 实验箱(主芯片是ALTERA EPM7128SLC84-6);三、扫描原理为了减少8位显示信号的接口连接线,实验箱中的数码显示采用扫描显示工作模式。
即 8 位数码管的七段译码输入(a,b,c,d,e,f,g)是并联在一起的,而每一个数码管是通过一个3 位选择 sel[2..0]来选定的。
sel 与数码管之间是一 3-8 译码的关系,即sel为“000”时,选中第一个数码管,sel 为“111”时,选中第八个数码管。
四、设计任务本实验要求在给定子模块程序的基础上,画出设计原理图。
自行编写顶层模块程序,完成扫描显示驱动电路的设计,实现在 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脚。
六、程序清单:--顶层程序:library ieee;use ieee.std_logic_1164.all;entity disp 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 disp;architecture beha of disp 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;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;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;--3-8译码器实现数码管选择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;输出仿真波形图:disp.vhd波形:counter16.vhd波形:decdisp.vhd波形:yima3.vhd波形:七、硬件实验1、对芯片进行编程。
附录实验指导第一部分实验系统介绍本系统主要由CPLD主芯片(或适配器)和外围的输入输出外设构成,CPLD主芯片的所有用户可用I/O口均没有固定接入,而仅以插孔的形式存在,因此用户在设计时,可根据需要定义管脚。
(一)EPM7128S适配器说明环绕适配器的圆插空是将芯片所有的可用插孔直接引出,插空旁的数字/标号就是芯片上被外连的管脚号(即pin number)。
用户可根据适配划分后的结果,直接用连线将对应管脚号的插孔同所选外设的接口插孔相连。
以下是管脚说明。
引出接线端口标号位置对应EPM7128S的引脚号(pin number)电特性备注Pin12~31 适配器左侧Pin12~31 15个I/O 可编程输入/输出Pin33~52适配器下侧Pin33~5216个I/O 可编程输入/输出Pin54~74适配器右侧Pin54~7416个I/O 可编程输入/输出Pin12~31 4~11适配器上侧Pin12~314~1113个I/O 可编程输入/输出CLK1 适配器左上方83 CLK1 全局时钟输入CLK2 适配器左上方 2 CLK2 全局时钟输入CLRn 适配器左上方 1 RESET 全局清零输入OE1n 适配器左上方84 OE 全局使能输入(二)时钟源六路单独时钟,按频率范围高低排列为:CLK0>CLK1>CLK2=CLK4>CLK3=CLK5,其中CLK0、CLK1直接对4M晶振进行分频,CLK2、CLK3、CLK4、CLK5经过两级分频,第一级为JPCK跳线排;第二级在相应的同标号的跳线排上。
输出信号名称调节对象频率可调范围JPCK1 2 3 4 5 跳线排JPCKf=4Mf=4M/24f=4M/25f=4M/26f=4M/27f=4M/28CLK 0 1 2 3 4 5 跳线排CLK0CLK1CLK2CLK3CLK4CLK5f=4M~4M/28f=4M/28~4M/214f=JPCK~JPCK/28f=JPCK~JPCK/28f=JPCK/28~JPCK/214f=JPCK/28~JPCK/214(三)普通输入输出器件接口主要为开关、LED灯。
河北科技师范学院机电工程学院电子设计自动化(EDA)实验指导书选用教材:《EDA技术实用教程》第三版潘松、黄继业编著电子信息实验室杜殿会2012.4.3《电子设计自动化(EDA)》课程实验指导书使用说明《电子设计自动化(EDA)》实验指导书适用于电子信息工程本科专业和应用电子技术专科专业,共有验证型实验 0 个、综合型实验 0 个、设计型实验 9 个。
其中电子信息工程本科专业实验 18 学时,实验/理论学时比为 18/36 ,包括简单组合电路的设计、加法计数器的设计及显示、用原理图输入法设计8位全加器和 8位十六进制频率计设计等 9 个实验项目。
……。
本实验现有主要实验设备 12 台(套),每轮实验安排学生 24 人,每组 2 人,每轮实验需要安排实验指导教师 2 人。
其他需要说明的内容……实验指导书执笔人:杜殿会实验指导书审核人:目录一、 EDA实验系统主板与芯片管脚对应关系 (3)二、Quartus II软件使用过程操作及实验注意事项: (3)实验一 1位全加器的设计 (6)实验二 8位全加器设计 (10)实验三加法计数器及译码电路设计 0实验四数码管扫描驱动显示电路设计 (3)实验五正弦信号发生器设计 (6)实验六自动售货机程序设计 (9)实验七数字时钟设计 (11)实验八键盘扫描显示电路设计实验九 8位十进制频率计设计 (23)附录:EDA技术实验开发系统ZY11EDA13BE实验箱简介 (32)EDA实验指导书1、EDA实验系统主板与芯片管脚对应关系1.1、主板系统I/O分配:器件种类为ACEX1K,FPGA芯片型号为EP1K30QC208-2。
1.2、时钟输入:1.3、模式选择开关为了全面开放I/O口,我们通过拨码开关CTRL来实现I/O口的免连线问题,模式选择模块功能说明如下图所示,拨码开关CTRL功能在实验箱上写了标识说明,在做实验时对照标识操作。
如在实现免连线功能时要用到数码管可以把拨码开关的第一脚拨向ON端,表示数码管可以用来显示输出的数据,若实现全开放I/O口系统时把拨码开关所有脚设置无效,即拨码开关全部不要拨向ON。
实验四键盘扫描及显⽰设计实验报告实验四键盘扫描及显⽰设计实验报告⼀、实验要求1. 复习⾏列矩阵式键盘的⼯作原理及编程⽅法。
2. 复习七段数码管的显⽰原理。
3. 复习单⽚机控制数码管显⽰的⽅法。
⼆、实验设备1.PC 机⼀台2.TD-NMC+教学实验系统三、实验⽬的1. 进⼀步熟悉单⽚机仿真实验软件 Keil C51 调试硬件的⽅法。
2. 了解⾏列矩阵式键盘扫描与数码管显⽰的基本原理。
3. 熟悉获取⾏列矩阵式键盘按键值的算法。
4. 掌握数码管显⽰的编码⽅法。
5. 掌握数码管动态显⽰的编程⽅法。
四、实验内容根据TD-NMC+实验平台的单元电路,构建⼀个硬件系统,并编写实验程序实现如下功能:1.扫描键盘输⼊,并将扫描结果送数码管显⽰。
2.键盘采⽤ 4×4 键盘,每个数码管显⽰值可为 0~F 共 16 个数。
实验具体内容如下:将键盘进⾏编号,记作 0~F,当按下其中⼀个按键时,将该按键对应的编号在⼀个数码管上显⽰出来,当再按下⼀个按键时,便将这个按键的编号在下⼀个数码管上显⽰出来,数码管上可以显⽰最近 4 次按下的按键编号。
五、实验单元电路及连线矩阵键盘及数码管显⽰单元图1 键盘及数码管单元电路实验连线图2实验连线图六、实验说明1. 由于机械触点的弹性作⽤,⼀个按键开关在闭合时不会马上稳定地接通,在断开时也不会⼀下⼦断开。
因⽽在闭合及断开的瞬间均伴随有⼀连串的抖动。
抖动时间的长短由按键的机械特性决定,⼀般为 5~10ms。
这是⼀个很重要的时间参数,在很多场合都要⽤到。
键抖动会引起⼀次按键被误读多次。
为了确保 CPU 对键的⼀次闭合仅做⼀次处理,必须去除键抖动。
在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。
按键的抖动,可⽤硬件或软件两种⽅法消除。
2. 为了减少键盘与单⽚机接⼝时所占⽤ I/O 线的数⽬,在键数较多时,通常都将键盘排列成⾏列矩阵形式。
3. 从数码管显⽰⽅式看,数码管分为静态显⽰和动态显⽰两种⽅式。
EDA实验报告姓名:曾维鋆学号:6102213863老师:杨鼎成班级:通信工程132班目录实验一半加器及全加器的设计 (3)实验二模可变计数器的设计 (6)实验三序列信号检测器的设计 (11)实验四交通灯控制器设计 (15)实验五多功能数字钟设计 (22)实验六出租车计费器的设计 (34)实验七16*16 点阵显示实验 (40)南昌大学实验报告学生姓名:曾维鋆学号:61002213863 专业班级:通信132班实验类型:□验证□综合█设计□创新实验日期:2015.10.19 实验成绩:实验一半加器及全加器的设计(一)实验目的1、熟悉实验装置和QuartusⅡ软件的使用;2、熟悉和掌握EDA设计流程;3、学习简单组合、时序电路的EDA设计;4、熟悉例化语句的应用。
(二)实验内容设计一个一位全加器。
先设计一个半加器h_adder.v作为预存文件。
然后设计顶层文件对h_adder.v文件进行调用,实现全加器的功能。
(三)实验原理由3个逻辑模块组成,其中两个为半加器,一个是或门。
真值表(四)实验步骤1.建立工作库文件夹,输入半加器和全加器的Verilog HDL代码并分别存盘。
a.半加器module h_adder(A,B,SO,CO);input A,B;3output SO,CO;assign SO=A^B;assign CO=A&B;endmoduleb.全加器module f_adder(ain,bin,cin,cout,sum);output cout,sum;input ain,bin,cin;wire net1,net2,net3;h_adder U1(ain,bin,net1,net2);h_adder U2(.A(net1),.SO(sum),.B(cin),.CO(net3));or U3(cout,net2,net3);endmodule2.选目标器件CycloneII中的EP2C35F672C8并编译。
EDA课程设计键盘扫描及显示完整程序第一篇:EDA课程设计键盘扫描及显示完整程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USESTD_LOGIC_ARITH.ALL;USESTD_LOGIC_UNSIGNED.ALL;ENTITYKEYBOARD IS PORT(CLK_1K : IN STD_LOGIC;CLK_40K : IN STD_LOGIC;KEY_LIE : IN STD_LOGIC_VECTOR(3 DOWNTO 0);START :OUT STD_LOGIC;KEY_HANG :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DATA_P : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);DISP_DATA : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);DISP_SEL : OUT STD_LOGIC_VECTOR(1 downto 0);END;ARCHITECTURE RTL OF KEYBOARD IS SIGNAL INT : STD_LOGIC;SIGNAL CLK_SEL : STD_LOGIC;SIGNAL START_REG:STD_LOGIC;SIGNAL SIGNAL SIGNAL SIGNAL DISP_SEL_REG:STD_LOGIC_VECTOR(1 DOWNTO 0);DATA_L,DATA_H:STD_LOGIC_VECTOR(3 DOWNTO 0);DATA_TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);KEY_HANG__TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DISP_DATA_REG:STD_LOGIC_VECROR(3 DOWNTO 0);SIGNAL KEY_CODE:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL DATA_P_REG:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN KEY_CODE<=KEY_HANG_TMP&KEY_LIE;DATA_P<=DATA_P_REG; START<=START_REG;KEY_HANG<=KEY_HANG_TMP;DISP_SEL<=DISP_SEL_REG;CLK_SEL<=CLK_1K AND(NOT INT);PROCESS(CLK_SEL,CLK_40,INT)VARIABLE STATE : INTEGER RANG 0 TO 3;BEGIN IF RISING_EDGE(CLK_40K)THEN INT<= NOT(KEY_LIE(3)AND KEY_LIE(2)AND KEY_LIE(1)AND KEY_LIE(0));END IF;IF RISING_EDGE(CLK_SEL)THEN CASE STATE IS WHEN 0=>KEY_HANG_TMP<=“1110”;STATE :=1;WHEN 1 =>KEY_HANG_TMP<=“1101”;STATE :=2;WHEN 3 =>KEY_HANG_TMP<=“1011”;STATE :=3;WHEN 4=>KEY_HANG_TMP<=“0111”;STATE :=0;END CASE;END IF;END PROCESS;PROCESS(CLK_40K , INT)VARIABLE STATE :INTEGER RANGE 0 TO 3;VARIABLE COUNTER : INTEGER RANGE 0 TO 31;BEGIN IF INT='0' THENSTATE:=0;COUNTER:=0;ELSIF RISING_EDGE(CLK_40K)THEN CASE STATE ISWHEN 0 => DATA_TMP <= DATA_L;STATE:=1;WHEN 1 =>CASE KEY_CODE ISWHEN “01110111” =>DATA_L <=“0001”;DATA_H <=DATA_TMP; STATE:=2;WHEN “01111011” => DATA_L <=“0010”; DATA_H <=DATA_TMP; STATE:=2;WHEN “01111101” => DATA_L <=“0011”; DATA_H <=DATA_TMP; STATE:=2;WHEN “01111110” => DATA_L <=“0100”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10110111” => DATA_L <=“0101”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111011” => DATA_L <=“0110”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111101” => DATA_L <=“0111”; DATA_H <=DATA_TMP; STATE:=2;WHEN “10111110” => DATA_L <=“1000”; DATA_H <=DATA_TMP; STATE:=2;WHEN “11010111” => DATA_L <=“1001”;DATA_H <=DATA_TMP; STATE:=2;WHEN “11011011” => DATA_L <=“0000”;DATA_H <=DATA_TMP; STATE:=2;WHEN “11011101” =>IF DATA_H =“1001” THEN IF DATA_L=“1001” THEN DATA_H<=“1001”;DATA_L<=“1001”;ELSE DATA_L<=DATA_L + 1; END IF;ELSIF DATA_L=“1001” THEN DATA_L<=“0000”;DATA_H<=DATA_H+1; ELSEDATA_L<=DATA_L+1;DATA_H<=DATA_H;END IF;STATE:=2;WHEN “11011110” =>IF DATA_H=“1001” THEN DATA_H<=“1001”;ELSE DATA_L<=DATA_L;DATA_H<= DATA_H+1;END IF; STATE:=2;WHEN “11100111” =>IF DATA_L=“0000” AND DATA_H=“0000” THEN DATA_L<=“0000”;DATA_H<=“0000”;ELSIF DATA_L=“0000” THEN DATA_L<=“1001”;DATA_H<= DATA_H-1;ELSEDATA_L <=DATA_L-1;DATA_H<=DATA_H;END IF;STATE:=2;WHEN “11101011”=>IF DATA_H=“0000” THENDATA_H<=“0000”;ELSEDATA_L<=DATA_L;DATA_<=DATA_H-1;END IF;STATE:2;WHEN “11101110” =>DATA_L<=DATA_L;DATA_H<=DATA_H;DATA_P_REG<=DATA_H&DATA_L;START_REG<='1';STATE:=2;WHEN“11101101” =>DATA_L<=“0000”;DATA_H<=“0000”;STATE:=2;WHEN OTHERS =>STATE:=2;END CASE;WHEN 2 =>IF COUNTER=31 THENCOUNTER:=0;STATE:=3;ELSECOUNTER:=COUNTER+1;STSTE:=2;END IF;WHEN 3 =>START_REG<='0';STATE:=3;END CASE;END IF;END PROCESS;PROCESS(CLK_1K,DATA_L,DATA_H)VARIABLE STATE: INTEGER RANGE 0 TO 1;BEGINIF RISING_EDGE(CLK_1K)THENCASE STATE ISWHEN 0 =>DISP_SEL_REG<=“10”;DISP_DATA_REG<=DATA_L;STATE:=1;WHEN 1 =>DISP_SEL_REG<=“01”;DISP_DATA_REG<=DATA_H;STATA:=0;END CASE;END IF;END PROCESS;PROCESS(CLK_1K,DISP_DATA_REG)BEGIN IF RISING_EDGE(CLK_1K)THENCASE DISP_DATA_REG ISWHEN “0000”=>DISP_DATA<=“1111110” WHEN “0001”=>DISP_DATA<=“0110000” WHEN “0010”=>DISP_DATA<=“1101101” WHEN “0011”=>DISP_DATA<=“1111001” WHEN “0100”=>DISP_DATA<=“0110011” WHEN “0101”=>DISP_DATA<=“1011011” WHEN “0110”=>DISP_DATA<=“1011111” WHEN “0111”=>DISP_DATA<=“1110000” WHEN “1000”=>DISP_DATA<=“1111111” WHEN “1001”=>DISP_DATA<=“1111011” WHEN OTHERS =>DISP_DATA<=“0000000” END CASE;END IF;END PROCESS;END;第二篇:EDA课程设计考试序号:28自动打铃系统设计说明书学生姓名:周文江学号:14112502521专业班级:1102报告提交日期:2013.11.26湖南理工学院物电学院目录一、题目及要求简介...............3 1.设计题目.....................3 2.总体要求简介 (3)二、设计方案说明 (3)三、系统采用器件以及模块说明.........3 1.系统框图............4 2.选择的FPGA芯片及配置.........4 3.系统端口和模块说明 (5)四、各部分仿真结果 (5)五、调试及总结 (6)六、参考文献 (7)七、附录 (7)一、题目及要求简介1、设计题目设计一个多功能自动打铃系统2、总体要求简介① 基本计时和显示功能(24小时制显示),包括:1.24小时制显示2.动态扫描显示;3.显示格式:88-88-88 ② 能设置当前时间(含时、分)③ 能实现基本打铃功能,规定:06:00起床铃,打铃5s二、设计方案说明本次设计主要采用Verilog HDL硬件描述性语言、分模块法设计的自动打铃系统。
实验二:数码管扫描显示电路一、实验目的采用混合工程,将模4计数器,3选1多路复用器,2-3译码器以及7段译码器混合编程,最终使三位数码管显示1,2,3;二、实验方法采用基于FPGA进行数字逻辑电路设计的方法。
其中利用原理图,硬件描述语言画出最终电路原理图,从而达到实验结果;三、实验步骤1、编译好3选1多路复用器,2-3译码器并保存;2、新建工程名为scan-led3的文件,目标器件为EPF10K20TC144-3;3、将将模4计数器,3选1多路复用器,2-3译码器的源文件导入工程中;4、建立电路图文件并完成电路图连接;5、按照实验要求完成管脚分配;6、打开波形图文件,插入节点和节点集合,另外要把输入节点组中得din0,din1,din2改成16进制,其它为2进制;7、进行仿真,产生波形;8、将设计下载到芯片中并使三位数码管稳定显示1,2,3;四、实验原理1、3选1多路复用器程序设计为:library IEEE;use IEEE.std_logic_1164.all;entity mux4_3_1 isport(d0,d1,d2:in STD_LOGIC_VECTOR(3 downto 0);sel: in STD_LOGIC_VECTOR(1 downto 0);dout:out STD_LOGIC_VECTOR(3 downto 0));end mux4_3_1;architecture rtl of mux4_3_1 isbegindout<= d0 when sel="00"elsed1 when sel="01"elsed2;end rtl;2、2-3译码器电路图为:3、scan-led3的电路图为:4、scan-led3的仿真波形图:五、实验总结:这次实验由于是小组分工完成,所以我完成的是3-选1多路复用器和scan-led3的电路图绘制;虽然其他部分并非我单独完成,但还是熟悉了基本流程而且有了不同的了解和认识:首先在3选1多路复用器中认识到一种新的分配管脚的方法——就是有点击File-New-Tcl script File,利用TCL脚本语言分配管脚;(以前用的就是点击Assignments-Pins来分配管脚。
EDA 第一次实验报告实验目的:利用QuartusⅡ软件,采用自上而下或自下而上的模块化层次设计数码管扫描显示电路,通过仿真波形及硬件实验平台验证设计,从而熟悉QuartusⅡ的数字系统设计流程以及FPGA开发模式。
一、实验设计方案1.原理说明:几个数码管在同一时间进行显示利用人眼的视觉暂留效应,把多个数码管按一定顺序(从左至右或从右至左)循环进行点亮,当点亮的频率足够高时,我们可以看到全部同时显示(点亮)。
因此,我们只要给数码管驱动电路一个足够高的扫描工作频率,就可以实现几个数码管同时点亮。
而用来产生这个扫描频率的驱动电路,可以通过BCD七段译码器的输入数据切换电路,通过计数器的输出来控制几个多路数据选择器电路的实现,只要计数频率足够高,就可以实现我们的要求。
2.结构框图:其中,3选1多路选择器以及2-3译码器的输入信号是由模4计数器统一输出控制,以达到数码管的位选以及段选同时变化的效果。
二、实验流程:1、模4计数器设计并进行仿真,下载到电路板上测试2、3选1多路选择器设计3、2-3译码器设计并进行仿真4、综合利用模4计数器,3选1多路选择器以及2-3译码器完成数码管扫描显示电路的设计并进行仿真,下载到电路板上测试模4计数器与2-3译码器大同小异。
所以,我就以2-3译码器为例简单的讲述一下演示工程的创建过程。
3选1多路选择器:1)打开Quartus,创建工程,点击File->New Project WizardEDA 实验报告王丹计科一班 2注意工程文件名一定要和顶层实体名一致,否则到后面编译的时候就有可能会报错并且还很难找出错误原因。
2)点击Next,下一步是添加工程所需子模块设计源文件及设置用户库,我们目前不需要,直接单击Next。
3)选择目标器件我在实验室里截了图,其实可以看出,上面器件的选取和电板上的芯片型号相同。
因此,一定要根据实际情况对器件进行选取,否则,仿真时就会出现问题。
课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 按键状态扫描显示电路的设计与制作初始条件:(1)以0~9十个数符标识十个按键(2)当有键按下时,显示其标识符,并保持显示符直到新的按键作用(3)如果多个按键同时作用,只响应最先作用的按键要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计任务及要求(2)方案比较及认证(3)系统框图,原理说明(4)硬件原理,完整电路图,采用器件的功能说明(5)调试记录及结果分析(6)对成果的评价及改进方法(7)总结(收获及体会)(8)参考资料(9)附录:器件表,芯片资料时间安排:6月27日~6月30日:明确课题,收集资料,方案确定,仿真7月1日~7月4日:硬件电路制作与调试7月5日~7月8日;报告撰写,交设计报告,答辩指导教师签名:年月日系主任(或责任教师)签名:年月目录摘要 (Ⅰ)1 任务及要求 (2)1.1 设计任务 (2)1.2 设计要求 (2)2 设计方案 (2)2.1 总体设计思想 (2)2.2 总体逻辑功能图 (2)2.3 设计方案的选择 (3)2.3.1 编码电路的选择 (3)2.3.2 触发电路的选择 (5)3 单元电路的功能说明 (6)3.1 单元电路的设计 (6)3.1.1 按键控制电路 (6)3.1.2 编码电路 (8)3.1.3 触发电路的设计 (9)3.1.4 逻辑反馈电路的设计 (10)3.1.5 译码显示电路的设计 (11)3.2 整体电路的工作原理 (15)4 利用Protues,Multisim仿真电路 (16)5 结束语 (18)参考文献 (19)附录 (20)摘要随着电子技术和计算机技术的飞速发展,电子线路的设计工作也日益显得重要。
经过人工设计,制作实验板,调试再修改的多次循环才定型的传统产品设计方法必然被计算机辅助设计所取代,因为这种费时费力又费资源的设计调试方法即增加了产品开发的成本和周期,又受到实验工作场地及仪器的限制。
EDA技术应用期末论文题目:八位数码管动态显示姓名:班级:学号:1.系统总体方案设计 (1)2. LED的工作原理 (2)2.1 LED工作原理 (3)2.2 LED动态扫描显示原理 (3)3.系统设计 (4)3.1硬件电路设计 (9)3.2 VHDL代码设计 (9)4.运行调试......................................................,,7 4.1时序仿真. (7)5 总结..............................................,,,,,,,,,,,,,,,96.参考文献 (10)1.系统总体方案设计设计流程图如下:首先,我们要对所要设计的八位数码管静态扫描显示电路充分理解,同时在了解了所给的硬件器材的基础上需进行“源程序的编辑和编译”——用一定的逻辑表达手段将设计表达出来;其次要进行“逻辑综合”——将用一定的逻辑表达手段表达出来的设计,经过一系列的操作,分解成一系列的基本逻辑电路及对应关系;然后要进行“目标器件的布线∕适配”——在选定的目标器件中建立这些基本逻辑电路及对应关系;最后,目标器件的编程下载——将前面的软件设计经过编程变成具体的设计系统,同时在设计过程中要进行有关“仿真”——模拟有关设计结果,看是否与设计构想相符。
系统结构框图如下:2. LED的工作原理2.1 LED工作原理LED为分段式半导体显示器,通常称为七段发光二极管显示器。
下图为七段发光二极管显示器共阴极和共阳极的电路图。
对共阴极显示器的公共端应接地,给a-g输入相应高电平,对应字段的发光二极管显示十进制数;对共阳极的公共端应接+5V电源,给a-g输入端相应低电平,对应字段的发光二极管也显示十进制数。
2.2 LED动态扫描显示原理LED有段码和位码之分,所谓段码就是让LED显示出“8.”的八位数据,一般情况下要通过一个译码电路,将输入的4位2进制数转换为与LED显示对应的8位段码。
班级学号姓名实验组别
实验日期室温报告日期成绩
实验四扫描显示电路设计
一、实验目的
学习硬件扫描显示电路的设计。
二、实验原理
扫描显示电路每个数码管的8个段:h、g、f、e、d、c、b、a(h是小数点)都分别连在一起,8个数码管分别由位选来控制。
被选通的数码管显示数据,其余关闭。
如在某一时刻,第三个数码管的位选为高电平,其余选通信号为低电平,这时仅此数码管显示来自段信号端的数据,而其它7个数码管呈现关闭状态。
三、实验程序
module scan_led(CLK,DATA_IN,SEG,DIG);
input CLK;
input [31:0] DATA_IN;
output [7:0] SEG;
output [7:0] DIG;
reg [7:0] SEG_R;
reg [7:0] DIG_R;
reg [3:0] DATA_R;
reg [2:0] COUNT;
assign SEG=SEG_R;
assign DIG=DIG_R;
always @(posedge CLK)
begin
COUNT<=COUNT+1'b1;
case(COUNT)
3'b000 : begin DATA_R=DATA_IN[31:28];DIG_R=8'b10000000; end
3'b001 : begin DATA_R=DATA_IN[27:24];DIG_R=8'b01000000; end
3'b010 : begin DATA_R=DATA_IN[23:20];DIG_R=8'b00100000; end
3'b011 : begin DATA_R=DATA_IN[19:16];DIG_R=8'b00010000; end
3'b100 : begin DATA_R=DATA_IN[15:12];DIG_R=8'b00001000; end
3'b101 : begin DATA_R=DATA_IN[11:8]; DIG_R=8'b00000100; end
3'b110 : begin DATA_R=DATA_IN[7:4]; DIG_R=8'b00000010; end
3'b111 : begin DATA_R=DATA_IN[3:0]; DIG_R=8'b00000001; end
default : begin DATA_R=4'b0000; DIG_R=8'b11111111; end
endcase
end
always @(DATA_R)
begin
case(DATA_R)
4'b0000 : SEG_R=8'h3f;
4'b0001 : SEG_R=8'h18;
4'b0010 : SEG_R=8'h6d;
4'b0011 : SEG_R=8'h67;
4'b0100 : SEG_R=8'h73;
4'b0101 : SEG_R=8'h76;
4'b0110 : SEG_R=8'h7e;
4'b0111 : SEG_R=8'h23;
4'b1000 : SEG_R=8'h7f;
4'b1001 : SEG_R=8'h73;
4'b1010 : SEG_R=8'h7b;
4'b1011 : SEG_R=8'h5e;
4'b1100 : SEG_R=8'h3c;
4'b1101 : SEG_R=8'h4f;
4'b1110 : SEG_R=8'h7c;
4'b1111 : SEG_R=8'h78;
default : SEG_R=8'h00;
endcase
end
endmodule
四、实验结果
RTL图:
功能仿真:。