时序逻辑电路(5)----------分频器
半分频-------1.5分频module div_1_5(clk,div);
input clk; //输入时钟信号
output div; //输出分频信号
reg count; //计数寄存器
reg div; //输出分频寄存器
reg clk_temp2,clk_temp3; //脉冲控制端2寄存器,脉冲控制端3寄存器
assign clk_temp1=clk^clk_temp2; //脉冲控制端1寄存器,等于clk与clk_temp2取异或
always@(posedge clk_temp1) //脉冲控制端的上升沿触发
begin
if(count==1'b0) //判断count是否为0,是的话执行以下操作
begin
count<=1'b1; //count置1
clk_temp3<=1'b1; //clk_temp3置1
div<=1'b1; //div置1
end
else //否的话执行以下操作
begin
count<=count-1'b1; //count自减1
clk_temp3<=1'b0; //clk_temp3置0
div<=1'b0; //div置0
end
end
always@(posedge clk_temp3) //clk_temp3的上升沿触发
begin
clk_temp2<=~clk_temp2; //clk_temp2取反
end
endmodule 偶分频 1:1的2,4,8分频
module fengping_1(clk_50M,f_2,f_4,f_8);
input clk_50M; //输入时钟,50M,周期为20ns
output f_2,f_4,f_8; //输出分频时钟,分别为2分频,4分频,8分频
reg f_2,f_4,f_8; //输出分频寄存器
reg cnt; //计数寄存器
always@(posedge clk_50M) //在每个时钟的上升沿触发,执行begin_end里面的语句
begin
cnt<=cnt+3'b1; //每个时钟周期计数寄存器自加一
f_2<=cnt; //把计数寄存器的最低位赋予f_2,输出即使2分频
f_4<=cnt; //把计数寄存器的第2位赋予f_4,输出即使4分频
f_8<=cnt; //把计数寄存器的第3为赋予f_8,输出即使8分频
end
endmodule
1:1的10分频
module fengping_2(clk_50M,f_10);
input clk_50M; //系统输入时钟,50M,周期20ns
output f_10; //10分频输出,5M
reg f_10; //输出寄存器
reg cnt; //计数寄存器
always@(posedge clk_50M) //每个时钟周期的上升沿触发,执行begin_end中的语句
begin
if(cnt==3'b100) //判断cnt是否为4,是的话执行以下程序
begin
f_10<=~f_10; //把f_10取反
cnt<=3'b0; //计数寄存器清零
end
else //cnt没到4,执行以下程序
begin
cnt<=cnt+3'b1; //计数寄存器自加一
end
end
endmodule
1:3的4分频
module f_13(clk_50M,f_13);
input clk_50M; //输入时钟,50M,20ns
output f_13; //输出4分频,占空比为1:3
reg f_13; //分频寄存器
reg cnt; //计数寄存器
always@(posedge clk_50M) //在每个时钟的上升沿触发
begin
if(cnt==3'b011) //当cnt为3的时候,执行以下程序
begin
f_13<=1'b1; //f_13置1
cnt<=3'b0; //cnt清0
end
else
begin
cnt<=cnt+3'b1; //cnt自加1
f_13<=1'b0; //f_13置0
end
end
endmodule 奇分频器 1:1任意奇分频
module f_11(clk_50M,f_11);
input clk_50M; //输入时钟,50M,周期20ns
output f_11; //分频输出,占空比1:1,7分频
reg cnt_1,cnt_2; //2个3位的计数寄存器
reg temp_1,temp_2; //2个1位的寄存器
parameter n=7; //参数设置,令n=7,故本例程中的n均代表7
always@(posedge clk_50M) //时钟上升沿触发
begin
if(cnt_1==n-1) //判断cnt_1是否为6
begin
cnt_1<=3'b000; //是的话清0
end
else
begin
cnt_1<=cnt_1+3'b1; //不是的话自加1
end
if(cnt_1==1'b000) //判断cnt_1是否为0
begin
temp_1<=1; //是的话temp_1置1
end
if(cnt_1==(n-1)/2) //判断cnt_1是否为3
begin
temp_1<=0; //是的话temp_1置0
end
end
always@(negedge clk_50M) //时钟下降沿触发
begin
if(cnt_2==n-1) //判断cnt_2是否为6
begin
cnt_2<=3'b000; //是的话,清0
end
else
begin
cnt_2<=cnt_2+3'b1; //否的话自加1
end
if(cnt_2==3'b000) //判断cnt_2是否为0
begin
temp_2<=1; //是的话temp_2置1
end
if(cnt_2==(n-1)/2) //判断cnt_2是否为3
begin
temp_2<=0; //是的话temp_2置0
end
end
assign f_11=temp_1||temp_2; //temp_2跟temp_1做相或运算
endmodule
1:4的5分频
module f_14(clk_50M,f_14);
input clk_50M; //输入时钟,50M,20ns
output f_14; //输出5分频,占空比为1:4
reg f_14; //分频寄存器
reg cnt; //计数寄存器
always@(posedge clk_50M) //在每个时钟的上升沿触发
begin
if(cnt==3'b100) //当cnt为4的时候,执行以下程序
begin
f_14<=1'b1; //f_14置1
cnt<=3'b0; //cnt清0
end
else
begin
cnt<=cnt+3'b1; //cnt自加1
f_14<=1'b0; //f_14置0
end
end
endmodule
页:
[1]