如何实现这样的占空比?
我的FPGA时钟是50MHZ,想得到1MHZ,占空比1:4的时钟,我写的代码如下:module dps(clk,clkout);
input clk;
output clkout;
reg cnt;
always @(posedge clk) //50分频
if(cnt==49)
cnt<=0;
else
cnt<=cnt+1;
always @(posedge clk) //占空比1:4
if(cnt<=12)
clkout<=0;
esle
clkout<=1;
endmodule
我的想法是先50分频,然后调整占空比,50*1/4=12.5 于是当cnt计数在12以内时,给予clkout低电平,其他时间给予高电平,但是由于12.5是个小数,而FPGA不支持小数处理。
后来对这个程序做了个时序仿真,得到的是1MHZ的时钟,但是占空比为6/25=1:4.16666...
问哈大家,如何得到1:4的占空比???谢谢了 不懂的只能帮顶,为什么你不能换个数分频呢?一定要1M吗,稍微偏差点行不行。。。或者最简单的,频率能否提高到100M 啥叫占空比1:4 好好想想吧。。。 module dps(rst,clk,clkout);
input clk;
input rst;
output clkout;
reg cnt;
always @(negedge rst or posedge clk)begin //25分频
if(!rst = 1)
cnt <= 0;
else if(cnt==24)
cnt<=0;
else
cnt<=cnt+1;
end
always @(posedge clk) begin //占空比1:4
if(!rst=1)
clkout <= 0;
else if(cnt<=25)
clkout<=1;
else
clkout<=0;
end
endmodule 谢谢大家 问题已经解决,贴出代码如下:
module div5(clk,clkout1,clkout2,clkout);
input clk;
output clkout1;
output clkout2;
output clkout;//5分频得到的时钟
reg cnt;
reg rg_clkout1,rg_clkout2;
always @(posedge clk)
if(cnt==4)
cnt<=0;
else
cnt<=cnt+1;
always @(posedge clk)
if(cnt<=2)
rg_clkout1<=1;
else
rg_clkout1<=0;
always @(negedge clk)
if(cnt<=2)
rg_clkout2<=1;
else
rg_clkout2<=0;
assign clkout=rg_clkout1&&rg_clkout2;//两时钟做与运算得到clkout
assign clkout1=rg_clkout1;
assign clkout2=rg_clkout2;
endmodule 你写的代码用到两种CLK边缘,在FPGA设计中不提倡,在设计复杂系统时候很容易出问题,主要是编译器支持不好。
另外输出的产生使用应该用主CLK同步至少一拍。
作为另一个简洁的实现方式可以用移位寄存器。
module func(input clki,rstn,output reg clko);
reg cntr;
reg sftr;
wrie cntr_over =(cntr==9);
always @ (posedge clki )
cntr<=(cntr_over)?0:(cntr+1);
always @ (posedge clki)
if (~rstn) sftr<=5'b00001 ; //一定要有rstn信号,否则5位都是0
if (cntr_over)
sftr<={sftr,sftr}; //循环左移一位。//右移也可以 只要是循环就行
always @ (posedge clki)
clko<=sftr ;// 取sftr的任何一位都可以
endmodule
以上代码第一个always 实现分频,将50M 的输入始终产生一个5M的脉冲。用来做控制触发信号cntr_over
第2个always 是移位置寄存器,5位其中4个0一个1,以5M的速度移5位,也就是说以1M速度循环,这样就得到了占空比为1:4的1M信号。
FPGA逻辑设计里面有些比较专门的思考方式,和串行代码不一样。用数字电路方式考虑,尽量不要停留在纸面的代码层面。 回复【楼主位】xuzhengan123
if(cnt<=12)
clkout<=0;
esle
clkout<=1;
......
-----------------------------------------------------------------------
为什么要用cnt<=12, 而不用cnt==12
<= 比 ==更占用资源 回复【5楼】mcupro李伟
-----------------------------------------------------------------------
【5位其中4个0一个1】
这个效果和第一个代码是一样的啊,楼主想要的波形应该是有四位里面有一个1三个0
http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_650256R20QS7.png
(原文件名:QQ截图未命名.png) 回复【4楼】xuzhengan123
-----------------------------------------------------------------------
这个仿真出来clkout既不是1M占空比也不是25%,能解释一下它的原理吗?
http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_650267VDJRWW.png
(原文件名:QQ截图未命名.png) mark! mark 回复【4楼】xuzhengan123
-----------------------------------------------------------------------
哥们,你的代码是不是有问题?我用你的做时序仿真,占空比是:9/49
http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_650294JG6GCC.jpg
(原文件名:func.jpg) 回复【5楼】mcupro 李伟
-----------------------------------------------------------------------
我的意思是当计数器记到12(包括12)以内时,clkout为0,当大于12时,clkout为1 回复【7楼】night_0309
-----------------------------------------------------------------------
不好意思哈,我贴错了程序,问题其实还没解决,自己还在想怎么写 回复【2楼】cwfboy
-----------------------------------------------------------------------
哥们,你的代码有问题哦 回复【4楼】xuzhengan123
-----------------------------------------------------------------------
不好意思哈,本人看错了,代码没有任何问题,谢谢了!! 利用上升沿 和 下降沿 是否能解决问题 回复【16楼】avr-qq高级工程叁
-----------------------------------------------------------------------
利用posedge和negedge就等于有每秒100M次的触发了啊,结合最早的那个代码应该就可以解决啦 回复【11楼】xuzhengan123
-----------------------------------------------------------------------
咦~你仿真的怎么和我不一样结果,我仿的是4楼的代码,你呢?引用图片【8楼】night_0309
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_650267VDJRWW.png
(原文件名:QQ截图未命名.png) 回复【17楼】night_0309
-----------------------------------------------------------------------
四楼的代码有问题吧,正确的代码如下,你可以试试:
//实现功能:对clk进行5分频,同时占空比为1:4
module func(clki,rstn,clko,cntr_over,sftr);
input clki;
input rstn;
output reg clko;
output cntr_over;
output sftr;
reg cntr;
reg sftr;
wire cntr_over =(cntr==9);
always @ (posedge clki )
cntr<=(cntr_over)?0:(cntr+1);
always @ (posedge clki)
if (~rstn) sftr<=4'b0001 ; //一定要有rstn信号,否则5位都是0
else if (cntr_over)
sftr<={sftr,sftr}; //循环左移一位。//右移也可以 只要是循环就行
always @ (posedge clki)
clko<=sftr ;// 取sftr的任何一位都可以
endmodule 回复【19楼】xuzhengan123
-----------------------------------------------------------------------
这也太简单了吧,这个占空比是1:5,20%不是1:4,modelsim仿真波形在7楼
难就难在他要求占空比25%
看看占空比的定义吧
http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_650320EJF92Z.jpg
(原文件名:9f1011b3e418a5b4d9335af5.jpg)
方波的占空比是50%也就是1:2,不是1:! 回复【19楼】xuzhengan123
-----------------------------------------------------------------------
哥们,我说的1:4不就是指25%吗?此1:4非高电平和低电平的时间比,而是高电平和周期比,我没有说错啊
页:
[1]