分频实验应该是FPGA/CPLD实验中的最基础的实验(本人应该比流水灯还基础),而占空比为50%的奇分频相较于偶分频有一些难点。本文以占空比为50%的三分频时钟为例,希望起一点抛砖引玉的作用。
思路:通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算。(这里我希望大家可以用笔在纸上画出时序,验证和思考一下)。
源代码:
`timescale 1ns/1ps
module clkdiv
(
sysclk,
rst_b,
div_out
);
input sysclk;
input rst_b;
output div_out;
reg [1:0] cnt1;
reg [1:0] cnt2;
always @(posedge sysclk)
begin
if(!rst_b) cnt1 <= 2'b0;
else
begin
case(cnt1)
2'b00: cnt1 <= 2'b01;
2'b01: cnt1 <= 2'b10;
2'b10: cnt1 <= 2'b00;
default: cnt1 <= 2'b00;
endcase
end
end
always @(negedge sysclk )
begin
if(!rst_b) cnt2 <= 2'b0;
else
begin
case(cnt2)
2'b00: cnt2 <= 2'b01;
2'b01: cnt2 <= 2'b10;
2'b10: cnt2 <= 2'b00;
default: cnt2 <= 2'b00;
endcase
end
end
assign div_out = (cnt1[0] | cnt2[0]);
endmodule
testbench源码(本人模仿特权同学视频testbench写法):
`timescale 1 ns/ 1 ps
module clkdiv_tb();
reg sysclk;
wire div_out;
reg rst_b;
clkdiv i_clkdiv (
.div_out(div_out),
.rst_b(rst_b),
.sysclk(sysclk)
);
initial
begin
sysclk = 1;
forever
#10 sysclk = ~sysclk;
end
initial
begin
rst_b = 0;
#1000;
rst_b = 1;
#5000;
$stop;
end
endmodule
最后附上modelsim的功能仿真效果图:
本人最近才开始学习CPLD/FPGA,也是菜鸟一名,有不对的地方,希望大家批评指正。
文章评论(0条评论)
登录后参与讨论