硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3938|回复: 2
收起左侧

时序逻辑电路(5)----------分频器

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2013-1-28 21:20:27 | 显示全部楼层 |阅读模式
半分频-------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万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2013-1-28 21:25:18 | 显示全部楼层
偶分频     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[2:0]    cnt;                        //计数寄存器
always@(posedge clk_50M)   //在每个时钟的上升沿触发,执行begin_end里面的语句
begin
    cnt<=cnt+3'b1;                    //每个时钟周期计数寄存器自加一
    f_2<=cnt[0];                        //把计数寄存器的最低位赋予f_2,输出即使2分频
    f_4<=cnt[1];                        //把计数寄存器的第2位赋予f_4,输出即使4分频
    f_8<=cnt[2];                        //把计数寄存器的第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[2:0] 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[2:0] 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万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2013-1-28 21:28:22 | 显示全部楼层
奇分频器     1:1任意奇分频
module f_11(clk_50M,f_11);
input     clk_50M;            //输入时钟,50M,周期20ns
output     f_11;                //分频输出,占空比1:1,7分频

reg[2:0] 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[2:0] 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 00:58 , Processed in 0.154620 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表