基于VerilogHDL语言的课堂智能响铃系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 引言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
课堂智能响铃系统走时精度高,稳定性好,实用方便,不需要经常调教,这种响铃具有时、分、秒计数显示功能,以24小时循环计时,时钟计数显示时有LED灯的花样显示,具有调节小时、分钟及清零的功能以及整点报时功能。
1.1 课程设计目的
作为通信专业的学生,通过这次EDA方面的课程设计,可以提高我们对EDA领域
及通信电路设计领域的认识,有利于培养我们在通信电路EDA方面的设计能力。
一人一
题特别有利于锻炼我们独立分析问题和解决问题的能力。
设计过程的复杂加老师的严格要
求有益于培养我们严谨的工作作风。
本次课题是计算机组成原理的课程设计,旨在通过自
己对所需功能芯片的设计与实现来巩固以前所学的计算机硬件基础知识,同时也提高动手
实践的能力,还有为将来进行更大规模更复杂的开发积累经验。
1.2 课程设计内容
本次设计以智能打铃为主,实现时钟计数:完成时、分、秒的正确计时并且显示所
计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,
即从0到23循环计数,并且在数码管上显示数值。
以及时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过
实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
清零功能:reset为复位键,低电平时实
现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位蜂鸣器在整点时有
报时信号产生,蜂鸣器报警,产生“滴答.滴答”的报警声音。
LED灯在时钟显示时有花
样显示信号产生。
即根据进位情况,LED不停的闪烁,从而产生“花样”信号。
2 理论基础
2.1 Verilog HDL语言概述
Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言。
Verilog HDL就是在用途最广泛的C语言的基础上发展起来的一种件描述语言,1983年,Gateway Design Automation(GDA)硬件描述语言公司的Philip Moorby首创了Verilog HDL。
后来Moorby成为Verilog HDL-XL的主要设计者和Cadence公司的第一合伙人。
1984至1986年,Moorby设计出第一个关于Verilog HDL的仿真器,并提出了用于快速门级仿真的XL算法,使Verilog HDL语言得到迅速发展。
1987年Synonsys公司开始使用Verilog HDL行为语言作为综合工具的输入。
1989年Cadence公司收购了Gateway公司,Verilog HDL成为Cadence公司的私有财产。
1990年初,Cadence公司把Verilog HDL和Verilog HDL-XL分开,并公开发布了Verilog HDL。
随后成立的OVI(Open Verilog HDL International)组织负责Verilog HDL的发展并制定有关标准,OVI由Verilog HDL的使用者和CAE供应商组成。
1993年,几乎所有ASIC 厂商都开始支持Verilog HDL,并且认为Verilog HDL-XL是最好的仿真器。
同时,OVI推出2.0版本的Verilong HDL规范,IEEE则将OVI的Verilog HDL2.0作为IEEE 标准的提案。
1995年12月,IEEE制定了Verilog HDL的标准IEEE1364-1995。
目前,最新的Verilog语言版本是2000年IEEE公布的Verilog 2001标准,其大幅度地提高了系统级和可综合性能。
Verilog HDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,因而可以把Verilog HDL内容安排在与ASIC 设计等相关课程内部进行讲授,由于HDL语言本身是专门面向硬件与系统设计的,这样的安排可以使学习者同时获得设计实际电路的经验。
与之相比,VHDL的学习要困难一些。
但Verilog HDL较自由的语法,也容易造成初学者犯一些错误,这一点要注意。
Verilog HDL既是一种行为描述语言,也是一种结构描述语言。
如果按照一定
的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互连的结
构模块。
这意味着利用Verilog语言所提供的功能,就可以构造一个模块间的清晰
结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。
Verilog HDL 硬
件描述语言在电子设计自动化中扮演着重要的角色,他是EDA 技术研究的重点之一。
下面列出的是Verilog语言的主要功能:
•可描述顺序执行或并行执行的程序结构;
•用延迟表示式或事件表达式来明确地控制过程的启动时间;
•通过命名的事件来触发其他过程里的激活行为或停止行为;
•提供了条件和循环等程序结构;
•提供了可带参数且非零延续时间的任务程序结构;
•提供了可定义新的操作符的函数结构;
•提供了用于建立表达式的算术运算符、逻辑运算符和位运算符;
•提供了一套完整的表示组合逻辑基本元件的原语;
•提供了双向通路和电阻器件的描述;
•可建立MOS器件的电荷分享和衰减模型;
•可以通过构造性语句精确地建立信号模型;
2.2 MaxplusII简介
Max+plusII(或写成Maxplus2,或MP2) 是Altera公司推出的的第三代PLD开发系统(Altera第四代PLD开发系统被称为:QuartusII,主要用于设计新器件和大规模CPLD/FPGA).使用MAX+PLUSII的设计者不需精通器件内部的复杂结构。
设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,MAX+PLUSII把这些设计转自动换成最终所需的格式。
其设计速度非常快。
对于一般几千门的电路设计,使用MAX+PLUSII,从设计输入到器件编程完毕,用户拿到设计好的逻辑电路,大约只需几小时。
设计处理一般在数分钟内内完成。
特别是在原理图输入等方面,Maxplus2被公认为是最易使用,人机界面最友善的PLD开发软件,特别适合初学者使用。
通常可将Maxplus2设计流程归纳为以下7个步骤:
(1)使用文本编辑器输入设计源文件。
在传统设计中,设计人员是应用传统的原理图输入方法来开始设计的。
自90年代初,Verilog、VHDL、AHDL等硬件描述语言的输入方法在大规模设计中得到了广泛应用。
(2)前仿真(功能仿真)。
设计的电路必须在布局布线前验证电路功能是否有效。
(3)设计编译。
设计输入之后就有一个从高层次系统行为设计向门级逻辑电路设转化翻译过程,即把设计输入的某种或某几种数据格式(网表)转化为软件可识别的某种数据格式(网表)。
(4)优化。
对于上述综合生成的网表,根据布尔方程功能等效的原则,用更小更快的综合结果代替一些复杂的单元,并与指定的库映射生成新的网表,这是减小电路规模的一条必由之路。
(5)布局布线。
(6)后仿真(时序仿真)需要利用在布局布线中获得的精确参数再次验证电路的时序。
(7)生产。
布线和后仿真完成之后,就可以开始ASCI或PLD芯片的投产。
Max Plus II的设计流程可以用如下图2.1所示。
图2.1Max Plus II 设计流程
从图2.1可清晰了解到Max Plus II提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程。
他包括设计输入编辑、编译网表提取、数据库建立、逻辑综合、逻辑分割、适配、延时网表提取、编辑文件汇编以及编程下载9个步骤。
3 课堂智能响铃系统的设计方案
3.1设计思路
系统设计:根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用Verilog HDL语言设计,顶层文件用原理图的设计方法。
显示:小时采用24进制,而分钟和秒均60进制。
课堂智能响铃系统的电路组成方框图3.1所示。
图3.1 响铃系统流程图
对各模块进行连线,从而得到以下总线路图如图3.2所示。
图3.2 响铃系统总连线图
3.2分块设计与仿真
1)秒计数器
图3.3秒计数器模块
图3.4 秒表计数器仿真
波形分析:利用60进制计数器完成00到59的循环计数功能,当秒计数至59时,再来一个时钟脉冲则产生进位输出,即enmin=1;reset作为复位信号低电平有效,即高电平时正常循环计数,低电平清零。
2)分钟计数器
图3.5分钟计数器模块
图3.6分钟计数器模块仿真
波形分析:小时计数模块利用24进制计数器,通过分钟的进位信号的输入可实现从00到23的循环计数。
3)小时计数器
图3.7时钟计数器模块
图3.8时钟计数器模块仿真
波形分析:小时计数模块利用24进制计数器,通过分钟的进位信号的输入可实现从00到23的循环计数。
4)整点报时模块
图3.9整点报时模块
图3.10整点报时模块仿真
波形分析:由图知对于整点报时模块,当分钟计数至59时来一个时钟脉冲则产生一个进位信号,分钟计数到00,此时产生报警信号持续一分钟。
当有时钟脉冲时lamp显示灯就闪烁轮续点亮。
4课堂智能响铃系统设计的仿真与实现
要实现的功能:可产生秒计数,分钟计数,小时计数,整点报时四种信号,能够实现信号的转换(select)并且频率可调。
主要由三部分组成:地址指针控制模块,四种信号数据存储模块,D/A转换模块。
前面2个模块在Max+plusII中实现,该部分的实现框图如图4.1所示。
图4.1实现功能框图
4.1 响铃系统的仿真与实现
该模块的功能采用Verilog HDL来描述,程序请见附件。
该部分功能验证的波形仿真结果如图4.2所示。
图4.2课堂智能响铃系统总体仿真图
波形分析
输出信号second[6..0]表示:秒计数模块,利用60进制计数器完成00到59的循环计数功能,当秒计数至59时,再来一个时钟脉冲则产生进位输出,即enmin=1;reset 作为复位信号低电平有效,即高电平时正常循环计数,低电平清零。
输出信号min[6..0]表示:分钟计数模块,小时计数模块利用24进制计数器,通过分钟的进位信号的输入可实现从00到23的循环计数。
输出信号hour[5..]表示:小时计数模块,小时计数模块
利用24进制计数器,通过分钟的进位信号的输入可实现从00到23的循环计数。
输入信号lamp[2..0]表示:整点报时模块,当分钟计数至59时来一个时钟脉冲则产生一个进位信号,分钟计数到00,此时产生报警信号持续一分钟。
当有时钟脉冲时lamp显示灯就闪烁轮续点亮。
4.2 系统设计有待提高和改进的地方
本课程设计是基于Verilog HDL语言的课堂智能响铃系统设计。
据理来说课堂的响铃时间不应该是整点。
但由于课程设计的时间有限,本人的知识水平有限,设计的响铃系统是整点报时,这是本设计的一大缺陷。
如果能设计出专业的课堂响铃系统,响铃的时间能够根据要求做相应的调整,这也是本文最初的设计思路,那样设计就更加完美。
5 小结
本次课程设计要求编写一个基于Verilog HDL语言的课堂智能响铃系统,并用Max Plus II软件进行仿真。
根据搜索相关资料及自我理解,我本次的设计以智能打铃为主,实现时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
以及时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位蜂鸣器在整点时有报时信号产生,蜂鸣器报警,产生“滴答.滴答”的报警声音。
并且通过WORD文档将原理图画出来。
在整个电路设计完毕并仿真成功后发现,其实整个电路设计实现的功能还是比较实用和易于操作的,而自己也为此付出了许多:从根据课题要求查找相关资料,学习硬件语言,到自己能够独立编写小程序;从对Max Plus II软件的摸索,一次次修改程序,到仿真得到较满意的结果;从对截图工具的搜索下载,论文资料的搜集,到文字排版的学习。
在设计过程中遇到了很多困难,在指导老师的指引和同学的帮助下,通过不断探索学习,使问题得到了一定的解决。
通过本学期课程设计的学习,我从中学习到了很多东西,对可编程逻辑器件,Verilog HDL语言,Max Plus II软件有了一定的了解,尤其是用Verilog HDL语言编程和仿真。
在本次设计中最大的收获是在不断地发现问题,分析问题,解决问题的过程中培养了自己的科研能力,为今后的学习工作做了一个良好的铺垫。
Verilog Hdl语言设计的出现从根本上改变了以往数字电路的设计模式,使电路设计由硬件设计转变为软件设计,这样提高了设计的灵活性,降低了电路的复杂程度,修改起来也很方便。
利用Verilog Hdl设计的灵活性,根据串行通信协议的要求,可以在实验室利用先进的EDA工具,设计出符合自己实际需求的课堂智能响铃系统。
经过三周的设计制作,该设计终于如期开发完毕,其功能基本上可以满足处理的需要。
由于时间有限,本系统还有许多不尽人意的地方,需要将来做进一步的改善。
这次课程设计,以方便实际操作为基础,以理论联系实际为准则,不断完善,不断创新。
参考文献
[1] 张振荣,晋明武等.MCS-51单片机原理及实用技术[M].北京:人民邮电出版社,2000.
[2]王金明.Verilog HDL程序设计教程.北京:人民邮电出版社,2004.1.
[3] 张亦华,延明,肖冰.数字逻辑设计实验技术与EDA工具.北京:邮电大学出版社2003.1.
[4] 潘松,黄继业.EDA技术实用教程[M ].北京:科学出版社,2002.10.
[5] 江国强.EDA技术与应用[M] .北京:电子工业出版社,2004.8.
致谢
通过为期两周的课程设计,我顺利完成了基于Verilog HDL课堂智能响铃系统的设计。
在这次课程设计中,非常感谢各位老师的指导,在老师的身上学到的不仅仅是知识的层面,更重要的是老师追求知识的热情,还重要的是老师对学生的尊重和关爱,却又不失老师本身工作的严谨的态度,他的工作作风以及对生活的态度让我受益匪浅。
我在课程设计中碰到的很多个人困难,老师都能给予很大的体谅与帮助。
在设计中遇到的试验的客观条件方面,老师也给予最大力度的协助,让我有更好的设计学习环境,在这里,同时感谢在长沙理工大学计算机组成原理实验室和机房所提供的试验条件,老师对工作的那份热情对我们产生了很大的影响,让我们在遇到困难的时候敢于前进。
同样也感谢同学们的相互帮助,正是因为有了这些,我才能很好的顺利的完成我的这次课程设计。
附录:课堂智能响铃系统设计源程序清单
// 程序名称:基于Verilog HDL语言的课堂智能响铃系统设计
// 程序作者:#
// 最后修改日期:2010-12-31
1)秒计数器
module second (clk, reset, setmin, enmin, daout);
input clk;
input reset;
input setmin;
output enmin;
wire enmin;
output[6:0] daout;
wire[6:0] daout;
reg[6:0] count;
reg enmin_1; ——enmin_1为59秒时的进位信号
wire enmin_2; ——enmin_2由clk调制后的手动调分脉冲信号串
assign daout = count ;
assign enmin_2 = (setmin & clk) ; ——setmin为手动调分控制信号,高电平有效assign enmin = (enmin_1 | enmin_2) ; ——enmin为向分进位信号
always @(posedge clk or negedge reset)
begin
if (reset == 1'b0)
begin
count <= 7'b0000000 ; ——若reset为0,则异步清零
end
else
begin——否则,若clk上升沿到
if (count[3:0] == 4'b1001) ——若个位计时恰好到“1001”即9
begin
if (count < 8'h60) ——又若count小于16#60#,即60H
begin
if (count == 7'b1011001) ——又若已到59D
begin
enmin_1 <= 1'b1 ;
count <= 7'b0000000 ; ——则置进位为1及count复0
end
else——未到59D
begin
count <= count + 7 ; ——则加7,而+7=+1+6,即作“加6校正”
end
end
else ——若count不小于16#60#(即count等于或大于16#60#)
begin
count <= 7'b0000000 ; ——count复0
end
end ——END IF(count<16#60#)
else if (count < 8'h60) ——若个位计数未到“1001”则转此句再判
begin
count <= count + 1 ; ——若count<16#60#则count加1
enmin_1 <= #100 1'b0 ; ——没有发生进位
end
else ——否则,若count不小于16#60#
begin
count <= 7'b0000000 ; ——则count复0
end ——END IF(count(3 DOWNTO 0)=“1001”)
end ——END IF(reset=‘0’)
end
endmodule
2)分钟计数器
module minute (clk, clk1, reset, sethour, enhour, daout);
input clk;
input clk1;
input reset;
input sethour;
output enhour;
wire enhour;
output[6:0] daout;
wire[6:0] daout;
reg[6:0] count;
reg enhour_1; ——enmin_1为59分时的进位信号
wire enhour_2; ——enmin_2由clk调制后的手动调时脉冲信号串
assign daout = count ;
assign enhour_2 = (sethour & clk1) ; ——sethour为手动调时控制信号,高电平有效assign enhour = (enhour_1 | enhour_2) ;
always @(posedge clk or negedge reset)
begin
if (reset == 1'b0) ——若reset为0,则异步清零
begin
count <= 7'b0000000 ;
end
else ——否则,若clk上升沿到
begin
if (count[3:0] == 4'b1001) ——若个位计时恰好到“1001”即9
begin
if (count < 8'h60) ——又若count小于16#60#,即60
begin
if (count == 7'b1011001) ——又若已到59D
begin
enhour_1 <= 1'b1 ; ——则置进位为1
count <= 7'b0000000 ; ——count复0
end
else
begin
count <= count + 7 ; ——若count未到59D,则加7,即作“加6校正”
end ——使前面的16#60#的个位转变为8421BCD的容量
end
else
begin
count <= 7'b0000000 ; ——count复0(有此句,则对无效状态电路可自启动)
end ——END IF(count<16#60#)
end
else if (count < 8'h60)
begin
count <= count + 1 ; ——若count<16#60#则count加1
enhour_1 <= #100 1'b0 ; ——没有发生进位
end
else
begin
count <= 7'b0000000 ; ——否则,若count不小于16#60# count复0
end ——END IF(count(3 DOWNTO 0)=“1001”)
end ——END IF(reset=‘0’)end
endmodule
3)小时计数器
module hour (clk, reset, daout);
input clk;
input reset;
output[5:0] daout;
wire[5:0] daout;
reg[5:0] count;
assign daout = count ;
always @(posedge clk or negedge reset)
begin
if (reset == 1'b0)
begin
count <= 6'b000000 ; ——若reset=0,则异步清零
end
else ——否则,若clk上升沿到begin
if (count[3:0] == 4'b1001) ——若个位计时恰好到“1001”即9
begin
if (count < 8'h23) ——23进制
begin
count <= count + 7 ; ——若到23D则
end
else
begin
count <= 6'b000000 ; ——复0
end
end
else if (count < 8'h23) ——若未到23D,则count进1
begin
count <= count + 1 ;
end
else ——否则清零
begin
count <= 6'b000000 ;
end ——END IF(count(3 DOWNTO 0)=“1001”)end ——END IF(reset=‘0’)
end
endmodule
4)整点报时报警模块
module alert (clk, dain, speak, lamp);
input clk;
input[6:0] dain;
output speak;
reg speak;
output[2:0] lamp;
reg[2:0] lamp;
reg[1:0] count;
reg[1:0] count1;
always @(posedge clk)
begin : speaker
speak <= count1[1] ;
if (dain == 7'b0000000)
begin
if (count1 >= 2'b10)
begin
count1 <= 2'b00 ; ——count1为三进制加法计数器end
else
begin
count1 <= count1 + 1 ;
end
end
end
always @(posedge clk)
begin : lamper
if (count <= 2'b10)
begin
if (count == 2'b00)
begin
lamp <= 3'b001 ; ——循环点亮三只灯
end
else if (count == 2'b01)
begin
lamp <= 3'b010 ;
end
else if (count == 2'b10)
begin
lamp <= 3'b100 ;
end
count <= count + 1 ;
end
else
begin
count <= 2'b00 ;
end
end
endmodule
附录资料:不需要的可以自行删除
C语言编译环境中的
调试功能及常见错误提示
调试功能
1.常用健
<F10> : 激活系统菜单
<F6> : 将光标在编辑窗口和、信息窗口之间切换
<F3> : 加载<load>一个文件
<Alt>+<F5> : 查看程序运行结果
<F1> : 得到有关编辑器在线帮助
<Ctrl>+<F1> : 得到有关C语言的在线帮助
<Ctrl>+<Break> : 终止正在运行的程序
2.块操作
<Ctrl> KB: 定义块首
<Ctrl> KK: 定义块尾
<Ctrl> KV: 块移动
<Ctrl> KC: 块复制
<Ctrl> KY: 块删除
<Ctrl> KH: 取消块定义
3.查找、替换和删除操作
<Ctrl> QF: 查找字符串
<Ctrl> QA: 查找并替换字符串
Option: G(全程),B(向文件头),N(直接替换)<Ctrl> Y : 删除一行
<Ctrl> QY: 删除从光标位置到行末的所有字符
编译中的常见错误例析
(1) 警告类错误
‘XXX’declare but never used变量XXX已定义但从未用过。
‘XXX’is assigned a value which is never used变量XXX已赋值但从未用过。
Code has no effect 程序中含有没有实际作用的代码。
Non-portable pointer conversion不适当的指针转换,可能是在应该使用指针
的地方用了一个非0的数值。
Possible use of ‘XXX’before defin ition表达式中使用了未赋值的变量
Redeclaration of ‘main’一个程序文件中主函数main不止一个。
Suspicious pointer conversion可疑的指针转换。
通常是使用了基本类型不匹配的指针。
Unreachable code程序含有不能执行到的代码。
(2) 错误或致命错误
Compound statement missing } in function main程序结尾缺少括号}。
“}”expec ted;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。
Case outside of switch case不属于Switch结构,多由于switch结构中的
花括号不配对所致。
Case statement missing ‘:’switch结构中的某个case之后缺少冒号。
Constant expression required定义数组时指定的数组长度不是常量表达式。
Declaration syntax error 结构体或联合类型的定义后缺少分号。
Declaration was expected 缺少说明,通常是因为缺少分界符如逗号、分号、
右圆括号等所引起的。
Default outside switch Default部分放到了switch结构之外,一般是因为花括
号不匹配而引起的。
do statement must have while do语句中缺少相应的while部分。
Expression syntax 表达式语法错。
如表达式中含有两个连续的运算符
Extra parame ter in call ‘fun’调用函数fun时给出了多余的实参。
Function should return a value函数应该返回一个值,否则与定义时的说明类
型不匹配。
Illegal use of pointer 指针被非法引用,一般是使用了非法的指针运算。
Invalid pointer addition指针相加非法。
一个指针(地址)可以和一个整数相加,
但两个指针不能相加。
Lvalue required赋值运算的左边是不能寻址的表达式。
Misplaced else程序遇到了没有配对的else
No matching 表达式中的括号不配对。
Pointer required on left side of_>在“_>”运算的左边只能允许一个指针而不
能是一个一般的结构体变量或联合类
型的变量。
Statement missing;程序遇到了后面没有分号的语句。
Too few parameters in call 调用某个函数时实参数目不够。
Unable to open include fil e ‘XXXXXXXX.XXX’头文件找不到。
Unexpected }或:或{ 在不希望的地方使用了}或:{。
Undefined symbol ‘X’in function fun 函数fun中的变量X没有定义。
5.连接中的常见错误
主要错误类似于“undefined symbol _print in modula xxx”(print没有定义),通常是函数名书写错误。
6.运行中的常见错误
Abnormal program termination程序异常终止。
通常是由于内存使用不当所致。
Floating point error : Domain 或Divide by 0运算结果不是一个数或被0 除Null pointer assignment 对未初始化的指针赋值,程序有严重错误。
User break在运行程序时终止。
7.程序的跟踪调试
利用Run菜单可以进行程序的跟踪调试
(1)GO to Cursor (<F4>)——选择该选项使程序执行到光标所在行首先将光标移到某行(一般为可执行),选择该功能项,则程序执行到该行的前一行暂停。
此时程序处于跟踪调试状态,并有亮条显示在暂停处,此时可以查询变量或表达式的值。
(2)Trace into (<F7>)——执行一条语句或一行暂停
此时程序处于跟踪调试状态,并有亮条显示在暂停处。
该选项可跟踪到被调函数的内部。
(3)Step over (<F8>)——执行一条语句或一行暂停
此时程序处于跟踪调试状态,并有亮条显示在暂停处。
该选项将自定义函数当作一个语句执行,不跟踪到函程序的内部。
(4)Debug菜单
程序处于跟踪状态时,可使用该菜单的选项。
其主要是使用Evaluate——目的是查询或更新变量或表达式的值。
选择Evaluate功能后,系统弹出一个对话框。
该对话框包含三个选项区域:Evaluate域可以输入一个含有目前代码中(程序暂停区的作用域)正在使用的变量名、或含变量的表达式、或常量表达式。
按回车键后,在
Result域中显示变量或表达式的值。
还可以用New value域进行调试。
如果调试程序时发现Result域显示的某变量或表达式的值不正确,并能估计出该变量或表达式的值,则可以将该值输入到New value域,继
续执行程序,其目的是肯定错误发生处是否在当前位置之前。
如果输入这个
正确的值并将程序继续执行完毕而结果正确,说明在目前暂停处之前已经发
生错误而之后无错误。
(5)Break/Watch——用于设置断点和监视表达式。
选择Add Watch功能选项,系统将弹出一个菜单,在Add Watch 框中输入变量名或表达式,按回车键后,系统在屏幕底部开辟一个窗口并显
示该变量或表达式的值。
【常见错误信息语句索引】
Ambiguous operators need parentheses:不明确的运算需要用括号括起Ambiguous symbol 'xxx' :不明确的符号
Argument list syntax error:参数表语法错误
Array bounds missing ] in function main 缺少数组界限符"]"
Array bounds missing :丢失数组界限符
Array size too large :数组尺寸太大
Bad character in paramenters :参数中有不适当的字符
Bad file name format in include directive :包含命令中文件名格式不正确
Bad ifdef directive synatax :编译预处理ifdef有语法错
Bad undef directive syntax :编译预处理undef有语法错
Bit field too large :位字段太长
Call of non-function :调用未定义的函数
Call to function with no prototype :调用函数时没有函数的说明Cannot modify a const object :不允许修改常量对象
Case outside of switch :漏掉了case 语句
Case syntax error :Case 语法错误
Code has no effect :代码不可述不可能执行到
Compound statement missing{ :分程序漏掉"{"
Conflicting type modifiers :不明确的类型说明符
Constant expression required :要求常量表达式
Constant out of range in comparison :在比较中常量超出范围Conversion may lose significant digits :转换时会丢失意义的数字Conversion of near pointer not allowed :不允许转换近指针Could not find file 'xxx' :找不到XXX文件
Declaration missing ; :说明缺少";"
Declaration syntax error :说明中出现语法错误
Default outside of switch :Default 出现在switch语句之外Define directive needs an identifier :定义编译预处理需要标识符Division by zero :用零作除数
Do statement must have while :Do-while语句中缺少while部分Enum syntax error :枚举类型语法错误
Enumeration constant syntax error :枚举常数语法错误
Error directive :xxx :错误的编译预处理命令。