用Quartus II + Verilog 做FPGA/CPLD设计/仿真的几个基本问题(自己总结的,对初学者有效)

用Quartus II + Verilog 做FPGA/CPLD设计/仿真的几个基本问题(自己总结的,对初学者有效)

Topic 1. 对端口的准确理解
module test11 (clk, testin, testout);
input      clk;
input      testin;
output     testout;
reg        testout;

...
endmodule
说明: 端口中的名称都是线型的. 在instantiate子模块时常容易犯的一个错误是:把寄存器当变量往子模块里送, 并将子模块的对应端口申明为寄存器输出,企图从中获得什么反馈. 其实把“寄存器”往里送并不是绝对不可以,问题是你送进去的寄存器禁止被赋值. 也就是说,子模块无权修改父模块内寄存器的内容.
结合开头的例子,做个更精确的解释: 例子中的testout实质是两个东西,一个是wire,一个是reg. 它们是缺省相关的,因为名称一样. 而当以变量形式将testout往子模块里送时,你送进去的“寄存器"并不是reg,而是wire.
为便于理解,上述例子实质内涵是如下形式:
module test12 (clk, testin, testout);
input      clk;
input      testin;
output     testout;
reg        testreg;

assign     testout = testreg;  //这句是关键, 类似“output reg  testout;”的语句中
                                   //其实隐含有 assign testout = testout;
                               //若分为两句写, “output testout;”这句才是真正的端口说明,
                               //而“reg testout;”这句只是因为写程序中要用到寄存器,而且
                                   //这个寄存器跟testout紧密相关,所以不妨就用testout, 重名而已.

...
endmodule


Topic 2. 数据总线读写的语法
数据总线是可读可写的, 是三态的.(但在对端口申明时,不必刻意在端口申明中加tri字样). 读写三态总线有其规范格式,否则综合时反复出错.标准例程格式可以到www.altera.com上下载.
module test21 (A, D, CLK, nRESET, nOE, TESTin, TESTout);
input   [15:0] A;
inout   [7:0]  D;
input          nOE;
input   [7:0]  TESTin;
output  [7:0]  TESTout;

assign TESTout = D; //读总线上的数据与读一般端口、寄存器、线型网点一样, 没有任何区别;
assign D = (~nOE)? TESTin : 8'bzzzzzzzz; //这是写总线的标准、经典格式,永远别企图改变.


Topic 3. 用Quartus II进行波形仿真过程中常出现的几个问题:
a)输入输出数据总线D执行仿真后,系统自动产生一个D~result,并将D仿真后的波形在该行显示,而其它网点的波形一般直接反映在原始变量名所对应的行中.
b)在“写总线时间段"内,仿真波形应初始化为三态,否则会出大量的 "found contention error at *** ns"的出错提示.
c)在执行Timing仿真时,程序中原来赋给寄存器的初值在波形中若未被正确反映出来,而执行Functional仿真时可以. 那么很可能程序已经对了.为了 在Timing仿真中获得正确数据,需要使“定义寄存器时赋予的值”与“仿真波形发生初期该寄存器的值"不能冲突,一般可以将程序中赋予三态,always 复位中再赋予有用初值;而在波形中复位的初始值赋予"x".
d)仿真时钟的周期别设得比Setting设置中频率所对应的时钟周期还要短,当然更不能比CPLD/FPGA的RTL物理周期还短,否则连一个累加器的仿真都会出莫名奇妙的错误.  

你可能感兴趣的:(c,Module,input,output)