斐波那契数列(0,1,1,2,3,5,8,13…)
思路很简单,只用两个寄存器,根据斐波那契数列的特点,每次时钟到来时,把reg2赋值给reg1,把reg1和reg2相加赋值给reg2。因为是非阻塞赋值,不用额外的寄存器储存中间变量。
verilog代码:
module Fibonacci_generator(input rst_n, clk, output reg[15:0] dout);
reg[15:0] reg1;
reg cnt;
always@(posedge clk, negedge rst_n)
begin
if(!rst_n)
begin
reg1 <= 0;
dout <= 0;
cnt <= 0;
end
else
begin
if(cnt == 0)
begin
cnt <= cnt + 1;
dout <= 1;
end
else
begin
reg1 <= dout;
dout <= reg1 + dout;
end
end
end
endmodule
testbench:
`timescale 1ns/1ns
module Fibonacci_generator_tb;
reg RST_N,CLK;
wire[15:0] DOUT;
integer i;
Fibonacci_generator U_Fibonacci_generator(.rst_n(RST_N),.clk(CLK),.dout(DOUT));
initial
begin
RST_N = 1;
#5 RST_N = 0;
#2 RST_N = 1;
end
initial
begin
CLK = 0;
for(i = 0;i<10000;i = i+1)
begin
#2 CLK = ~CLK;
end
end
endmodule
仿真结果: