利用task计算斐波那契数列,写出可综合的程序,并提供激励文件,用$display函数打印仿真结果。
1. 在Quartus II 新建工程
在quartus II 新建工程,工程名test_fibonacci ,顶层实体名称test_fibonacci,顶层模块的名称test_fibonacci,顶层文件名test_fibonacci.v
2. 斐波那契数列
斐波那契数列如下面的所示的序列
1 , 1 ,2,3,5,8,13,21,34,55,89,…
公式为: F(n) = F(n-1) + F(n-2); f(0) = 1, f(1) = 1;
从上面的数列可以看出,该数列有如下特点:
- 第一个和第二数分别为1,1
- 从第三个数开始分别为前两个数之和,如图1所示。

图1
3. Verilog 程序设计
-
实体程序
module task_fibonacci
(
input rst,
input i,
input [ 7: 0 ] in_data,
output reg [ 15: 0 ] out_data
);
task fibo ( input rst, input integer i, input[ 7: 0 ] in_data, output [ 15: 0 ] out_data );
begin
reg [ 15: 0 ] last_data0, last_data1;
if ( rst )
begin
last_data0 = 0;
last_data1 = 0;
end
if ( in_data < 2 )
out_data = in_data;
else
out_data = last_data0 + last_data1;
last_data1 = last_data0;
last_data0 = out_data;
end
endtask
always@( i, in_data, rst )
begin
fibo( rst, i, in_data, out_data );
end
endmodule
-
仿真程序如下:
`timescale 1ns /1ps
module tb;
reg [ 7: 0 ] in_data;
reg rst;
integer i;
wire [ 15: 0 ] fibo;
initial
begin
rst = 1'b1;
i = 0;
in_data = 0;
#10
rst = 0;
in_data = 1;
while ( i < 256 )
begin
#10
$display ( “sequence = %4d fibonacci = %d”, i + 1, fibo );
i = i + 1;
in_data = i;
#10;
end
end
task_fibonacci fibonacci_inst
(
.rst ( rst ),
.i ( i ),
.in_data ( in_data ),
.out_data ( fibo )
);
endmodule
4. 仿真结果:
-
-
modelsim 波形如图1
-

图2, Modelsim Fibonacci 数列
-
$display 显示结果:
# sequence = 1 fibonacci= 1
# sequence = 2 fibonacci= 1
# sequence = 3 fibonacci= 2
# sequence = 4 fibonacci= 3
# sequence = 5 fibonacci= 5
# sequence = 6 fibonacci= 8
# sequence = 7 fibonacci= 13
# sequence = 8 fibonacci= 21
# sequence = 9 fibonacci= 34
# sequence = 10 fibonacci= 55
# sequence = 11 fibonacci= 89
# sequence = 12 fibonacci= 144
# sequence = 13 fibonacci= 233
# sequence = 14 fibonacci= 377
# sequence = 15 fibonacci= 610
# sequence = 16 fibonacci= 987
# sequence = 17 fibonacci= 1597
# sequence = 18 fibonacci= 2584
# sequence = 19 fibonacci= 4181
# sequence = 20 fibonacci= 6765
5. 总结:
上面只截取了部分结果,结果输出符合预期。本节内容解决了利用task 设计fibonacii数列,并打印出相应的结果,同时Verilog 任务(task)的语法与使用 的习题解答
思考题: 在实体程序中的敏感表为何不用 always@(*),而用always@(i, in_data, rst),这两者有何区别?(提示敏感量 i 的作用)
对应视频:
老师,在quartus II下,此文章实体程序中的第10行的begin后面要加个块名:begin:kkk,不加仿真会报错。
同学很仔细,有些编译器是需要在begin后加上label的,具体要看使用的IDE。比如Quartus可能要求严格一些。