quartus学习笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注释无法直接打出中文,用文本编辑器打出后复制到注释处Quartus起名要求
总共涉及到的名字有工程名,模块名,具体描述模块的Verilog文件名,原理图文件名。
工程名为A,那么最终需要编译的文件的名字必须和工程名相同。只能将最终需要编译的原理图命名为A(可能一个工程下不只一个原理图,要将最后仿真需要的总原理图命名为A),而模块名一定不能为A。在Verilog程序中描述模块时,可以给模块起名为B,程序完成后不需要编译,直接create symbol,在一个Verilog程序中可以定义多个模块,名字均不同,并且可以在一个模块中使用其他的模块,在create symbol时程序中有几个模块就会相应产生几个器件。这个Verilog程序文件(.v文件)的名字可以为A或不为A。
总之:工程名为A,最终要编译的总原理图名一定要为A,原理图中使用的各模块名一定不能为A,定义这些模块的Verilog文件名可以为A或不为A。
建立相应的文件
block diagram/schematic file 建立原理图、表模块文件
vector waveform file 建立矢量波形文件,保存后仿真,分为功能仿真与时序仿真,功能仿真忽略了延时,时序仿真加上了延时
方法:assignments-----settings,在simulation mode 中
选择functional是功能仿真,timeing是时序仿真
设置完成后,要生成功能仿真网络表processing--generate
functional simulation netlist再点击按钮进行仿真
规划引脚分布:assignments—pin planner(必须要选定器件才能规划引脚)
触发器
D:Q*=D
JK:Q*=JQ’+K’Q
T:Q*=T’Q+TQ’
SR:Q*=S+R’Q
混合编辑
自底向上:建立工程,建立2个(或以上)所需的VerilogHDL文件,并输入代码保存。创建图元:file----creat/update----creat symbol files for current file,生成.bsf格式的图元文件。再新建原理图文件,上述图元文件就可以添加进原理图文件中了。
自顶向下:建立工程,建立原理图文件,放置符号块(block tool),在blockproperties中设置名字、I/O类型等,添加模块引线(node tool/ bus tool等)并设置属性(general选项卡设置I/O类型,mappings设置连线节点名称)。右击符号块选择create design file form selected block,选择verilogHDL语言,单击OK,在生成的“.v”文件中修改代码VerilogHDL语言
都是以module开始以endmodule结束的一段程序
Module<模块名>(<端口列表>)
<定义>
<模块条目>
endmodule
verilogHDL文件名,模块名要相同才不会报错。Assign连续赋值语句,一直检测等式左右两端变量,一旦其中一个发生变化,就重新赋值并传给等式左端输出。
在一个VerilogHDL文件中调用子模块:3个方法
法一:首先建立工程(eg.lm),再建立VerilogHDL文件(lm),编写完成后将其设置为顶层文件,project --set as top level entiey。再建立VerilogHDL文件(ll),当做子文件。即可在lm中调用ll了。VerilogHDL区分大小写;并且包含102个关键词,关键词必须小写Parameter(小写)进行参数声明,eg:parameter param1=count,BIT=1; 可以声明数字也可以是计算表达式。
预处理命令:见VerilogHDL程序设计与应用P19
中的`是键盘左上角1旁边的那个键在英文状态下的输入
法二:`include "F:\quartus\exercise\4调用子模块\ll.v"
module lm(in1,in2,out);
input in1,in2;
output out;
wire w1;
ll ll1(in1,in2,w1);
ll ll2(w1,w1,out);
endmodule
法三:等价于module ll(in1,in2,out);
input in1,in2;
output out;
assign out=~(in1&in2);
endmodule
module lm(in1,in2,out);
input in1,in2;
output out;
wire w1;
ll ll1(in1,in2,w1);
ll ll2(w1,w1,out);
endmodule
O(o)八进制B(b)二进制D(d)十进制H(h)十六进制
线网的声明语法:net_kind [msb:lsb] net1;
Net_kind是网线类型,[msb:lsb]定义网线宽度,不写默认是1([2:0]宽度为3)net1网线变量的名称
具体语句
赋值总是从最低位(右侧)开始向最高位进行,任何多余的位都会被截断。有两种赋值方法:一是“=”阻塞赋值,相当于串行,必须执行完这一句才能完成下一句;二是“<=”非阻塞赋值,看成并行,与下一
句可以同时执行;但是只能给寄存器赋值。
If条件语句下没有大括号,用begin----end来代替
用if语句最好加上else,用case,最好加上default,防止出现锁存器。Begin If(……)q=d;end (1)1产生了锁存器,因为在不满足……时无定义,q还要保持原先的值
Begin if(……) q=d;else q=0;end(2)2没有锁存器。在不满足……时,q被赋值为0.
顺序语句块
Begin
------------end
并行语句块:并行执行,与书写顺序无关
Fork ---------- join
Case语句:多选一
Case(判断)
A:---------------;
B:---------------;
Default:-----------;
Endcase
Casez语句:条件表达式和分支表达式的值z被认为是无关值。Casex:x,z被认为无关
Casez(Ask)