斐波那契数列verilog实现

 前言:

        该题为睿思芯科笔试题,笔试时长20分钟。

题目描述

        用代码实现斐波那契数列,代码需要对对enable敏感,当enable为高几周期,sum在enble为高的下一周期输出第几个斐波那契数,斐波那契数列的生成是后一个数字是前两个数字之和,如下序列:0、1、1、2、3、5、8、13、21、34...,当enable为0时,输出端口sum的值为0

        另外,当enable拉高第一周期时,在下一拍输出0,拉高第n个周期,在下一拍输出第n个斐波那契值。

tips:斐波那契数列F(0)=1,这里的F(0)=0是因为笔试题就是这样出的,笔者仅是复述题目并实现,重点在于实现思路。


解题思路

        解题的方法就是利用斐波那契数列的特性,用两个寄存器存储斐波那契数列的值,然后在下一周期通过非阻塞赋值更新reg1和reg2的值,并且把二者之和输出给sum。

				reg_sum<= reg1+reg2;
				reg1 <= reg2;
				reg2 <= reg1+reg2;

        还有一个要点,题目要求 enable为0时,sum输出0,所以由于enble和输出的sum是错了一拍的,为了让他们对齐,需要对enble打一拍得到enable_dl。然后根据enable_dl是否为1,确定输出应该为斐波那契值还是0.


代码

module fib_gen(
			input         clk, // positive edge trigger clock
			input         rstn,// active low reset 
			input         enable,
			output  [31:0]  sum
);
	reg [31:0] reg1,reg2,reg_sum;
	reg [31:0] counter;
	reg enable_dl;
	always @(posedge clk)begin
		if(!rstn)begin
			reg1 <= 32'd0;
			reg2 <= 32'd1;
			reg_sum <= 32'd0;
		end
		else if(enable )begin
			if(counter==32'd0)begin
				reg_sum <= 32'd0;
			end
			else if(counter == 32'd1)begin
				reg1 <= 32'd0;
				reg2 <= 32'd1;
				reg_sum <= 32'd1;
			end
			else begin
				reg_sum<= reg1+reg2;
				reg1 <= reg2;
				reg2 <= reg1+reg2;
			end
		end	
	end

	always @(posedge clk)begin
		if(!rstn)
				counter <= 32'd0;
		else if(enable)begin
				counter <= counter + 1'b1;
		end
	end
	always @(posedge clk)begin
		if(!rstn)
			enable_dl<= 1'd0;
		else
			enable_dl <= enable;
	end
	assign sum = enable_dl ? reg_sum:0;

	
endmodule

testbench

module tb();
reg clk, rstn,enable;
wire [31:0 ]sum;
initial begin
    forever #5 clk = ~clk;
end
initial begin
    rstn = 1'b0;
    clk = 1'b1;
    enable = #1 1'b0;
#10
    rstn = #1  1'b1;
#10
    enable = #1 1'b1;
#100
    $finish();
end

fibonacci u_fibonacci(
    .clk        (clk        ),
    .rstn       (rstn       ),
    .enable     (enable     ),
    .sum        (sum        )
);

initial begin
    $fsdbDumpfile("fibonacci.fsdb");
    $fsdbDumpvars(0);
end

endmodule

波形 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
斐波数列是一种数列,其中每个数都是前两个数的和。在Verilog中,可以使用任务和函数来实现斐波数列的计算。 任务和函数在Verilog中的区别在于,任务是一段可以包含多个语句的代码块,而函数是一个可以返回一个值的表达式。任务可以通过调用来执行,而函数可以在其他表达式中使用。 下面是一个使用Verilog实现斐波数列的例子: ```verilog module fibonacci_number( input clk, input rst_n, input [15:0] number_eth, output number_valid, output [15:0] number ); reg [15:0] previous_value; reg [15:0] current_value; reg number_valid_r; reg [15:0] cnt; assign number = current_value; assign number_valid = number_valid_r; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin previous_value <= 16'd0; current_value <= 16'd1; cnt <= 16'd0; number_valid_r <= 1'b0; end else begin if (cnt == number_eth - 16'd2) begin number_valid_r <= 1'b1; end else begin previous_value <= current_value; current_value <= previous_value + current_value; cnt <= cnt + 16'd1; number_valid_r <= 1'b0; end end end endmodule ``` 上述代码是一个Verilog模块,它使用时钟信号和复位信号来计算斐波数列。输入信号`number_eth`表示要求的斐波数的排号,输出信号`number_valid`表示生成完成,输出信号`number`表示生成的数字。 测试代码如下: ```verilog module Fibonacci_func_tb; reg [3:0] din_t; wire [7:0] dout_t; initial begin din_t = 0; end always #10 din_t = din_t + 1; Fibonacci_func myFibonacci_func( .dout(dout_t), .din(din_t) ); endmodule ``` 上述代码是一个测试代码,它使用一个输入信号`din_t`来模拟斐波数列的排号,输出信号`dout_t`表示生成的数字。 通过以上Verilog代码,可以实现斐波数列的计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃葱的酸菜鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值