Quartus II 报错:
“Error (12007): Top-level design entity "new1" is undefined”
解决办法:将模块名和文件名改为一致,设置文件为顶层文件
变量的初始值问题:(待解决)
仿真和实际上板跑有一个区别是仿真时未初始化的变量在波形里是红色的x,实际上板跑的时候是不会有这种信号。导致上板结果和仿真不一致。
仿真时采用initial语句给各变量赋初值,未赋初值的变量在仿真中波形为红色的x,此时若对该变量取反,结果还为,这样就造成了仿真结果于理想不同,而此时代码可能并没有问题。
在实际调试时发现未初始化的变量在全局reset时并不一定是低电平的0,原因是程序中很多代码不依赖reset就已经开始跑了。
状态机的状态编码选择:
以下内容部分来自野火FPGA教程
独热码(one-hot code):
有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种编码方式,例如:
parameter IDLE = 4'b0001;
parameter start = 4'b0010;
parameter MIDDLE = 4'b0100;
parameter END = 4'b1000;
二进制码:
正常的二进制计数规则:
parameter IDLE = 2'b00;
parameter start = 2'b01;
parameter MIDDLE = 2'b10;
parameter END = 2'b11;
格雷码(Gray code):
任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码,最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。
parameter IDLE = 2'b00;
parameter start = 2'b01;
parameter MIDDLE = 2'b11;
parameter END = 2'b10;
FPGA编程过程中推荐使用独热码作为状态位的编码,虽然独热码占用的寄存器资源较多,但这种编码方式在程序编码过程中,综合后占用的组合逻辑资源较少,二进制码则刚好相反,占用的寄存器资源少,组合逻辑资源多。而在FPGA中,寄存器资源是比较多的,组合逻辑资源相对较少,所以推荐使用独热码。
如果状态数量较多,用独热码占用寄存器太多,推荐使用格雷码,格雷码相邻状态位仅有一位改变的特点使得电路在状态切换时,线路的电位改变少,系统更稳定。
总结:
低速系统:4个状态以下采用二进制码,5~24各状态采用独热码,24各状态以上采用格雷码;
高速系统:均采用独热码。