FPGA学习笔记Project基于Quartus Prime和ModelSim任务task的使用
一、Verilog HDL中任务:
任务的关键字是task,利用任务可以把一个大的程序模块分解成很多小的子模块,方便调试,并且能使结构清晰。
###任务(task)定义与调用的格式分别如下:
task <任务名>; //注意无端口列表
端口及数据类型声明语句;
其他语句;
endtask
任务调用的格式为
<任务名>(端口1,端口2,······);
任务调用时和定义时的端口变量应是一一对应的
二、实例:定义一个完成两个操作数按位与操作的任务,然后在后面的算术逻辑单元的描述中,调用该任务完成与操作。
(一) 使用Verilog HDL语言对电路进行描述
- 新建工程:File—New Project Wizard
- 设置当前工作目录及工程保存路径(路径中不能有中文及空格,可使用下划线’_’);第二栏中填写工程名字;第三栏是顶层文件的实体名,一般与工程名相同。(工程名的命名一般得符合标识符的命名原则)
- 无相关文件需要加入,跳过即可
- 选择目标器件:按照实际需求选择合适的器件即可。
- 选择综合器和仿真器:在Simulation一行,选择ModelSim-Altera,表示选择该仿真器进行仿真;Format一栏选择Verilog HDL。
- 结束设置:出现工程信息汇总窗口(Summary)。
- 在当前工程内新建Verilog HDL文件:File—New—Verilog HDL File
- 输入程序
代码示例:(CSDN的Markdown编辑器好像并不支持Verilog HDL语言的高亮,借用javascript)
module alutask(code,a,b,c);
input[1:0] code; input[3:0] a,b;
output reg[4:0] c;
task my_and;
input[3:0] a,b;
output[4:0] out;
integer i; begin for(i=3;i>=0;i=i-1)
out[i]=a[i]&b[i];
end
endtask
always@(code or a or b)
begin case(code)
2'b00:my_and(a,b,c);
2'b01:c=a|b;
2'b10:c=a-b;
2'b11:c=a+b;
endcase
end
endmodule
- 保存后将alutask.v文件设置为顶层实体;设置完成后可在Settings—General中查看。
-
- 编译:Processing—Start Compilation;修改至零错误即可。
- RTL级综合及门级综合:可在Tools—Netlist Viewers中选择进行RTL级综合或者门级综合。通过综合器,能将文本描述的转化为电路网表结构,并以原理图的形式呈现出来。
(二)、使用ModelSim进行仿真
- Test Bench仿真脚本的建立:Processing—Start—Start Test Bench Template Writer
- 在底部信息栏中可以看到Test Bench仿真脚本的保存路径;再通过File—Open打开
- 程序编写
代码示例:
`timescale 100 ps/ 1 ps
module alutask_vlg_tst();
parameter DELY=100;
reg eachvec;
reg [3:0] a;
reg [3:0] b;
reg [1:0] code;
wire [4:0] c;
alutask i1 (
.a(a),
.b(b),
.c(c),
.code(code)
);
initial
begin
code=4'd0;a=4'b0000;b=4'b1111;
#DELY code=4'd0;a=4'b0111;b=4'b1101;
#DELY code=4'd1;a=4'b0001;b=4'b0011;
#DELY code=4'd2;a=4'b1001;b=4'b0011;
#DELY code=4'd3;a=4'b0011;b=4'b0001;
#DELY code=4'd3;a=4'b0111;b=4'b1001;
$display("Running testbench");
end
always
begin
@eachvec;
end
endmodule
- 保存后,再对脚本做进一步设置:
上图中的Test bench name必须与模块名(即下图红框中)相同
- 仿真:Tools—Run Simulation Tool—RTL Simulation:可以通过左上角的放大与缩小的到合适的图形。