Menu Close

利用verilog task 计算斐波那契数列

利用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
  2. 从第三个数开始分别为前两个数之和,如图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 的作用)

 

对应视频:

Posted in FPGA, FPGA 教材教案, FPGA习题库, IC, Quartus II, Verilog, Verilog, 开发语言, 教材与教案, 文章, 编程语言

2 Comments

发表回复

相关链接