文档详情

Verilog奇偶分频、一段式、两段式、三段式状态机.doc

发布:2017-01-05约7.53千字共11页下载文档
文本预览下载声明
汇报总结 1、偶数分频 偶数倍分频相对简单,可以通过计数器对预分频的脉冲沿计数实现,如果要进行N倍(N为整数)偶数分频,可由预分频的时钟触发计数器计数,当计数器从0计数到N/2—1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。分频的主体程序如下: `define div_en 8 module freq_div_even(clk_in, reset, clk_out ); input clk_in; input reset; output clk_out; reg clk_out; reg[2:0] count; initial begin count=0; clk_out=0; end always@(posedge clk_in) begin if(!reset) begin count=0; clk_out=0; end else if(count==(`div_en/2-1)) begin clk_out=~clk_out; count=0; end else begin count=count+1; end end endmodule 下面定义N为8,对一个脉冲8分频,测试程序如下: `timescale 1ns/1ns module testbench; reg reset; reg clk_in; reg[2:0] count; wire clk_out; freq_div_even test(.clk_in(clk_in), .reset(reset), .clk_out(clk_out) ); initial begin reset=0; clk_in=0; #5 reset=1; end always #10 clk_in=~clk_in; endmodule 波形图如下: 2、奇数分频 对于对占空比没有特殊要求的奇数分频,需要对上升沿和下降沿脉冲进行计数,利用下降沿产生的波形移相半个输入脉冲的作用,最后用错位“异或”法实现。一个n(n=3)分频的程序如下: module clk_divN( clk_in, reset, clk_out ); input clk_in; input reset; output clk_out; integer cnt1,cnt2; reg clk_divp; reg clk_divn; parameter n=3; always@(posedge clk_in) begin if(!reset) begin clk_divp=0; cnt1=0; end else if(cnt1==(n-1)) cnt1=0; else if(cnt1==0|cnt1==(n-1)/2) begin cnt1=cnt1+1; clk_divp=~clk_divp; end else cnt1=cnt1+1; end always@(negedge clk_in) begin if(!reset) begin clk_divn=0; cnt2=0; end else if(cnt2==(n-1)) cnt2=0; else if(cnt1==0|cnt1==(n-1)/2) begin cnt2=cnt2+1; clk_divn=~clk_divn; end else cnt2=cnt2+1; end assign clk_out=clk_divp|clk
显示全部
相似文档