eric2013 发表于 2013-1-28 21:20:27

时序逻辑电路(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

eric2013 发表于 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    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

eric2013 发表于 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 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]
查看完整版本: 时序逻辑电路(5)----------分频器