开发笔记
2015.7.13 - 2015.7.17
简述
本周是我真正开始接触verilog开发的一周,
本周我主要是完成了一个小型的计数平均器的开发。
- 首先,我把设计转化为verilog设计语言
- 然后,使用modelsim对每个模块进行了功能性仿真,已验证逻辑设计的正确性。
- 随后,使用了signaltap ii对项目进行片上仿真
- 最终,项目通过了多次普通频率信号的仿真之后,确定运行正常且实现了最初的设计目的
细节
设计目的和预期
时钟
晶振时钟使用的是50 Mhz,而经过PLL之后倍频为系统时钟 100Mhz
功能
先采集每10ms输入脉冲的数量,再对10个采样值取平均数
设计图和verilog代码的实现
设计上分为三个模块
- PLL模块:用于产生系统时钟和测试信号,直接使用IP核产生。c0为2倍频,用于系统时钟;c1为四倍频,用于测试对照时钟;c2为四分频,用于模拟采样信号
- echantion模块:用于采样,由verilog编写
- calcul模块:用于处理数据输出平均值,由verilog编写
remarque
verilog代码的编写有很大自由,但是综合软件特别笨,往往无法综合代码。
以下是写出可综合代码需要注意的点:
- 尽可能简化结构,模块化编程。
- 如有可能,在一个结构内只对一个变量做调整
- 一个变量只能在一个always行为语句中被赋值
- assign 只能给wire赋值
- 输入输出接口的数据长度要一致
- 预先判断好数据长度,防止数据过大而溢出
- 使用reset而不是initial
- 使用==和!= 而不是 ===和!==
modelsim的仿真
modelsim是一款强大的仿真软件,此次用于功能性仿真。需要注意的是modelsim可以理解所有verilog语言,所以testbench的自由度比较高,但是仿真结束后未必意味着可以综合。
推荐在仿真之后使用tool> Netlist Viewer > technology Map Viewer和RTL Viewer来确认。 technology Map Viewer 可以看出代码是否真的可以被综合,而RTL Viewer可以看到是否逻辑正确
引脚分配
使用tcl脚本分配引脚,语句模板是
set_location_assignment PIN_30 -to i_clk
signalTap ii的仿真
这是本项目的关键,通过逐个模块信号的仿真,可以最终得到符合要求的最终项目版本。
另外,生成的.sof文件位于output_file文件夹里
remarque
时钟的设置是关键,推荐使用最高频率的时钟或者系统时钟。
此处我们使用的是PLL产生的四倍频时钟
实验中使用的采样和仿真结果
50Mhz ->每次取样10ms脉冲数为500 0x1F4
25Mhz ->每次取样10ms脉冲数为250 0xFA
12.5Mhz ->每次取样10ms脉冲数为125 0x7D
总结
通过这个项目,我初次接触了完整的开发流程,并且试验了modelsim的使用,为之后项目开发做了准备。