四则运算小计算器设计过程实录-Verilog FPGA数字系统设计入门学习日记
本书以日记的形式记录了一个可实现四则运算计算器的设计过程,从而达到学习FPGA 设计的目的.全书共10章,讲述了从设计开始到完成的全过程,其中包括数码管显示、键盘扫描、状态
机等基础模块的设计,以及设计中需要注意的问题等,每一章的最后还有夏宇闻老师对本章内容的点评及给读者的学习建议.希望读者按顺序阅读本书,同时进行实践操作,并与书中的进度保持一致,最终完成整个设计.读者也可以根据自己的想法来实现想要的功能,做到举一反三,以达到好的学习效果.书中使用的硬件为至芯科技的四代开发板、AlteraCycloneIV的芯片,软件为uartusII13.0sp1.
本书可作为电子工程类、自动控制类、计算机类的大学本科高年级学生及研究生设计实验参考用书,亦可供其他工程人员自学与参考.
在仔细阅读这本书之前,请读者务必先看这本书的目录。看到它的与众不同了吗?
《四则运算小计算器设计过程实录——Verilog FPGA数字系统设计入门学习日记》一书*神奇的地方就在于它记录的完全是作者赵然的学习体会,书中没有华丽的辞藻,没有过多的修饰,有的是完全的、毫无保留的探索过程中的经验分享。四则运算小计算器的设计不是什么大型设计,但读者们透过这个设计,可以掌握FPGA系统设计的精髓,它虽然只是“一块砖”,但哪座大厦不是由一块块平淡无奇的“砖”盖起来的呢?
如果您想10天就跨入FPGA系统设计的大门,这本书可以带您实现理想。准备好您的板子,跟着赵然和夏宇闻教授的讲解,动手吧!
我大学本科学的是测控专业,2012年考取首都师范大学物理系研究生.我从未学习过数字电路设计,对FPGA 和Verilog语言没有任何概念,更没有设计数字电路系统的基础和经验,也从未自己动手装配和完成过一台能实际运行的电子系统.但我从小就对电子设计有浓厚的兴趣.为什么小小的计算器按几下就能完成非常复杂的数学计算,一直困惑着我,激起我年轻的好奇心.大学四年里,虽然学习过“数字电路”和“模拟电路”课程,考试成绩也很不错,但对我而言,计算器是如何设计的,仍旧是一头雾水.
听同学们说,如果掌握了FPGA 设计,这个谜就能找到答案.我用关键字“FPGGA 培训”在百度搜索,发现一个公司正在开设FPGA 就业培训(100天)班,也知道这个班由北京航空航天大学的夏宇闻教授亲自讲授和管理.于是下定决心抽出3个月时间,认真学习一下FPGA.经过100天的学习和练习,我初步掌握了如何用FPGGA芯片设计和搭建复杂数字系统.现在我有充分的信心,只要设计需求明确,我完全有能力独立设计并完成一个较复杂的数字系统,并能可靠地完成预先设定的数据处理任务.这个阶段的学习给了我很多启发,也增强了我的信心,很想把自己的感受和学习心得编写成小册子与大家分享.我的想法得到夏宇闻教授的支持.于是我把学习期间的心路历程和学到的知识、经验略加整理,以日记的形式写出来,与大家分享,希望能给打算学习Verilog和FPGA 设计的初学者一些帮助和启发,起到抛砖引玉的作用.
本书内容及阅读建议
全书共10章,每一章记录的都是一个模块的设计或者改进过程,包括数码管显示、键盘扫描、状态机等简单的模块.全书是按照整个设计流程的顺序编排的,各个章节的内容及工作量大致相同,所以读者也最好顺序阅读此书,在完成上一章内容的基础上进行下一章节的工作,跟随书中的进度循序渐进,边做边学,最终完成整个设计,从中获取知识.
读者对象
希望通过实践来学习FPGA 设计的初学者.高等院校通信工程、电子工程、计算机、微电子与半导体等专业的老师和学生.
致老师和学生
实践是检验真理的唯一标准.本书完整地记录了一次FPGA 的小实验,该实验工作量小,内容基础,适合作为高等院校电子设计的实验教材.学生通过自学此书,可完成书上的实验.相信期间会不断地遇到问题,但在解决问题的过程中一定会积累很多的设计经验,同时对FPGA 设计的基本知识和设计流程会有更深的理解.
致谢
这本书的完成并不是我一个人的劳动成果,夏宇闻老师从始至终给予我莫大的帮助.夏老师已年过七旬,仍心系国内电子设计技术的发展并倾情培养下一代优秀人才,花费大量时间和精力在这本书上,不断地帮忙校对和修改本书,同时在每章的最后给FPGA 的初学者提出了宝贵的学习建议,特在此向默默奉献和付出的夏宇闻老师表示深深的敬意和感谢!
同时还要感谢我读研究生时的导师张存林教授以及赵源萌老师对我这次培训学习的大力支持,感谢实验室的邓朝、段国腾、辛涛、梁美彦、张镜水、刘婧、李晨毓、武阿妮、张磊巍、韩雪、寇宽、王洪昌等人不遗余力地给予我大量帮助,感谢201404期FPGGA就业培训班的老师和同学们的相伴,当然也要感谢父母对我这个小作者的肯定.感谢北京航空航天大学的编辑们对本书的付出.感谢所有帮助过我的朋友们.由于时间和学识原因,书中错误在所难免,不当之处,恳请读者指正。
赵 然
2015.8.20
2014年3月,首都师范大学物理系硕士研究生赵然同学报名参加了由我执教的FPGA设计就业培训班。在培训班上,他仔细聆听老师的讲解,积极提问、思考,按照老师建议的进度要求,认真设计并验证每个小模块,并逐步把它们整合成可以在FPGA上运行的实际电路结构,终于在十天内用纯数字逻辑电路在培训班提供的小开发板上实现了一台能做4位整数加、减、乘、除运算的计算器。这台计算器的实现过程是他学习Verilog数字系统设计第一阶段的全过程。
在我的鼓励和帮助下,赵然花了半年时间把他的学习日记整理成一本值得一读的小册子。我读后认为本书对于想学习Verilog数字设计、有志进入FPGA和集成电路设计行业的年轻人定会有很大的帮助,所以郑重地推荐给每一位想掌握Verilog数字系统设计的同学。
以后我们还将继续整理其他同学的学习日记,把在培训班学习期间由学员们独立完成的其他小项目设计的全过程和分阶段代码陆续介绍给各位读者。这些小册子将按照完成的先后顺序出版,希望它们能成为理工类学生自学Verilog数字设计、参加课程设计和毕业设计时的最好参考资料。同学们只要购买一块开发板,利用暑假、寒假、课设或毕设时间段,按这些小册子中介绍的步骤,走一遍设计的全过程,认真思考作者提出的每个问题,通过自己动脑又动手,来解决这些问题,就能真正掌握这门技术。这一过程对想进入高技术数字系统设计行业的同学是十分必要的。
赵然同学在本书中用日记的形式详细记录了每天的学习过程。在日记中,他用生动的文字记录了老师布置的设计要求、进度和讲解、学习中遇到的困惑、解决问题的方法和过程、模块代码的演化过程以及每天的喜怒哀乐,真实地反映了一位聪明、勤奋、好学的年轻人在学习复杂数字系统的艰难过程中的思想历程。本书不但是一本数字系统设计入门书籍,也是年轻人励志的优秀书籍。
在我看来,赵然的FPGA设计学习日记充分体现了“实践是最好的老师”的真理。学习Verilog数字设计没有捷径可走,在掌握了基本方法后,唯有不怕困难勇于攀登,才能逐步达到别人不敢逾越的高峰。
我们贫穷多难的祖国经过三十多年的改革开放,国民经济已有了很大的发展,但高科技产业仍非常落后,特别在集成电路工业和尖端国防工业方面更是如此。阻挡我国进入世界技术强国的主要障碍之一就是数字系统设计技术的落后。望有志改变我国技术落后面貌的年轻人通过阅读这本小册子,刻苦努力自学,加入日益壮大的数字系统设计师队伍,为振兴祖国的高技术产业贡献一份力量。
本书语言通俗易懂,从实用的角度详细介绍了设计过程的每个细节。最难能可贵的是作者的分享精神,通过简单明了的描述,我能体会到作者想与读者交流、分享的真诚愿望。相信各位读者通过认真阅读本书,认真上机操作,FPGA设计能力会更上一层楼。
当然,任何人都不可能只读一本小册子就完全掌握利用Verilog HDL的FPGA设计,但是我可以肯定地说,即将逐步推出的《Verilog FPGA数字系统设计自学丛书》确实是每个想进一步学习Verilog数字设计,并希望进入数字设计行业的年轻人的最好选择。本书针对的读者群是已有Verilog基础知识的学生,以及想进入数字系统设计领域的年轻电子工程师们。相信本书和以后将陆续出版的系列丛书定会受到更多读者的喜爱。
夏宇闻
北京航空航天大学退休教授
2015年9月10日
赵然,首都师范大学光学工程硕士,曾在夏宇闻老师指导下学习Verilog数字系统设计三个月,美国国家仪器(NI)认证CLAD工程师。擅长数字逻辑设计,现任中国科学院计算技术研究所(ICT)工程师,从事FPGA开发工作。
第1章 第一天———数码管显示模块的设计………………………………………… 1
1.1 设计需求讲解………………………………………………………………… 1
1.2 七段式数码管显示原理讲解………………………………………………… 2
1.3 设计工具使用讲解…………………………………………………………… 4
1.3.1 QuartusII工具的配置………………………………………………… 4
1.3.2 数码管显示模块的可综合代码………………………………………… 6
1.3.3 显示模块的测试………………………………………………………… 8
1.3.4 转到ModelSim 仿真工具进行测试…………………………………… 11
1.3.5 下载程序到开发板进行调试…………………………………………… 13
1.4 今天工作总结………………………………………………………………… 19
1.5 夏老师评述…………………………………………………………………… 19
第2章 第二天———键盘扫描模块的设计………………………………………… 21
2.1 设计需求讲解………………………………………………………………… 21
2.2 七段式数码管显示原理讲解………………………………………………… 22
2.3 设计工具使用讲解…………………………………………………………… 23
2.3.1 矩阵键盘码扫描分析模块的可综合代码……………………………… 24
2.3.2 矩阵键盘码扫描分析模块代码解析…………………………………… 29
2.3.3 矩阵键盘扫描分析模块的测试………………………………………… 35
2.3.4 转到ModelSim 仿真工具进行测试…………………………………… 42
2.3.5 下载程序到开发板进行调试…………………………………………… 42
2.4 今天工作总结………………………………………………………………… 46
2.5 夏老师评述…………………………………………………………………… 47
第3章 第三天———输入状态机模块的设计……………………………………… 48
3.1 设计需求讲解………………………………………………………………… 48
3.2 我对状态机概念的理解……………………………………………………… 48
3.3 设计工具使用讲解…………………………………………………………… 49
3.3.1 范例代码解析…………………………………………………………… 49
3.3.2 重写状态机代码………………………………………………………… 61
3.3.3 转到ModelSim 仿真工具进行测试…………………………………… 67
3.3.4 下载程序到开发板进行调试…………………………………………… 67
3.4 今天工作总结………………………………………………………………… 71
3.5 夏老师评述…………………………………………………………………… 72
第4章 第四天———BCD 码与二进制码转换模块的设计………………………… 73
4.1 设计需求讲解………………………………………………………………… 73
4.2 BCD码转二进制码………………………………………………………… 74
4.2.1 BCD码转二进制码的可综合代码…………………………………… 74
4.2.2 BCD码转二进制码模块的测试代码………………………………… 75
4.2.3 转到ModelSim 仿真工具进行测试…………………………………… 76
4.2.4 二进制码转BCD码的可综合代码…………………………………… 76
4.2.5 二进制码转BCD码模块的测试……………………………………… 80
4.2.6 转到ModelSim 仿真工具进行测试…………………………………… 82
4.3 今天工作总结………………………………………………………………… 83
4.4 夏老师评述…………………………………………………………………… 83
第5章 第五天———计算模块的设计……………………………………………… 84
5.1 设计需求讲解………………………………………………………………… 84
5.2 设计工具使用讲解…………………………………………………………… 84
5.2.1 计算模块的可综合代码………………………………………………… 85
5.2.2 计算模块的测试………………………………………………………… 85
5.2.3 转到ModelSim 仿真工具进行仿真…………………………………… 87
5.2.4 模块连接关系…………………………………………………………… 88
5.2.5 下载程序到开发板进行调试…………………………………………… 95
5.3 今天工作总结………………………………………………………………… 95
5.4 夏老师评述…………………………………………………………………… 95
第6章 第六天———可进行连续运算的状态机改进……………………………… 97
6.1 设计需求讲解………………………………………………………………… 97
6.2 状态机设计讲解……………………………………………………………… 97
6.2.1 状态机的编码形式……………………………………………………… 97
6.2.2 状态机的分类…………………………………………………………… 98
6.2.3 状态转移图(STD) …………………………………………………… 102
6.3 设计工具使用讲解………………………………………………………… 103
6.3.1 状态机模块的可综合代码…………………………………………… 103
6.3.2 状态机模块的测试…………………………………………………… 107
6.3.3 转到ModelSim 仿真工具进行仿真………………………………… 111
6.3.4 下载程序到开发板进行调试………………………………………… 111
6.4 今天工作总结……………………………………………………………… 113
6.5 夏老师评述………………………………………………………………… 114
第7章 第七天———面积优化……………………………………………………… 115
7.1 设计需求讲解……………………………………………………………… 115
7.2 面积与速度………………………………………………………………… 116
7.3 模块改进…………………………………………………………………… 118
7.3.1 计算模块的可综合代码……………………………………………… 118
7.3.2 转到ModelSim 仿真工具进行测试………………………………… 121
7.3.3 下载程序到开发板进行调试………………………………………… 123
7.4 今天工作总结……………………………………………………………… 125
7.5 夏老师评述………………………………………………………………… 126
第8章 第八天———二进制码转BCD 码模块的优化…………………………… 127
8.1 设计需求讲解……………………………………………………………… 127
8.2 算法实现…………………………………………………………………… 128
8.3 模块改进…………………………………………………………………… 129
8.3.1 二进制码转BCD码模块的可综合代码……………………………… 129
8.3.2 转到ModelSim 仿真工具进行测试………………………………… 132
8.3.3 下载程序到开发板进行调试………………………………………… 134
8.4 今天工作总结……………………………………………………………… 138
8.5 夏老师评述………………………………………………………………… 140
第9章 第九天———去“0”模块的设计…………………………………………… 141
9.1 设计需求讲解……………………………………………………………… 141
9.2 算法实现…………………………………………………………………… 141
9.3 模块改进…………………………………………………………………… 142
9.3.1 去“0”模块的可综合代码……………………………………………… 142
9.3.2 转到ModelSim 仿真工具进行测试………………………………… 144
9.3.3 下载程序到开发板进行调试………………………………………… 146
9.4 今天工作总结……………………………………………………………… 150
9.5 夏老师评述………………………………………………………………… 151
第10章 第十天———负数计算…………………………………………………… 152
10.1 设计需求讲解……………………………………………………………… 152
10.2 二进制数表示法…………………………………………………………… 152
10.3 补码原码转换模块………………………………………………………… 153
10.3.1 补码转原码模块的可综合代码……………………………………… 154
10.3.2 转到ModelSim 仿真工具进行测试………………………………… 154
10.3.3 原码转补码模块的可综合代码……………………………………… 155
10.3.4 转到ModelSim 仿真工具进行测试………………………………… 155
10.4 其他模块的修改…………………………………………………………… 156
10.4.1 显示模块的修改……………………………………………………… 156
10.4.2 消“0”模块的修改…………………………………………………… 159
10.4.3 BCD码和二进制码转换模块的修改……………………………… 160
10.4.4 计算模块的修改……………………………………………………… 163
10.4.5 按键状态机模块的修改……………………………………………… 165
10.4.6 顶层模块的修改……………………………………………………… 169
10.5 下载程序到开发板进行调试……………………………………………… 171
10.6 今天工作总结……………………………………………………………… 171
10.7 夏老师评述………………………………………………………………… 172
参考文献……………………………………………………………………………… 174
序言
2014年3月,首都师范大学物理系硕士研究生赵然同学报名参加了由我执教的FPGA设计就业培训班。在培训班上,他仔细聆听老师的讲解,积极提问、思考,按照老师建议的进度要求,认真设计并验证每个小模块,并逐步把它们整合成可以在FPGA上运行的实际电路结构,终于在十天内用纯数字逻辑电路在培训班提供的小开发板上实现了一台能做4位整数加、减、乘、除运算的计算器。这台计算器的实现过程是他学习Verilog数字系统设计第一阶段的全过程。
在我的鼓励和帮助下,赵然花了半年时间把他的学习日记整理成一本值得一读的小册子。我读后认为本书对于想学习Verilog数字设计、有志进入FPGA和集成电路设计行业的年轻人定会有很大的帮助,所以郑重地推荐给每一位想掌握Verilog数字系统设计的同学。
以后我们还将继续整理其他同学的学习日记,把在培训班学习期间由学员们独立完成的其他小项目设计的全过程和分阶段代码陆续介绍给各位读者。这些小册子将按照完成的先后顺序出版,希望它们能成为理工类学生自学Verilog数字设计、参加课程设计和毕业设计时的最好参考资料。同学们只要购买一块开发板,利用暑假、寒假、课设或毕设时间段,按这些小册子中介绍的步骤,走一遍设计的全过程,认真思考作者提出的每个问题,通过自己动脑又动手,来解决这些问题,就能真正掌握这门技术。这一过程对想进入高技术数字系统设计行业的同学是十分必要的。
赵然同学在本书中用日记的形式详细记录了每天的学习过程。在日记中,他用生动的文字记录了老师布置的设计要求、进度和讲解、学习中遇到的困惑、解决问题的方法和过程、模块代码的演化过程以及每天的喜怒哀乐,真实地反映了一位聪明、勤奋、好学的年轻人在学习复杂数字系统的艰难过程中的思想历程。本书不但是一本数字系统设计入门书籍,也是年轻人励志的优秀书籍。
在我看来,赵然的FPGA设计学习日记充分体现了“实践是最好的老师”的真理。学习Verilog数字设计没有捷径可走,在掌握了基本方法后,唯有不怕困难勇于攀登,才能逐步达到别人不敢逾越的高峰。
我们贫穷多难的祖国经过三十多年的改革开放,国民经济已有了很大的发展,但高科技产业仍非常落后,特别在集成电路工业和尖端国防工业方面更是如此。阻挡我国进入世界技术强国的主要障碍之一就是数字系统设计技术的落后。望有志改变我国技术落后面貌的年轻人通过阅读这本小册子,刻苦努力自学,加入日益壮大的数字系统设计师队伍,为振兴祖国的高技术产业贡献一份力量。
本书语言通俗易懂,从实用的角度详细介绍了设计过程的每个细节。最难能可贵的是作者的分享精神,通过简单明了的描述,我能体会到作者想与读者交流、分享的真诚愿望。相信各位读者通过认真阅读本书,认真上机操作,FPGA设计能力会更上一层楼。
当然,任何人都不可能只读一本小册子就完全掌握利用Verilog HDL的FPGA设计,但是我可以肯定地说,即将逐步推出的《Verilog FPGA数字系统设计自学丛书》确实是每个想进一步学习Verilog数字设计,并希望进入数字设计行业的年轻人的最好选择。本书针对的读者群是已有Verilog基础知识的学生,以及想进入数字系统设计领域的年轻电子工程师们。相信本书和以后将陆续出版的系列丛书定会受到更多读者的喜爱。
夏宇闻
北京航空航天大学退休教授
2015年9月10日