在学习FPGA的过程中,最简单最基本的实验应该就是分频器了,
同时分频器也是FPGA设计中使用频率非常高的基本设计之一,
尽管在芯片厂家提供的IDE中集成了锁相环IP,
如altera 的PLL,Xilinx ISE的DLL或者vivado中的clock来进行时钟的分频,倍频以及相移。
但是对于时钟要求不高的逻辑,通过语言进行时钟的分频相移显得十分方便,
这种方法可以节省芯片内部的锁相环资源,再者,通过语言设计进行时钟分频,可以锻炼我们对verilog的熟练和理解程度。
下面给出5分频的具体代码:
- `timescale 1ns/1ps
-
- module CLK_DIV5(
- input clk_i,
- input rst_n,
- output clk_o
- );
-
- reg [2:0] cnt1,cnt2;
- reg clk_p,clk_n;
-
- //*********************
- //MAIN CORE
- //*********************
- always @(posedge clk_i,negedge rst_n)
- if(!rst_n) begin
- cnt1 <= 3'b0;
- clk_p <= 1'b0;
- end
- else begin
- if(cnt1 == 3'b100) begin
- cnt1 <= 3'b0;
- clk_p <= clk_p;
- end
- else begin
- cnt1 <= cnt1 + 1'b1;
- if(cnt1 == 3'b1 || cnt1 == 3'b11)
- clk_p <= ~clk_p;
- end
- end
-
- always @(negedge clk_i,negedge rst_n)
- if(!rst_n) begin
- cnt2 <= 3'b0;
- clk_n <= 1'b0;
- end
- else begin
- if(cnt2 == 3'b100) begin
- cnt2 <= 3'b0;
- clk_n <= clk_n;
- end
- else begin
- cnt2 <= cnt2 + 1'b1;
- if(cnt2 == 3'b1 || cnt2 == 3'b11)
- clk_n <= ~clk_n;
- end
- end
-
- assign clk_o = clk_p | clk_n;
- endmodule
-
测试激励模块:
- `timescale 1ns/1ps
-
- module TB_TOP;
-
- reg rst_n ;
- reg clk ;
-
- CLK_DIV5 U_CLK_DIV5(
- .clk_i(clk),
- .rst_n(rst_n),
- .clk_o(clk_o)
- );
-
- //*********************
- //MAIN CORE
- //*********************
- initial begin
- rst_n =1'b1;
- clk =1'b0;
-
- #5
- rst_n = 1'b0;
- #5
- rst_n = 1'b1;
-
- #500
- $finish;
- end
-
- always #1 clk = ~clk;
-
- endmodule
-
modelsim仿真图: