panthera_chen@foxmail.com笔记二:Verilog奇数分频:以七分频为例FPGA菜鸟,刚做了个简单Verilog奇数分频实验,附上代码只需修改两个参数即可得到需要的奇数分频:/*功能:完成时钟n=7奇数分频clk:时钟reset:复位信号Clkdivout:分频时钟输出Cntposege:上升沿计数Cntnegege:下降沿计数clkpos:上升沿计数产生时钟clkneg:下降沿计数产生时钟基本思路:cntposege时钟上升沿到来计数到n=7,前a=3个周期为低电平,后b=4个周期为高电平;cntnegege时钟下降沿到来计数到n=7,前a=3个周期为低电平,后b=4个周期为高电平;最后两个时钟信号相与即得n=7分频。a,b取值:a+b=n;b-a=1;*/moduleclkdiv(clk,reset,clkdivout);inputclk;//时钟inputreset;//复位信号outputclkdivout;//分频时钟输出wireclkdivout;parameterN=3'd7;//修改这两个参数即可得想要的奇数分频parametera=3'd3;//a、b取值:a+b=N;b-a=1;//parameterb=3'd4;reg[2:0]cntposege;//上升沿计数7个周期reg[2:0]cntnegege;//下降沿计数7个周期//上升沿计数7个周期always@(posedgeclkornegedgereset)beginif(!reset)cntposege=3'd0;elseif(cntposege==N-1'b1)//cntposege等于6,下一个时钟到来时执行操作,即7个周期,以下同理cntposege=3'd0;elsepanthera_chen@foxmail.comcntposege=cntposege+1'b1;end//下降沿计数7个周期always@(negedgeclkornegedgereset)beginif(!reset)cntnegege=3'd0;elseif(cntnegege==N-1'b1)cntnegege=3'd0;elsecntnegege=cntnegege+1'b1;endregclkpos;//上升沿计数得到的占空比4:7的时钟regclkneg;//下降沿计数得到的占空比4:7的时钟//上升沿计数得到的占空比4:7的时钟always@(posedgeclkornegedgereset)beginif(!reset)clkpos=1'b0;elseif(cntposege=a-1'b1)clkpos=1'b0;elseclkpos=1'b1;end//下降沿计数得到的占空比4:7的时钟always@(negedgeclkornegedgereset)beginif(!reset)clkneg=1'b0;elseif(cntposege=a-1'b1)clkneg=1'b0;elseclkneg=1'b1;endassignclkdivout=clkpos&clkneg;//两个时钟相与得到占空比50%的七分频时钟输出endmodulepanthera_chen@foxmail.comTestbench测试代码比较简单:`timescale1ns/1psmoduleclkdiv_vlg_tst();regclk;regreset;wireclkdivout;parametercycle=20;parameterrst_time=3;clkdivi1(.clk(clk),.clkdivout(clkdivout),.reset(reset));initialbeginclk=0;forever#(cycle/2)clk=~clk;endinitialbeginreset=1;#2;reset=0;#(cycle*rst_time);reset=1;endEndmoduleModelsimRTL级仿真波形:panthera_chen@foxmail.com观测波形可以看到分频信号clkdivout准确7分频,而clkpos和clkneg两个占空比4:7信号相与后得到50%占空比分频时钟。代码较为粗糙未经优化,望同志们继续努力,欢迎交流FPGA学习心得。panthera_chen@foxmail.com2015/9/24