① EDA技术实用教程—VHDL版(第4版) pdf
《EDA技术实用教程:VHDL版》(第四版),潘松、黄继业编著,科学出版社2010年;《VHDL数字系统设计》,李欣、张海燕,科学出版社2009年。
② EDA技术实用教程的目录
第1章绪论11.1EDA技术概论11.1.1EDA技术及发展21.1.2EDA技术应用41.2PLD及FPGA/CPLD产品概述51.2.1PLD技术及发展61.2.2PLD技术分类61.2.3PLD产品可编程原理71.2.4CPLD结构与可编程原理211.2.5FPGA结构与可编程原理291.2.6FPGA/CPLD器件配置器件321.3EDA设计基础(数字系统)33小结36习题36
第2章FPGA/CPLD系统设计372.1FPGA/CPLD设计流程及常用开发工具372.1.1FPGA/CPLD设计流程372.1.2FPGA/CPLD常用开发工具382.2Quartus Ⅱ9.0软件概述382.2.1Quartus Ⅱ 9.0软件特点及支持的器件392.2.2Quartus Ⅱ 9.0软件用户界面及功能简介402.2.3Quartus Ⅱ 9.0软件设计流程462.2.4Quartus Ⅱ 9.0软件设计实例472.3ISE10.1软件概述542.3.1ISE10.1软件特点及支持的器件552.3.2ISE10.1软件用户界面及功能简介552.3.3ISE10.1软件设计实例602.4Actel Libero IDE v9.1软件概述632.4.1软件特点及支持的器件632.4.2软件用户界面及功能简介652.4.3Actel Libero IDE v9.1软件设计实例68小结72习题73
第3章VHDL基础743.1VHDL的基本元素743.1.1标识符743.1.2数据对象763.1.3数据类型803.1.4运算操作符853.2VHDL的语句基础903.2.1进程语句903.2.2信号赋值语句943.2.3顺序描述语句983.2.4并行描述语句1153.3VHDL的属性描述1243.3.1值类属性1253.3.2函数类属性1283.3.3信号类属性1313.3.4数据类型类属性1333.3.5数据范围类属性134小结135习题135
第4章VHDL程序结构1364.1VHDL基本建模结构1364.1.1行为描述1364.1.2数据流描述1374.1.3结构描述1374.2VHDL实体1394.2.1实体语句1394.2.2参数传递说明语句1394.2.3参数传递映射语句1414.2.4端口说明语句1414.2.5实体说明部分1424.3VHDL结构体1424.3.1结构体名1434.3.2结构体说明部分1434.3.3并行处理语句1434.4子程序1444.4.1过程1444.4.2函数1494.5VHDL库和程序包1544.5.1库1544.5.2程序包1554.6元件和配置1564.6.1默认连接和默认配置1564.6.2元件配置1594.6.3块的配置1614.6.4结构体配置164小结164习题165
第5章VHDL语言规范化标准及常见Warning分析1665.1编码设计1665.1.1结构化设计1665.1.2代码描述1675.1.3内部命名规则1675.1.4其他1685.2可综合代码描述规则1685.2.1概述1685.2.2复位1695.2.3时钟1725.2.4接口异步信号处理1745.2.5寄存器和锁存器1755.2.6有限状态机1775.2.7使用Case语句的多路复用1815.2.8编码器1815.2.9译码器1855.2.10计数器1885.2.11运算1885.2.12I/O1905.2.13异步设计1915.3优化设计1925.3.1标准单元实现1935.3.2复杂逻辑运算单元共享1935.3.3中间信号1935.3.4针对目标FPGA的优化1945.3.5综合工具设置优化1945.4常见Warning分析195小结196习题196
第6章NIOS软核SOPC系统设计1976.1Nios Ⅱ软核SOPC系统1976.1.1SOPC技术简介1976.1.2Nios Ⅱ软核SOPC系统结构及开发环境1986.2Nios Ⅱ指令系统1996.2.1寄存器结构1996.2.2寻址方式2016.2.3Nios Ⅱ指令集2016.2.4Nios Ⅱ定制指令2066.3SOPC硬件系统开发2116.3.1硬件开发流程及环境介绍2126.3.2创建Quartus Ⅱ工程2126.3.3生成Nios Ⅱ系统2146.3.4集成Nios Ⅱ系统到Quartus Ⅱ工程2186.3.5Quartus Ⅱ工程编译及下载2196.4SOPC软件系统开发2196.4.1软件开发流程及环境介绍2196.4.2HAL系统库2206.4.3Nios Ⅱ IDE用户应用程序建立2206.5Nios Ⅱ外围设备2236.5.1SDRAM控制器2236.5.2CFI控制器2256.5.3EPCS设备控制器2266.5.4PIO控制器2276.5.5定时器控制器2276.5.6DMA控制器2296.5.7SPI核2306.5.8UART核2306.5.9JTAGUART核2316.5.10系统ID核2326.5.11PLL核2326.5.12mutex核2336.6SOPC系统深入设计——用户定制外设2346.6.1元件开发流程2346.6.2硬件设计2356.6.3软件设计2366.6.4验证设计2366.6.5共享元件237小结237习题237
第7章Altera的IP核工具2387.1基本概念2387.1.1IP核的概念2387.1.2Altera可提供的IP核2397.2Altera基本宏功能设计实现2417.2.1基本宏功能定制2417.2.2基本宏功能实现2447.2.3设计实例2477.3Altera IP核设计实现2507.3.1IP核定制2517.3.2IP核实现2537.3.3设计实例254小结255习题255
第8章Quartus Ⅱ 9.0软件功能及常用辅助设计工具2568.1I/O分配验证2568.1.1I/O分配验证简介2578.1.2I/O分配验证运行2608.2功率分析2628.2.1Excel-based功率计算器2638.2.2Simulation-based功率估算2668.3原理图观察工具2668.3.1RTL阅读器2678.3.2技术映射查看器2738.4SignalProbe及SignalTap Ⅱ逻辑分析器2748.4.1SignalProbe2748.4.2SignalTap Ⅱ逻辑分析器2778.5时序收敛平面布局规划器和器件规划图2838.5.1概述2848.5.2设计流程2858.6Quartus Ⅱ 9.0支持的第三方工具2938.6.1NativeLink与WYSIWYG2938.6.2Modelsim仿真工具2958.6.3Synplify/Sinplify Pro综合工具310小结315习题315
参考文献316
③ 数字钟设计 用VHDL语言实现 你怎么做的
源代码如下自己把各个模块打好包下面有个图自己看看
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTZKZQIS
PORT(KEY:INSTD_LOGIC_VECTOR(1DOWNTO0);--按键信号
CLK_KEY:INSTD_LOGIC;--键盘扫描信号
MAX_DAYS:INSTD_LOGIC_VECTOR(4DOWNTO0);--本月最大天数
SEC_EN,MIN_EN,HOUR_EN,DAY_EN,MON_EN,YEAR_EN,WEEK_EN:OUTSTD_LOGIC;--异步并行置位使能
HOUR_CUR:INSTD_LOGIC_VECTOR(4DOWNTO0);
MIN_CUR,SEC_CUR:INSTD_LOGIC_VECTOR(5DOWNTO0);
YEAR_CUR:INSTD_LOGIC_VECTOR(6DOWNTO0);
MON_CUR:INSTD_LOGIC_VECTOR(3DOWNTO0);
DAY_CUR:INSTD_LOGIC_VECTOR(4DOWNTO0);
WEEK_CUR:INSTD_LOGIC_VECTOR(2DOWNTO0);
SEC,MIN:BUFFERSTD_LOGIC_VECTOR(5DOWNTO0);
HOUR:BUFFERSTD_LOGIC_VECTOR(4DOWNTO0);
DAY:BUFFERSTD_LOGIC_VECTOR(4DOWNTO0);
MON:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0);
YEAR:BUFFERSTD_LOGIC_VECTOR(6DOWNTO0);
WEEK:BUFFERSTD_LOGIC_VECTOR(2DOWNTO0));
ENDENTITYTZKZQ;
ARCHITECTUREARTOFTZKZQIS
TYPESTATETYPEIS(NORMAL,SEC_SET,MIN_SET,HOUR_SET,DAY_SET,MON_SET,
YEAR_SET,WEEK_SET);
SIGNALMODE:STATETYPE;
BEGIN
PROCESS(KEY,CLK_KEY)
BEGIN
IFCLK_KEY'EVENTANDCLK_KEY='1'THEN
IFKEY="01"THEN
SEC_EN<='1';MIN_EN<='1';HOUR_EN<='1';
DAY_EN<='1';MON_EN<='1';YEAR_EN<='1';
WEEK_EN<='1';
CASEMODEIS
WHENNORMAL=>MODE<=SEC_SET;SEC<=SEC_CUR;SEC_EN<='0';
WHENSEC_SET=>MODE<=MIN_SET;MIN<=MIN_CUR;SEC_EN<='1';MIN_EN<='0';
WHENMIN_SET=>MODE<=HOUR_SET;HOUR<=HOUR_CUR;MIN_EN<='1';HOUR_EN<='0';
WHENHOUR_SET=>MODE<=DAY_SET;DAY<=DAY_CUR;HOUR_EN<='1';DAY_EN<='0';
WHENDAY_SET=>MODE<=MON_SET;MON<=MON_CUR;DAY_EN<='1';MON_EN<='0';
WHENMON_SET=>MODE<=YEAR_SET;YEAR<=YEAR_CUR;MON_EN<='1';
YEAR_EN<='0';
WHENYEAR_SET=>MODE<=WEEK_SET;WEEK<=WEEK_CUR;YEAR_EN<='1';WEEK_EN<='0';
WHENWEEK_SET=>MODE<=NORMAL;
ENDCASE;
ELSIFKEY="10"THEN--如果按下调整键,则自加
CASEMODEIS
WHENSEC_SET=>SEC_EN<='0';
--异步并行置位使能有效
IFSEC="111011"THENSEC<="000000";
--如果秒计数到59,返回到0重新计数
ELSESEC<=SEC+1;--否则继续计数
ENDIF;
WHENMIN_SET=>MIN_EN<='0';
IFMIN="111011"THENMIN<="000000";
ELSEMIN<=MIN+1;
ENDIF;
WHENHOUR_SET=>HOUR_EN<='0';
IFHOUR="11000"THENHOUR<="00000";
ELSEHOUR<=HOUR+1;
ENDIF;
WHENDAY_SET=>DAY_EN<='0';
IFDAY=MAX_DAYSTHENDAY<="00001";
ELSEDAY<=DAY+1;
ENDIF;
WHENWEEK_SET=>WEEK_EN<='0';
IFWEEK="111"THENWEEK<="001";
ELSEWEEK<=WEEK+1;
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT60IS
PORT(LD:INSTD_LOGIC;
CLK:INSTD_LOGIC;
DATA:INSTD_LOGIC_VECTOR(5DOWNTO0);
NUM:BUFFERSTD_LOGIC_VECTOR(5DOWNTO0);
CO:OUTSTD_LOGIC);
ENDENTITYCNT60;
ARCHITECTUREARTOFCNT60IS
BEGIN
PROCESS(CLK,LD)IS
BEGIN
IF(LD='0')THEN
NUM<=DATA;
ELSIFCLK'EVENTANDCLK='1'THEN
IFNUM="111011"THEN--59
NUM<="000000";CO<='1';
ELSE
NUM<=NUM+1;CO<='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT60IS
PORT(LD:INSTD_LOGIC;
CLK:INSTD_LOGIC;
DATA:INSTD_LOGIC_VECTOR(5DOWNTO0);
NUM:BUFFERSTD_LOGIC_VECTOR(5DOWNTO0);
CO:OUTSTD_LOGIC);
ENDENTITYCNT60;
ARCHITECTUREARTOFCNT60IS
BEGIN
PROCESS(CLK,LD)IS
BEGIN
IF(LD='0')THEN
NUM<=DATA;
ELSIFCLK'EVENTANDCLK='1'THEN
IFNUM="111011"THEN--59
NUM<="000000";CO<='1';
ELSE
NUM<=NUM+1;CO<='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT24IS
PORT(LD:INSTD_LOGIC;
CLK:INSTD_LOGIC;
DATA:INSTD_LOGIC_VECTOR(4DOWNTO0);
NUM:BUFFERSTD_LOGIC_VECTOR(4DOWNTO0);
CO:OUTSTD_LOGIC);
ENDENTITYCNT24;
ARCHITECTUREARTOFCNT24IS
BEGIN
PROCESS(CLK,LD)IS
BEGIN
IF(LD='0')THEN
NUM<=DATA;
ELSIFCLK'EVENTANDCLK='1'THEN
IFNUM="11000"THEN--24
NUM<="00000";CO<='1';
ELSE
NUM<=NUM+1;CO<='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT30IS
PORT(LD:INSTD_LOGIC;
CLK:INSTD_LOGIC;
NIAN:INSTD_LOGIC_VECTOR(6DOWNTO0);
YUE:INSTD_LOGIC_VECTOR(3DOWNTO0);
DATA:INSTD_LOGIC_VECTOR(4DOWNTO0);
NUM:BUFFERSTD_LOGIC_VECTOR(4DOWNTO0);
MAX_DAYS:OUTSTD_LOGIC_VECTOR(4DOWNTO0);
CO:OUTSTD_LOGIC);
ENDENTITYCNT30;
ARCHITECTUREARTOFCNT30IS
SIGNALTOTAL_DAYS:STD_LOGIC_VECTOR(4DOWNTO0);
BEGIN
PROCESS(CLK,LD)IS
VARIABLEIS_RUNNIAN:STD_LOGIC;
BEGIN
CASENIANIS
WHEN"0000000"=>IS_RUNNIAN:='1';--0
WHEN"0000100"=>IS_RUNNIAN:='1';--4
WHEN"0001000"=>IS_RUNNIAN:='1';--8
WHEN"0001100"=>IS_RUNNIAN:='1';--12
WHEN"0010000"=>IS_RUNNIAN:='1';--16
WHEN"0010100"=>IS_RUNNIAN:='1';--20
WHEN"0011000"=>IS_RUNNIAN:='1';--24
WHEN"0011100"=>IS_RUNNIAN:='1';--28
WHEN"0100000"=>IS_RUNNIAN:='1';--32
WHEN"0100100"=>IS_RUNNIAN:='1';--36
WHEN"0101000"=>IS_RUNNIAN:='1';--40
WHEN"0101100"=>IS_RUNNIAN:='1';--44
WHEN"0110000"=>IS_RUNNIAN:='1';--48
WHEN"0110100"=>IS_RUNNIAN:='1';--52
WHEN"0111000"=>IS_RUNNIAN:='1';--56
WHEN"0111100"=>IS_RUNNIAN:='1';--60
WHEN"1000000"=>IS_RUNNIAN:='1';--64
WHEN"1000100"=>IS_RUNNIAN:='1';--68
WHEN"1001000"=>IS_RUNNIAN:='1';--72
WHEN"1001100"=>IS_RUNNIAN:='1';--76
WHEN"1010000"=>IS_RUNNIAN:='1';--80
WHEN"1010100"=>IS_RUNNIAN:='1';--84
WHEN"1011000"=>IS_RUNNIAN:='1';--88
WHEN"1011100"=>IS_RUNNIAN:='1';--92
WHEN"1100000"=>IS_RUNNIAN:='1';--96
WHENOTHERS=>IS_RUNNIAN:='0';
ENDCASE;
CASEYUEIS
WHEN"0001"=>TOTAL_DAYS<="11111";--1
WHEN"0011"=>TOTAL_DAYS<="11111";--3
WHEN"0101"=>TOTAL_DAYS<="11111";--5
WHEN"0111"=>TOTAL_DAYS<="11111";--7
WHEN"1000"=>TOTAL_DAYS<="11111";--8
WHEN"1010"=>TOTAL_DAYS<="11111";--10
WHEN"1100"=>TOTAL_DAYS<="11111";--12
WHEN"0100"=>TOTAL_DAYS<="11110";--4
WHEN"0110"=>TOTAL_DAYS<="11110";--6
WHEN"1001"=>TOTAL_DAYS<="11110";--9
WHEN"1011"=>TOTAL_DAYS<="11110";--11
WHEN"0010"=>
IF(IS_RUNNIAN='1')THEN
TOTAL_DAYS<="11101";
ELSE
TOTAL_DAYS<="11100";
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
IF(LD='0')THEN
NUM<=DATA;
ELSIFCLK'EVENTANDCLK='1'THEN
MAX_DAYS<=TOTAL_DAYS;
IFNUM=TOTAL_DAYSTHEN--99
NUM<="00001";CO<='1';
ELSE
NUM<=NUM+1;CO<='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT7IS
PORT(LD:INSTD_LOGIC;
CLK:INSTD_LOGIC;
DATA:INSTD_LOGIC_VECTOR(2DOWNTO0);
NUM:BUFFERSTD_LOGIC_VECTOR(2DOWNTO0));
ENDENTITYCNT7;
ARCHITECTUREARTOFCNT7IS
BEGIN
PROCESS(CLK,LD)IS
BEGIN
IF(LD='0')THEN
NUM<=DATA;
ELSIFCLK'EVENTANDCLK='1'THEN
IFNUM="111"THEN--7
NUM<="000";
ELSE
NUM<=NUM+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT12IS
PORT(LD:INSTD_LOGIC;
CLK:INSTD_LOGIC;
DATA:INSTD_LOGIC_VECTOR(3DOWNTO0);
NUM:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0);
CO:OUTSTD_LOGIC);
ENDENTITYCNT12;
ARCHITECTUREARTOFCNT12IS
BEGIN
PROCESS(CLK,LD)IS
BEGIN
IF(LD='0')THEN
NUM<=DATA;
ELSIFCLK'EVENTANDCLK='1'THEN
IFNUM="1100"THEN--12
NUM<="0000";CO<='1';
ELSE
NUM<=NUM+1;CO<='0';
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT99IS
PORT(LD:INSTD_LOGIC;
CLK:INSTD_LOGIC;
DATA:INSTD_LOGIC_VECTOR(6DOWNTO0);
NUM:BUFFERSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYCNT99;
ARCHITECTUREARTOFCNT99IS
BEGIN
PROCESS(CLK,LD)IS
BEGIN
IF(LD='0')THEN
NUM<=DATA;
ELSIFCLK'EVENTANDCLK='1'THEN
IFNUM="1100011"THEN--12
NUM<="0000000";
ELSE
NUM<=NUM+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
④ VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦
课程设计任务书
课程设计名称 EDA课程设计 学生姓名 专业班级
设计题目 多功能数字钟设计
一、 课程设计目的
1、综合运用EDA技术,独立完成一个课题的设计,考察运用所学知识,解决实际问题的能力;
2、结合理论知识,考察阅读参考资料、文献、手册的能力;
3、进一步熟悉EDA技术的开发流程,掌握文件编辑、编译、仿真、下载验证等环节的实现方法和应用技巧;
4、锻炼撰写研究报告、研究论文的能力;
5、通过本实践环节,培养科学和严谨的工作作风。
二、 设计内容、技术条件和要求
l、能进行正常的时、分、秒计时功能,分别由6个数码显示24小时、60分钟的计数器显示。
2、能利用实验系统上的按钮实现“校时”、“校分”功能;
(1)按下“SA”键时,计时器迅速递增,并按24小时循环;
(2)按下“SB”键时,计时器迅速递增,并按59分钟循环,并向“时”进位;
(3)按下“SC”键时,秒清零;抖动的,必须对其消抖处理。
3、能利用扬声器做整点报时:
(1)当计时到达59’50”时开始报时,频率可为500Hz;计满23小时后回零;计满59分钟后回零。(2)到达59’59”时为最后一声整点报时,整点报时的频率可定为lKHz。
4定时闹钟功能
5、用层次化设计方法设计该电路,用硬件描述语言编写各个功能模块。
6、报时功能。报时功能用功能仿真的仿真验证,可通过观察有关波形确认电路设计是否正确。
三、 时间进度安排
1周:(1) 完成设计准备,确定实施方案;(2) 完成电路文件的输入和编译;(4) 完成功能仿真。
2周:(1) 完成文件至器件的下载,并进行硬件验证;(2) 撰写设计说明书。
四、 主要参考文献
(1)谭会生、瞿遂春,《EDA技术综合应用实例与分析》,西安电子科技大学出版社,2004
(2)曹昕燕、周凤臣等,《EDA技术实验与课程设计》,清华大学出版社,2006
指导教师签字: 2011年9月19日
一、实验原理 :
用层次化设计的方法以VHDL语言编程实现以下功能:
【1】 具有“时”、“分”、“秒”计时功能;时为24进制,分和秒都为60进制。
【2】 具有消抖功能:手工按下键盘到是否这个过程大概50ms左右,在按下开始到弹簧片稳,定接触这段时间为5-10ms,从释放到弹片完全分开也是5-10ms,在达到稳定接触和完全分开的微观过程中,电平是时高时低的,因此如果在首次检测到键盘按下时延时10ms再检测就不会检测到抖动的毛刺电平了。64Hz的信号周期为15.6ms,正适合做消抖信号。
【3】 具有校时和清零功能,能够用4Hz脉冲对“小时”和“分”进行调整,并可进行秒零;
【4】 具有整点报时功能。在59分51秒、53秒、55秒、57秒发出低音512Hz信号,在59分59秒发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。
【5】 具有一键设定闹铃及正常计时与闹铃时间的显示转换。闹时时间为一分钟。
二、程序流程:
1、秒计数器模块设计:
模块图如图1。六十进制带进位计数器,可清零,clk输入信号为1Hz脉冲,当q0计满9后q1增加1,当q0满9且q1记满5,q1、q0同时归零,co输出为高电平。q1为十位q0为个位。
图1
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity c60 is
Port ( clk,clr : in std_logic;
co :out std_logic;
q1,q0 : out std_logic_vector(3 downto 0));
end c60;
architecture one of c60 is
begin
process (clk,clr)
variable cq1,cq0:std_logic_vector(3 downto 0);
begin
if clr='1' then cq1:=(others=>'0');cq0:=(others=>'0');
elsif (clk'event and clk='1') then
if cq0<9 then cq0:=cq0 +1;co<='0';
elsif cq1<5 then cq1:=cq1+1;cq0:=(others=>'0');
elsif cq1=5 and cq0=9
then co<='1';cq1:=(others=>'0'); cq0:=(others=>'0');
else co<='0';
end if;
end if;
q1<=cq1;
q0<=cq0;
end process;
end one;
仿真结果如下图2
2、分计数器同上。注:不同之处为分的clk输入信号为秒的进位信号。
3、时计数器:
模块图如图3。24进制无进位计数器,当计数信号计到23后再检测到计数信号时会自动零。带清零,clk输入为分秒进位相与的结果。q1为十位,q0为个位。
图3
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity c24 is
Port ( clk : in std_logic;
q1,q0 : out std_logic_vector(3 downto 0));
end c24;
architecture one of c24 is
begin
process (clk)
variable cq1,cq0:std_logic_vector(3 downto 0);
begin
if (clk'event and clk='1') then
if cq1="0010" and cq0="1001" then
cq1:="0000"; cq0:="0000";
elsif cq0<"1001" then
cq0:=cq0+1;
else cq0:="0000"; cq1:=cq1+1;
end if;
end if;
q1<=cq1;q0<=cq0;
end process;
end one;
仿真波形如下图4:
图4
4、分频器:
模块图如图5。由四个分频器构成,输入信号in_clk为1024Hz脉冲信号。把输入的1024Hz信号分频为四个脉冲信号,即1Hz的秒脉冲,4Hz的校时、校分脉冲,64Hz的消抖脉冲以及512Hz的蜂鸣器低音输入。
图5
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity div is
Port ( in_clk : in std_logic;
clk_512, clk_1,clk_4 ,clk_64:out std_logic);
end div;
architecture one of div is
signal q512,a,b,c:std_logic;
signal c1,c4,c64:integer range 512 downto 0;
begin
process(in_clk)
begin
if in_clk'event and in_clk='1' then
q512<=not q512;
if c64>=7 then c64<=0;c<=not c;else c64<=c64+1;end if;
if c4>=127 then c4<=0;b<=not b;else c4<=c4+1;end if;
if c1>=511 then c1<=0;a<=not a;else c1<=c1+1;end if;
end if;
end process;
clk_512<=q512;
clk_1<=a;
clk_4<=b;
clk_64<=c;
end one;
仿真波形如下图6:
图6
5、消抖:
模块图如图7。分频出的用64Hz信号对sa校时信号、sb校分信号、sc秒清零信号、sd闹时设置信号进行防抖动处理。是由四个两级d触发器构成的,分别对输入的sa、sb、sc、sd
信号的相邻两个上升沿进行比较以确定按键的按下,从而达到消抖的目的。
图7
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity xd is
Port ( clk_64 : in std_logic;
hj,mj,sclr,sdo :out std_logic;
sa,sb,sc,sd : in std_logic);
end xd;
architecture one of xd is
begin
process(clk_64)
variable sa_n,sa_p,sb_n,sd_n,sb_p,sc_n,sc_p,sd_p:std_logic;
begin
if clk_64'event and clk_64='1' then
sa_p:=sa_n;sa_n:=sa;
sb_p:=sb_n;sb_n:=sb;
sc_p:=sc_n;sc_n:=sc;
sd_p:=sd_n;sd_n:=sd;
if sa_p= sa_n then hj<=sa;end if;
if sb_p= sb_n then mj<=sb;end if;
if sc_p= sc_n then sclr<=sc;end if;
if sd_p= sd_n then sdo<=sd;end if;
end if;
end process;
end one;
仿真波形如下图8:
图8
6、闹钟时间的设定:
模块图如图9。一键设定闹铃时间,内部由四个d触发器构成。当确定sd键按下时,将当前时间的小时和分的个位十位分别存入四个d触发器内,作为闹时时间。
图9
程序如下
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity df4 is
Port ( sd :in std_logic;
hh,hl,mh,ml : in std_logic_vector(3 downto 0);
hh_o,hl_o,mh_o,ml_o: out std_logic_vector(3 downto 0));
end df4;
architecture one of df4 is
begin
process (sd,hh,hl,mh,ml)
begin
if sd='1' then
hh_o<=hh;hl_o<=hl;mh_o<=mh;ml_o<=ml;end if;
end process;
end one;
仿真波形如下图10:
图10
7、二选一电路
(1)一位二选一:
模块图如图11。用以进行正常计时和校时/分的选择。alarm为经过消抖的校时/分信号。当按键未曾按下时,即校时/分信号没有到来时,二选一选择器会选择输出a(正常计时输入)信号,否则当alarm按键按下时输出y为校时/分输入信号——4Hz。
图11
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity xuan21 is
Port ( alarm,a,b: in std_logic;
y:out std_logic);
end xuan21 ;
architecture one of xuan21 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
仿真波形如下图12:
图12
(2)三位二选一:
模块图如图13。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。当alarm按键未曾按下时二选一选择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。
图13
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity x213 is
Port ( alarm : in std_logic;
y:out std_logic_vector(3 downto 0);
a,b: in std_logic_vector(3 downto 0));
end x213;
architecture one of x213 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
仿真结果如下图14:
图14
8、整点报时及闹时:
模块图如图15。在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。闹时时间为一分钟。
图15
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity voice is
Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);
in_1000,in_500:in std_logic;
q : out std_logic);
end voice;
architecture one of voice is
begin
process(min1,min0,sec1,sec0)
begin
if min1="0101" and min0="1001" and sec1="0101" then
if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"
then q<=in_500;
elsif sec1="0101" and sec0="1001" then q<=in_1000;
else q<='0';
end if;
else q<='0';
end if;
if min1=mh and min0=ml and hou1=hh and huo0=hl then
q<=in_1000;
end if;
end process;
end one;
仿真波形如下图16
图16
9、顶层原理图:
三、感想
通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示
:在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
四、参考资料:
1、潘松,王国栋,VHDL实用教程〔M〕.成都:电子科技大学出版社,2000.(1)
2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,2004
3、李衍编著,EDA技术入门与提高王行西安:西安电子科技大学出版社,2005
4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,2004
5、沈明山编著,EDA技术及可编程器件应用实训北京:科学出版社,2004
6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,1997
7、辛春艳编著,VHDL硬件描述语言北京:国防工业出版社,2002