已阅读5页,还剩79页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深 圳 大 学 实 验 报 告 课程名称: 数字系统现场集成技术 实验项目名称: 设计秒表 学院: 信息工程学院 专业: 集成电路设计与集成系统 指导教师: 报告人: 学号: 班级: 实验时间: 实验报告提交时间: 教务部制84 目录1、 实验要求 -32、 实验环境 -33、 Nexys2开发板介绍及本实验功能说明 -34、 框架图功能与ASM图 -45、 各层VHDL代码、仿真结果及结果分析 -66、 资源报告及实验结果 -507、 问题及解决 -518、 总结 -52一、实验要求:基本要求:它具有计时功能。此秒表有两个按键(reset, start)按下reset键后,秒表清零,按下start键后,开始计时, 再次按下start键后, 停止计时, 用FPGA开发板上的两个七段数码管显示时间(以秒为单位),计时由0 到 59 循环。高级要求(可选):实现基本要求的前提下,增加一个按键(select),用于轮流切换两个七段数码管分别显示百分之一秒,秒,分钟。二、实验环境1、 windows72、 ISE14.43、 Nexys2开发板三、Nexys2开发板介绍及本实验功能说明Nexys2开发板的核心芯片是具有1200K门的Spartan 3E FPGA,时钟是由50MHz的晶振提供,还有4个的7段数码管,4个按钮,8个拨码开关。下图为Nexys2开发板的实际部分板分布: 图3.1 Nexys2开发板的实际部分板分布 图3.2 Nexys2开发板的I/O原理图Nexys2板上7段数码管为共阳极的方式,阴极独立。也就是说驱动7段数码管的每一段的显示,必须给低电平。由于板上的7段数码管的设计结构,为了在4个数码管上显示数字,必须给出扫描控制电路,图3.3给出了扫描控制电路的时序结构。为了在每个数码管上显示和连续的点亮数码管,所有的四个数码管应该每1到16ms就被驱动一次。 图3。3 时序结构但在本实验中,四个数码管的驱动时间为100us,所以每400us,数码管就被驱动一次,并且效果也很好。四、框架图功能与ASM图1、框架: 图4.1.1 框架本实验中使用了4个数码管、3个按钮、5个拨动开关,数码管用来显示时间,按钮分别是rst_p异步复位按键、start_stop开始/暂停按键、record_button记录时间按键(只能记录最近的4次),拨动开关作用分别是key1(两位)秒表时间选择(00表示显示秒和百分秒、01表示显示分和秒、10表示显示时和分、11表示显示天和时)、mode可切换看秒表还是记录(1表示数码管显示的是正在计数时间,0表示数码管显示的是已记录的时间)、key2(两位)记录次数选择(00表示最近的一次记录时间、01表示最近第二次的记录时间、11表示最近第三次的记录时间、10表示最近第四次的记录时间)。2、 ASM图本实验中有一个counter计数模块,输出想要的天、时、分、秒和百分秒(后面有详细介绍),它的ASM图如下: 图4.2 counterASM图五、各层VHDL代码、仿真结果及结果分析全部的模块展开如下: 图5.0 全部模块展开图1、 顶层chronography模块此模块只是负责连线、分频器的分频系数和复位的取反(因为我习惯低复位,而开发板的按键按下是高电平)代码为:library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity chronography isport(clk : in std_logic;rst_p : in std_logic;start_stop : in std_logic;record_button : in std_logic;key1 : in std_logic_vector (1 downto 0);-秒表时间选择mode : in std_logic;-可切换看秒表还是记录key2 : in std_logic_vector (1 downto 0);-记录次数选择seg7 : out std_logic_vector (7 downto 0);-dp,g,f,e,d,c,b,aan : out std_logic_vector (3 downto 0);end chronography;architecture Behavioral of chronography is-component button isport(clk : in std_logic;rst_n : in std_logic;start_stop : in std_logic;-继续/暂停键record_button : in std_logic;-记录键key1 : in std_logic_vector (1 downto 0);-时间切换选择mode : in std_logic;-选择秒表时间还是看记录时间key2 : in std_logic_vector (1 downto 0);-可记录4次,查看第几次记录time_sel : out std_logic_vector (1 downto 0);-等于key1en_counter : out std_logic;-使能计数器,可使计数器继续或暂停en_recorder : out std_logic;-记录的使能,每按一次,就记录当下时间transfer : out std_logic;-选择秒表时间还是看记录时间record_sel : out std_logic_vector (1 downto 0)-可记录4次,查看第几次记录);end component;-component div_clk isgeneric (cnt : integer);-分频系数 port( clk : IN std_logic; rst_n : IN std_logic; f_clk : out std_logic ); end component;-component counter isport(clk : in std_logic;-100hzrst_n : in std_logic;en : in std_logic;dayten : out integer range 0 to 3;-天数十位dayge : out integer range 0 to 9;-天数个位hourten : out integer range 0 to 2;-小时十位hourge : out integer range 0 to 9;-小时个位minten :out integer range 0 to 5;-分钟十位minge :out integer range 0 to 9;-分钟个位secten :out integer range 0 to 5;-秒十位secge :out integer range 0 to 9;-秒个位msecten : out integer range 0 to 9;-为100msmsecge : out integer range 0 to 9-为10ms);end component;-component mux10_4 isport(dayten : in integer range 0 to 3;dayge : in integer range 0 to 9;hourten : in integer range 0 to 2;hourge : in integer range 0 to 9;minten : in integer range 0 to 5;minge : in integer range 0 to 9;secten : in integer range 0 to 5;secge : in integer range 0 to 9;msecten : in integer range 0 to 9;msecge : in integer range 0 to 9;sel : in std_logic_vector (1 downto 0);out1 : out integer range 0 to 9;out2 : out integer range 0 to 9;out3 : out integer range 0 to 9;out4 : out integer range 0 to 9);end component;-component seg7display isport(clk : in std_logic;rst_n : in std_logic;shu1 : in integer range 0 to 9;shu2 : in integer range 0 to 9;shu3 : in integer range 0 to 9;shu4 : in integer range 0 to 9;seg7 : out std_logic_vector (7 downto 0);an : out std_logic_vector (3 downto 0);end component;-component recorder isport(clk : in std_logic;en_recorder : in std_logic;transfer : in std_logic;record_sel : in std_logic_vector (1 downto 0);daytenin : in integer range 0 to 3;-天数十位daygein : in integer range 0 to 9;-天数个位hourtenin : in integer range 0 to 2;-小时十位hourgein : in integer range 0 to 9;-小时个位mintenin :in integer range 0 to 5;-分钟十位mingein :in integer range 0 to 9;-分钟个位sectenin :in integer range 0 to 5;-秒十位secgein :in integer range 0 to 9;-秒个位msectenin : in integer range 0 to 9;-为100msmsecgein : in integer range 0 to 9;-为10msdayten : out integer range 0 to 3;-天数十位dayge : out integer range 0 to 9;-天数个位hourten : out integer range 0 to 2;-小时十位hourge : out integer range 0 to 9;-小时个位minten :out integer range 0 to 5;-分钟十位minge :out integer range 0 to 9;-分钟个位secten :out integer range 0 to 5;-秒十位secge :out integer range 0 to 9;-秒个位msecten : out integer range 0 to 9;-为100msmsecge : out integer range 0 to 9-为10ms);end component;-signal clk_10khz, clk_100hz: std_logic;signal rst_n : std_logic;signal time_sel : std_logic_vector (1 downto 0);signal en_counter : std_logic;signal en_recorder : std_logic;signal recorder_sel : std_logic_vector (1 downto 0);signal transfer : std_logic;-cr : counter_recordersignal dayten_cr : integer range 0 to 3 := 0;signal dayge_cr : integer range 0 to 9 := 0;signal hourten_cr : integer range 0 to 2 := 0;signal hourge_cr : integer range 0 to 9 := 0;signal minten_cr : integer range 0 to 5 := 0;signal minge_cr : integer range 0 to 9 := 0;signal secten_cr : integer range 0 to 5 := 0;signal secge_cr : integer range 0 to 9 := 0;signal msecten_cr : integer range 0 to 9 := 0;signal msecge_cr : integer range 0 to 9 := 0;signal dayten : integer range 0 to 3 := 0;signal dayge : integer range 0 to 9 := 0;signal hourten : integer range 0 to 2 := 0;signal hourge : integer range 0 to 9 := 0;signal minten : integer range 0 to 5 := 0;signal minge : integer range 0 to 9 := 0;signal secten : integer range 0 to 5 := 0;signal secge : integer range 0 to 9 := 0;signal msecten : integer range 0 to 9 := 0;signal msecge : integer range 0 to 9 := 0;signal shu1 : integer range 0 to 9 := 0;signal shu2 : integer range 0 to 9 := 0;signal shu3 : integer range 0 to 9 := 0;signal shu4 : integer range 0 to 9 := 0;beginprocess(rst_p)beginrst_n = not rst_p;end process;-产生10khz的时钟,用于useg7displayuclk_10khz : div_clk generic map (5000) port map(clk, 1, clk_10khz);-产生200hz的时钟,用于button和counteruclk_100hz : div_clk generic map (500000) port map(clk, rst_n, clk_100hz);-扫面按键u1button : button port map(clk_100hz, rst_n, start_stop, record_button, key1, mode, key2, time_sel, en_counter, en_recorder, transfer, recorder_sel);-计数器,可输出天数、小时、分钟、秒以及10毫秒u1counter : counter port map(clk_100hz, rst_n, en_counter, dayten_cr, dayge_cr, hourten_cr, hourge_cr, minten_cr, minge_cr, secten_cr, secge_cr, msecten_cr, msecge_cr);-记录器,可记录最新4次u1recorder : recorder port map(clk_100hz, en_recorder, transfer, recorder_sel, dayten_cr, dayge_cr, hourten_cr, hourge_cr, minten_cr, minge_cr, secten_cr, secge_cr, msecten_cr, msecge_cr, dayten, dayge, hourten, hourge, minten, minge, secten, secge, msecten, msecge);-因为只有四个数码管,所以要选择显示什么时间u1mux10_4 : mux10_4 port map(dayten, dayge, hourten, hourge, minten, minge, secten, secge, msecten, msecge, time_sel, shu1, shu2, shu3, shu4);-数码管的显示useg7display : seg7display port map(clk_10khz, rst_n, shu1, shu2, shu3, shu4, seg7, an);end Behavioral;RTL原理图为: 图5.1.1 顶层RTL原理图打开之后可以看到有七个子模块: 图5.1.2 顶层RTL原理图2、 button模块此模块是按键和拨动开关扫描,用来缓存和解析I/O输入的数据,即是按键和拨动开关的数据,还可以有一定程度的消抖。代码为:ibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;entity button isport(clk : in std_logic;rst_n : in std_logic;start_stop : in std_logic;-继续/暂停键record_button : in std_logic;-记录键key1 : in std_logic_vector (1 downto 0);-时间切换选择mode : in std_logic;-选择秒表时间还是看记录时间key2 : in std_logic_vector (1 downto 0);-可记录4次,查看第几次记录time_sel : out std_logic_vector (1 downto 0);-等于key1en_counter : out std_logic;-使能计数器,可使计数器继续或暂停en_recorder : out std_logic;-记录的使能,每按一次,就记录当下时间transfer : out std_logic;-选择秒表时间还是看记录时间record_sel : out std_logic_vector (1 downto 0)-可记录4次,查看第几次记录);end button;architecture Behavioral of button isbeginprocess(clk, rst_n)variable start_stop1 : std_logic := 0;variable start_stop2 : std_logic := 0;variable start_stop3 : std_logic := 0;variable recordbutton1 : std_logic := 0;variable recordbutton2 : std_logic := 0;variable recordbutton3 : std_logic := 0;beginif(rst_n = 0) thenstart_stop1 := 0;start_stop2 := 0;start_stop3 := 0;recordbutton1 := 0;recordbutton2 := 0;recordbutton3 := 0;elseif(clk event and clk = 1) thenstart_stop2 := start_stop1;start_stop1 := start_stop;recordbutton2 := recordbutton1;recordbutton1 := record_button;if(start_stop1 = 0) and (start_stop2 = 1) then-下降沿start_stop3 := not start_stop3;end if;if(recordbutton1 = 1) and (recordbutton2 = 0) thenrecordbutton3 := 1;elserecordbutton3 := 0;end if;time_sel = key1;transfer = mode;record_sel = key2;end if;end if;en_counter = start_stop3;en_recorder 0); signal mode : std_logic := 0; signal key2 : std_logic_vector(1 downto 0) := (others = 0); -Outputs signal time_sel : std_logic_vector(1 downto 0); signal en_counter : std_logic; signal en_recorder : std_logic; signal transfer : std_logic; signal record_sel : std_logic_vector(1 downto 0); - Clock period definitions constant clk_period : time := 10 ns; BEGIN - Instantiate the Unit Under Test (UUT) uut: button PORT MAP ( clk = clk, rst_n = rst_n, start_stop = start_stop, record_button = record_button, key1 = key1, mode = mode, key2 = key2, time_sel = time_sel, en_counter = en_counter, en_recorder = en_recorder, transfer = transfer, record_sel = record_sel ); - Clock process definitions clk_process :process beginclk = 0;wait for clk_period/2;clk = 1;wait for clk_period/2; end process; - Stimulus process stim_proc1: process begin - hold reset state for 100 ns.rst_n = 1;start_stop = 0;record_button = 0; wait for 30 ns;start_stop = 1;wait for 30 ns;start_stop = 0;wait for 100 ns;record_button = 1;wait for 30 ns;record_button = 0; wait for 100 ns;start_stop = 1;wait for 30 ns;start_stop = 0; - insert stimulus here wait; end process;stim_proc2: process begin - hold reset state for 100 ns.key1 = 00;mode = 0;key2 = 10;wait for 50 ns;key1 = 01;mode = not mode;key2 = 11;wait for 50 ns;key1 = 10;mode = not mode;key2 = 00;wait for 50 ns;key1 = 11;mode = not mode;key2 = 01;wait for 50 ns;key1 = 00;mode = not mode;key2 = 10;wait for 50 ns;key1 = 00;mode = not mode;key2 = 11; - insert stimulus here wait; end process;END;仿真结果为 图5.2.2 button仿真结果由图5.2.2分析,当start_stop按键按下,然后松开之后的下一个时钟沿到来时,en_counter就取反,从而控制counter模块的计数;而每按下record_button之后,en_recordeer就会产生一个脉冲,给recorder模块一个记录的信号;其余的都是缓存作用,transfer对应mode拨动开关的输入,time_sel对应key1拨动开关的输入,recorder_sel对应key2的输入。3、 计数counter模块此模块是用来计数时间的,可输出天、时、分、秒、百分秒,可由en来开始/暂停计数。VHDL代码为:library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity counter isport(clk : in std_logic;-100hzrst_n : in std_logic;en : in std_logic;-开始/暂停计数dayten : out integer range 0 to 3;-天数十位dayge : out integer range 0 to 9;-天数个位hourten : out integer range 0 to 2;-小时十位hourge : out integer range 0 to 9;-小时个位minten :out integer range 0 to 5;-分钟十位minge :out integer range 0 to 9;-分钟个位secten :out integer range 0 to 5;-秒十位secge :out integer range 0 to 9;-秒个位msecten : out integer range 0 to 9;-为100msmsecge : out integer range 0 to 9-为10ms);end counter;architecture Behavioral of counter isbeginprocess(clk,rst_n,en)variable vdayten : integer range 0 to 3 := 3;variable vdayge : integer range 0 to 10 := 10;variable vhourten : integer range 0 to 3 := 3;variable vhourge : integer range 0 to 10 := 10;variable vminten : integer range 0 to 6 := 6;variable vminge : integer range 0 to 10 := 10;variable vsecten : integer range 0 to 6 := 6;variable vsecge : integer range 0 to 10 := 10;variable vmsecten : integer range 0 to 10 := 10;variable vmsecge : integer range 0 to 10 := 10;beginif(rst_n = 0) thenvdayten := 3;vdayge := 10;vhourten := 3;vhourge := 10;vminten := 6;vminge := 10;vsecten := 6;vsecge := 10;vmsecten := 10;vmsecge := 10;else if(en = 1) thenif(clk event and clk = 1) thenvmsecge := vmsecge - 1;if(vmsecge = 0) thenvmsecge := 10;vmsecten := vmsecten - 1;if(vmsecten = 0) thenvmsecten := 10;vsecge := vsecge - 1;if(vsecge = 0) thenvsecge := 10;vsecten := vsecten - 1;if(vsecten = 0) thenvsecten := 6;vminge := vminge - 1;if(vminge = 0) thenvminge := 10;vminten := vminten - 1;if(vminten = 0) thenvminten := 6;vhourge := vhourge - 1;if(vhourge = 0) or (vhourge = 6) and (vhourten = 1) thenvhourge := 10;vhourten := vhourten - 1;if(vhourten = 0) thenvhourten := 3;vdayge := vdayge - 1;if(vdayge = 0) thenvdayge := 10;if(vdayten = 0) thenvdayten := 3;end if;vdayten := vdayten - 1;end if;end if;end if;end if;end if;end if;end if;end if;end if;end if;end if;end if;msecge = 10 - vmse
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑幕墙设计师安全知识能力考核试卷含答案
- 中央空调系统运行操作员安全宣传水平考核试卷含答案
- 苏州托普信息职业技术学院《中国古代文学(2)》2025-2026学年第一学期期末试卷
- 中国音乐学院《课程论文写作与学术规范》2025-2026学年第一学期期末试卷
- 半固态复合调味酱建设项目运营管理方案
- 安徽科技学院《青少年体育培训》2025-2026学年第一学期期末试卷
- 加大密度板项目可行性分析报告范文(总投资5000万元)
- 2025沈阳市浑南区总工会公开招聘工会社会工作者10人备考题库含答案详解(基础题)
- 年产xxx倒立式拉丝机项目可行性分析报告
- 2025云南临沧市消防救援局招聘政府专职消防员46人备考题库含答案详解(巩固)
- 围手术期低血压的护理个案
- CT影像质量控制细则
- 金太阳广东省2025-2026学年高一上学期11月联考地理(26-80A)(含答案)
- 水利项目堤防工程单位工程验收建设管理工作报告
- 小区车位互换协议书
- 注册公司租赁协议书
- 2025年儿童保健知识试题及答案
- 国企的笔试题库及答案
- 建筑装饰设计师及团队绩效考核表
- DB23-T 727-2025 用水定额用水定额
- 民法期末考试题目及答案
评论
0/150
提交评论