logo资料库

VerilogHDL那些事儿-整合篇.pdf

第1页 / 共614页
第2页 / 共614页
第3页 / 共614页
第4页 / 共614页
第5页 / 共614页
第6页 / 共614页
第7页 / 共614页
第8页 / 共614页
资料共614页,剩余部分请下载后查看
目录
第一章 整合的概念
1.1源码上的整合
实验一:字面上的整合
c1a_module.v
clb_module.v
1.2 时钟和步骤的定义
1.3 有效的使用资源(资源上的整合)
实验二:资源上的整合
c2a_module.v
c2a_module.vt
仿真结果:
c2b_module.v
c2b_module.vt
仿真结果:
1.4 循环保留和循环操作
1.5 把C语言的好处(循环)整合进来
1.6 把C语言的好处(嵌入循环)整合进来
1.7 把C语言的好处(动作的关系)整合进来
1.8 步骤的循环和时序的循环之间的区别
1.9 实验三 :串口发送模块
tx_module.v
tx_module.vt
仿真结果:
1.10实验四 :串口发送模块2
tx_module2.v
tx_module2.vt
仿真结果:
1.11 模块之间调用的延迟
实验五:被延迟的数据
rom_module.v
control_module.v
exp5_env.v
exp5_env.vt
仿真结果:
1.12 同步数据的几个想法
实验六:加上过路寄存器
exp06_env.v
exp6_env.vt
仿真结果:
实验七:用循环操作来同步数据
control_module.v
exp7_env.vt
仿真结果:
总结:
第二章 - 时钟化和信号的长度
2.1 一个时钟一块数据的概念
2.2 信号时钟化
2.3 深入了解“模块的沟通”
2.4 电平检测模块的整合(即时事件在时序上的不和谐)
实验八:电平检测模块
detect_module.v
detect_module.vt
仿真结果:
exp2_4a.vt
2.5电平检测模块的整合(即时事件在模块沟通上的不和谐)
2.6 实验九:串口接收模块
rx_module.v
exp09_env.v
exp09_env.vt
仿真结果:
2.7 不同执行模式的“定时器和计数器”
exp2_7a.vt
exp2_7b.vt
2.8 计算N个长度的工具
2.9 实验十:重新设计vga模块
sync_module.v
rom_module.v
vga_module.v
2.10 主动设计的概念和模块的语言
实验十一:两个小屏幕
vga_control_module2.v
vga_module.v
2.11 实验十二:皮卡丘的HP血条
ram_module1.v
screen_control_module.v
screen_interface1.v
screen_system.v
2.12实验十三:我的小小字库
格式化
字库模块(rom模块)说明
字符
命令
ziku_control_module1.v
vga_control_module3.v
screen_interface2.v
demo_control_module.v
screen_system.v
2.13 实验十四:字库的屏幕扩张 (自定义字符串)
vga_control_module4.v
ziku_control_module2.v
screen_interface3.v
string_generate_module.v
screen_system.v
总结:
第三章 理想时序的整合
3.1 理想时钟和实际时钟的关系
3.2 速率和步骤的整合
实验十五:IIC实验(芯片—24LC04驱动)
iic_func_module.v
exp15_demo.v
3.3 iic总线被忽略的基础知识和速率的关系。
3.4 按时序表驱动iic设备。
实验十六:真正意义上的速率100Khz
iic_func_module.v
exp16_demo.v
iic_func_module.vt
仿真结果:
3.5 非正规的速率
实验十七:非正规速率的高速(400Khz)iic总线
iic_func_module.v
exp17_demo.v
3.6 不同世界的模块
实验十八(一) SDRAM基本功能介绍
SDRAM初始化:
定时自动刷新:
写一字操作:
读一字数据操作:
3.7 时间要求与理想时序之间的平衡点
实验十八(二)SDRAM基本功能驱动
sdram_init_module.v
iic_func_module.v
sdram_ctrl_module.v
sdram_module.v
sdram_demo.v
3.8 高速率的风险
实验十九 :SDRAM—100Mhz基本驱动
sdram_initial_module.v
sdram_func_module.v
sdram_control_module.v
sdram_module3.v
sdram_demo3.v
总结:
第四章 浮点数那些事儿
4.1 闻风色变的浮点数
4.2 浮点数和单精度格式
4.3浮点数加减法
4.4 实定和假定小数点的困惑
4.5 浮点数加减法实例
4.6 实验二十:浮点数加法器
float_add_module.v
float_add_module.vt
仿真结果:
4.7 实验二十一:浮点数减法器
float_sub_module.v
float_sub_module.vt
4.8 浮点乘法和陷阱
4.9 实验二十二:浮点数乘法器
float_multi_module.v
float_multi_module.vt
仿真结果:
4.10 浮点除法和精度流失
4.11 实验二十三:浮点数除法模块
float_divide_module.v
float_divide_module.vt
仿真结果:
总结:
第五章 优化和平衡
5.1 Verilog HDL优化的思考
5.2 偏向节省逻辑资源的优化
实验二十四:轻量版-浮点数加法模块
float_add_module_light.v
实验二十五:超轻量版-浮点数加法模块
float_add_module_light2.v
5.3 无意义的for循环
实验二十六:轻量版-浮点数加法模块 改
float_add_module_light2.v
仿真结果:
5.4 软件操作和循环操作的疑惑
5.5 实验二十七:轻量版-浮点数乘法模块
booth_multiplier_module_2.v
float_multi_module_light2.v
仿真结果:
5.6实验二十八:超轻量版-浮点数乘法模块
booth_multiplier_module_2.v
float_multiplier_module_light2.v
仿真结果:
5.7 实验二十九:轻量版-浮点数除法模块
streamlined_divider_module.v
float_divide_module_light.v
仿真结果:
5.8 再谈步骤和时钟的整合
5.9 组合逻辑和即时操作
5.10 即时操作和建模
实验三十:即时式Booth乘法器
immediate_booth_multiplier_module.v
immediate_booth_multiplier_module.vt
仿真结果:
5.11 当笨蛋的组合逻辑遇上笨蛋的编译器
5.12 实验三十一:即时式-浮点数加法模块
immediate_float_add_module.v
immediate_float_add_module.vt
仿真结果:
5.13 组合逻辑的压力
实验三十二:即时式-Booth算法乘法器(24位)
immediate_booth_multiplier_module.v
immediate_booth_multiplier_module.vt
实验三十三:即时式-浮点数乘法模块(Verilog 自带的 *操作符)
immediate_float_multi_module.v
immediate_float_multi_module.vt
仿真结果:
实验三十四:即时式-浮点数乘法模块(整合实验三十二)
immediate_float_multi_module.v
5.14 延迟压力和时序上的微妙关系1
5.15 延迟压力和时序上的微妙关系2
5.16 与即时操作拼耐性
实验三十五:即时式-Streamlined除法器
immediate_divide_module.v
实验三十六:即时式-浮点数除法模块 ( 整合实验三十五 )
immediate_float_divide_module.v
immediate_float_divide_module.v
仿真结果:
5.17 浅谈嵌套 if
总结:
结束语
Verilog HDL 那些事儿 - 整合篇 1
Verilog HDL 那些事儿 - 整合篇 书语 续建模篇和时序篇以后,两者之间如何整合是一门非常重要的功课。在这本《Verilog 那 些事儿-整合篇》—书中,笔者详细的谈论许多在整合里会出现的微妙思路,如:如何 把计数器/定时器整合在某个步骤里,从何提升模块解读性和扩展性。此外,在整合篇 还有一个重要的讨论,那就是 for,while 和 do ... while 等循环。这些都是一些顺 序语言的佼佼者,可是在 Verilog HDL 语言里它们就黯然失色。 要在 Verilog 要实现 for 和 while 等循环是一个矛盾的作业,这话何说呢?首先我们 可以用 Verilog 来模仿 for 和 while 等循环,这也是第一章的重点。可是随着我们深 入了解 Verilog 各种不同的运行模式,模仿就会失去意义 ... 因为只要有一个指向步 骤的 i 再加上一些整合的技巧,怎么样的循环我们都可以实现,这也是第五章的重点。 当然整合篇所讨论的内容不单是循环而已,整合篇的第二个重点是理想时序和物理时序 的整合。说实话,笔者自身也认为要结合“两个时序”是一件苦差事,理想时序是 Verilog 的行为,物理时序则是硬件的行为。不过在它们两者之间又有微妙的“黏糊点”,只要 稍微利用一下这个“黏糊点”我们就可以非常轻松的写出符合“两个时序”的模块,但 是前提条件是充足了解“理想时序”。 整合篇里还有一个重点,那就是“精密控时”。实现“精密控时”最笨的方法是被动式 的设计方法,亦即一边仿真,一边估算时钟的控制精度。这显然是非常“传统”而且“古 老”的方法,虽然有效但往往就是最费精神和时间的。相反的,主动式是一种讲求在代 码上和想象上实现“精密控时”的设计方法。主动式的设计方法是基于“理想时序”“建 模技巧”和“仿顺序操作”作为后盾的整合技巧。不说笔者吹牛,如果采用主动式的设 计方法驱动 IIC 和 SDRAM 硬件,任何一段代码都是如此合情合理。 虽然在整合篇里还出现不相关的浮点数。事实上,笔者偶尔在寻找资料的时候才发现浮 点数和 Verilog 有关的参考资料实在少得可怜。激动下,笔者写出浮点数加法器,减法 器,乘法器和减法器的现实原理。这样做,一是为了补充这方面资料的不足,二是为了 最后一章(优化和平衡)有足够的写作资源。 整合篇最后的重点就是模块的优化和平衡。笔者在其中解释到:在优化中常常会出现优 化偏向的误点。一般从单片机过度而来的同学,都会把优化偏向“越快越好”,但是在 实际里, Verilog 的优化是“平衡”的:要嘛就是牺牲资源提升操作速度;要嘛就是 牺牲操作速度节省资源;要嘛就是牺牲输出质量来优化前两者。以此类想,最终我们会 遇上 Verilog 的各种操作模式。 在最后笔者还稍微解释有关组合逻辑设计和转换的知识与技巧。可能是基于建模技巧的 优势,笔者设计的模块可以在各种操作模式之间相互转换。总而言之整合篇要讨论的内 容都是在:循环,组合逻辑,操作模式,理想时序和物理时序之间盘旋的整合技巧。 2
Verilog HDL 那些事儿 - 整合篇 前言 “呵呵呵”,先大笑三声庆祝这本笔记写完了,整个写作的时间有超过一年又几个月之 久。整合篇可以说是笔者某个程度的至高作品,内容结合了前两篇的认识以外,有进一 步扩展在 Verilog 世界里的见识。话来笔者也非常回味那些天,早晚奋力写作的日子。 一字又一字成行,一行又一行成页,一页又一页成章,多少章的累计最终成书。 笔者之所以会动笔写整合篇的原因,除了意在完善建模篇和时序篇的内容以外,目的是 为《Verilog 那些事儿》-系列,写下完美的句号。严谨来说,整合篇的内容基本上已 经超出一般认识的范围,读者能不能接受笔者却不晓得。但是对于笔者来说,忽视整合 篇里出现的重点,往往会使自己掉入学习 Verilog 的瓶颈。这番话不是胡说,而是事 实。 就好比 for 循环,有多少人纠结与它呢?实际上,Verilog 有没有它都无关紧要,但是 网上却有一大堆人不停在问:“for 怎样使用?”。很多时候笔者都苦笑不得 ... 啊,抱 歉!笔者没有取笑的意思,笔者非常明白他们的心情,因为笔者也有类似的经历。只要 换个角度,不停向内思索,答案往往都是那么简单,for 只是顺序操作,控制循环的关 键字而已。 此外还有 IIC 和 SDRAM 等问题,也是 Verilog 的头目怪物之一。一般认为 IIC 和 SDRAM 的实现只要符合预期的效果即可,设计的内容不论什么细节和结构。笔者则认为 许多参考资料都有意跳过重点巧妙包装细节,设计思路一字乱以外,根本无法学习其中 的知识,往往会出现学习的误解。在此,笔者没有自认自己的设计思路是绝对正确,不 过至少笔者还留下一颗学习的良心,可以解释的地方则解释,不可解释的地方则提出问 题。人们常说“要死也要死得明白”,学习也是一样。 呼~整合篇的内容可不是一般的多,笔记也分成上下篇,故读者一定要沉住耐性,万里 长城不是用几年的时间建成,而是用几代的时间建成。整合篇是一个持久的战役,要胜 利先要征服自己,锻炼风吹不到,水冲不掉的耐性。笔者用人头保证,读者读完以后心 理一定会萌出一份又一份满足感和成就感。 笔者最后奉上:整合篇所讨论的重点都是学习 Verilog 的瓶颈,一般上许多人都会用马 死落地走的方法来学习,然而只要建模篇和时序篇的知识作为后盾,读者一定可以乘风 破浪,一方向前。因为 Verilog 就是如此奇怪的家伙,毫无关系的细节却有微妙的联 系,只有技巧有效手段正当,学习起来就是得心应手 整合篇的内容有不足之处请多多见谅 ... 还有,这些内容都是笔者的“一厢情愿”的想 法,无法接受的朋友就笑笑而过吧,不要太认真。 akuei2 31-08-2012 上 3
Verilog HDL 那些事儿 - 整合篇 目录 目录 ........................................................................................................................... 04 第 1 章 整合的概念 ................................................................................................. 07 1.01 源码上的整合 ......................................................................................... 07 实验一:字面上的整合 .......................................................................... 07 1.02 时钟和步骤的定义 .................................................................................. 12 1.03 有效的使用资源(资源上的整合) ........................................................ 14 实验二:资源上的整合 .......................................................................... 14 1.04 循环保留和循环操作 .............................................................................. 25 1.05 把 C 语言的好处(循环)整合进来 ........................................................ 26 1.06 把 C 语言的好处(嵌入循环)整合进来 ................................................ 30 1.07 把 C 语言的好处(动作的关系)整合进来 ............................................ 34 1.08 步骤的循环和时序的循环之间的区别 .................................................... 40 1.09 实验三:串口发送模块 .......................................................................... 46 1.10 实验四:串口发送模块 2 ....................................................................... 51 1.11 模块之间调用的延迟 .............................................................................. 66 实验五:被延迟的数据 .......................................................................... 68 1.12 同步数据的几个想法 .............................................................................. 76 实验六:加上过路寄存器 ....................................................................... 77 实验七:资源上的整合 .......................................................................... 82 总结 .................................................................................................................... 87 第 2 章 时钟化和信号的长度 .................................................................................. 88 2.01 一个时钟一块数据的概念 ....................................................................... 88 2.02 信号时钟化 ............................................................................................. 93 2.03 深入了解模块的 9 通 .............................................................................. 95 2.04 电平检测模块的整合(即时事件在时序上的不和谐) ........................ 100 实验八:电平检测模块 ........................................................................ 101 2.05 电平检测模块的整合(即时事件在模块沟通上的不和谐) ................ 112 2.06 实验九:串口接收模块 .......................................................................... 114 2.07 不同执行模式的“定时器和计数器” .................................................. 129 2.08 计算 N 个长度的工具 ............................................................................ 134 2.09 实验十:重新设计 VGA 模块 ................................................................. 137 2.10 主动设计的概念和模块的语言 ............................................................. 161 实验十一:两个小屏幕 ........................................................................ 162 2.11 实验十二:比卡丘的 HP 血条 ................................................................. 170 2.12 实验十三:我的小小字库 ..................................................................... 186 4
Verilog HDL 那些事儿 - 整合篇 2.13 实验十四:字库的屏幕扩展(自定义字符串) ................................... 210 总结 .................................................................................................................. 227 第 3 章 理想时序的整合 ....................................................................................... 228 3.01 理想时序和实际时钟的关系 ................................................................. 228 3.02 速率和步骤的整合 ................................................................................ 231 实验十五:IIC 实验(芯片 24LC04 驱动) ......................................... 232 3.03 IIC 总线被忽略的基础知识和速率的关系 ........................................... 254 3.04 按时序表驱动 IIC 设备 ........................................................................ 258 实验十六:真正意义上的速率 100kHz ................................................ 267 3.05 非正规的速率 ....................................................................................... 286 实验十七:非正规速率的高速(400Khz)iic 总线 .............................. 286 3.06 不同世界的模块 ..................................................................................... 298 实验十八(一):SDRAM 基本功能介绍 ............................................. 298 3.07 时间要求和理想时序之间的平衡点 ...................................................... 318 实验十八(二):SDRAM 基本功能驱动 ............................................. 319 3.08 高速率的风险 ....................................................................................... 341 实验十九:SDRAM—100Mhz 基本驱动 .............................................. 345 总结 .................................................................................................................. 367 第 4 章 浮点数那些事儿 ....................................................................................... 368 4.01 闻风色变的浮点数 ................................................................................. 368 4.02 浮点数和单精度格式 ............................................................................. 372 4.03 浮点数加减法 ........................................................................................ 376 4.04 实定和假定小数点的困惑 ....................................................................... 388 4.05 浮点数加减法实例 ................................................................................. 390 4.06 实验二十:浮点数加法器 ....................................................................... 400 4.07 实验二十一:浮点数减法器 .................................................................. 412 4.08 浮点乘法和陷阱 .................................................................................... 422 4.09 实验二十二:浮点数乘法器 .................................................................. 435 4.10 浮点除法和精度流失 ............................................................................. 453 4.11 实验二十三:浮点数除法器 .................................................................. 464 总结 .................................................................................................................. 476 第 5 章 优化和平衡 ............................................................................................... 477 5.01 Verilog HDL 优化的思考 .................................... 477 5.02 偏向节省逻辑资源的优化 .................................... 481 实验二十四:轻量版-浮点数加法模块 ......................... 481 5
Verilog HDL 那些事儿 - 整合篇 实验二十五:超轻量版-浮点数加法模块 ....................... 485 5.03 无意义的 for 循环 .......................................... 491 实验二十六:轻量版-浮点数加法模块·改 ..................... 493 5.04 软件操作和循环操作的疑惑 ................................... 496 5.05 实验二十七:轻量版-浮点数乘法模块 ......................... 498 5.06 实验二十八:超轻量版-浮点数乘法模块 ....................... 507 5.07 实验二十九:轻量版-浮点数除法模块 ......................... 515 5.08 再谈步骤和时钟的整合 ....................................... 523 5.09 组合逻辑和即时操作 ........................................ 526 5.10 即时操作和建模 ............................................ 528 实验三十:即时式-Booth 乘法器 ............................. 531 5.11 当笨蛋的组合逻辑遇上笨蛋的编译器 .......................... 539 5.12 实验三十一:即时式-浮点数加法模块 ......................... 542 5.13 组合逻辑的压力 ............................................ 559 实验三十二:即时式-Booth 算法乘法器(24 位) ............... 561 实验三十三:即时式-浮点数乘法乘模块(Verilog 自带的 *操作符 567 实验三十四:即时式-浮点数乘法模块(整合实验三十二) ....... 579 5.14 延迟压力和时序上的微妙关系 1 .............................. 582 5.15 延迟压力和时序上的微妙关系 2 .............................. 587 5.16 与即时操作拼耐性 ........................................... 595 实验三十五:即时式-Streamlined 除法器 ..................... 595 实验三十六:即时式-浮点数除法模块(整合实验三十五) ....... 600 5.17 浅谈嵌套 if ................................................ 608 总结 ............................................................ 613 结束语 614 6
7 第一章 整合的概念 如果以笔者的脑袋去思考 Verilog HDL 语言的“整合概念”就是“减少资源的使用”(最 近全世界都搞环保)。在这里“资源”的意思再也不是单单 FPGA 的逻辑资源,而是“时 钟”和“步骤”。此外“整合”还有字面的意思,就是将代码整合起来,如果以抽象角 度来看,意思就是提高内容的解读能力。除此以外“整合”还有把其他语言的好处,以 Verilog HDL 语言的特质“整合”起来 ..... 1.1 源码上的整合 “源码上的整合”正如字面上的意思,把模块的行数较少使观看更集中以外,还把源码 编辑得更加密集起来。这个概念和“C 语言上的精简代码”有很大的不同,读者是不是 摸不着头脑呢?呵呵,笔者以一个简单的实验来说明: 实验一:字面上的整合 c1a_module.v 1. module c1a_module 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ( input CLK, input RSTn, output Q, /******************/ output [4:0]SQ_C1, output [1:0]SQ_i 13. ); 14. /*************************/ reg [4:0]C1; always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) C1 <= 5'd0; else if( C1 == 10 - 1 ) 15. 16. 17. 18. 19. 20. 21. 22. 7
23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. C1 <= 5'd0; else C1 <= C1 + 1'b1; /*************************/ reg [1:0]i; reg rQ; always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) begin i <= 2'd0; rQ <= 1'b0; end else case( i ) 0: if( C1 == 10 -1 ) i <= i + 1'b1; else rQ <= 1'b1; 1: if( C1 == 10 -1 ) i <= i + 1'b1; else rQ <= 1'b0; 2: if( C1 == 10 -1) i <= i + 1'b1; else rQ <= 1'b1; 3: if( C1 == 10 -1) i <= 2'd0; else rQ <= 1'b0; endcase /***********************************/ assign Q = rQ; /*****************/ assign SQ_i = i; assign SQ_C1 = C1; 8 8
分享到:
收藏