FPGA中的分频与延时.doc_第1页
FPGA中的分频与延时.doc_第2页
FPGA中的分频与延时.doc_第3页
FPGA中的分频与延时.doc_第4页
FPGA中的分频与延时.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FCFPGA中的分频FPGA中的分频是很重要的一个内容,只要涉及时序电路,几乎都会有分频的情况出现。但分频的语句却各有不同,以下就是不同写法,但不管怎样,分频一句话,就是用计数器来实现的。下面我就几种不同的写法说说我的看法,在FPGA中是如何实现分频的。不过再说之前首先的了解时钟。我这里以系统时钟clk,f=50MH为例。由此可知其T=20ns,f=50MH也就是说一秒内,时钟高低电平改变50M次。这里我用verilog为例,对于vhdl类同。讲解时只取分频部分语句后面附有完正的程序第一种写法: 。 always(posedge clk or negedge rst)begin 。if(!rst) beginclk_div1=0; endelse beginif(clk_div1!=11)clk_div1=clk_div1+1; else clk_div1=0; endendalways(posedge clk or negedge rst)beginif(!rst) beginclk_div2=0;state=0;cnt=0;out=0; endelse if(clk_div1=11) begin。/执行什么功能。注意在这里此语句中,我没有写完整,只是把分频的关键地方写出来了,特别是红色标注的地方。这里暂时不管定义的rst ,state。这些变量。关键是此句话if(clk_div1!=11)clk_div1=clk_div1+1; else clk_div1=0;此句话可知计数器clk_divl对系统时钟进行计数,并且只计数到11,clk_divl变等于0。这里有点类似于延时,下面以图形来说明。 由上图可知,clk=5MH的时钟,在计数器clk_divl下计数11,产生约4MH的时钟,此后系统便在4MH的频率下工作。这里他并未把新时钟提出来,而是在原来的时钟上分出4MH情况来工作。第二种写法:。always ( posedge clk_50M )beginif ( count=25000000 )/此处也可写成24999999 begin div_clk=div_clk; endelse count=count+1; led_out=div_clk; end。在这里我们也不去关注分频以外的东西,关键此语句if ( count=25000000 ) begin div_clk=div_clk; endelse count=count+1; 我们看到这里实际上定义了一个新时钟名:div_clk,系统此后便可以以此时钟来工作,在这里只要明白这样的解释就行了。 -(1)如进行 N 倍偶数、占空比为 50%的分频,那么可以通过由待分频的时钟触发计数,当计数器从 0 计数到 N/2-1时,输出时钟进行翻转,以此循环下去。 -(2) 如进行N 倍偶数、占空比为 1/N的分频,那么可以通过由待分频的时钟触发计数,当计数器从 0 计数到 N-1 时,输出时钟进行翻转,并给计数器一个复位信号,使得一个时钟从零开始计数,以此循环下去。一个公式就是:N为分频数,M为计数器的计数值。N/2-1=M。此时为,进行 N 倍偶数、占空比为 50%的分频。 N-1=M。此时进行N 倍偶数、占空比为 1/N的分频。例如一个50MH的分频其图为:其计数值M为25000000或24999999对于基数的分频:对于实现占空比为 50%的 N 倍奇数分频,首先进行上升沿触发进行模 N 计数,计数到(N-1)/2 进行输出时钟翻转,然后经过(N-1)/2 (即计数到 N-1 时)再次进行翻转得到一个占空比非 50%奇数 n 分频时钟。再者同时进行下降沿触发的模 N 计数,到(N-1)/2 时,进行输出时钟时钟翻转,同样经过(N-1)/2(即计数到 N-1 时)时,输出时钟再次翻转生成占空比非 50%的奇数 n 分频时钟。两个占空比非 50%的 n 分频时钟相或运算,得到占空比为 50%的奇数n分频时钟。第三种写法:always (posedge clk,negedge res) begin if(!res) begin led=6b000000; end else begin case(count26:23) 4d0: led=6b111110; /X miao 4d1: led=6b111101; /Y miao 4d2: led=6b111011; 4d3: led=6b110111; 4d4: led=6b101111; 4d5: led=6b011111; 4d6: led=6b011111; 4d7: led=6b101111; 4d8: led=6b110111; 4d9: led=6b111011; 4d10:led=6b111101; 4d11:led=6b111110; 4d12:led=6b000000; 4d13:led=6b111111; 4d14:led=6b000111; 4d15:led=6b111000; default:led=6b000000; endcase在这里我们也不去关注分频以外的东西,关键此语句 case(count26:23) 实际上这里定义了一个26位的计数器,但实际上为后22位计数,前4位定义状态。这种分频可用于数码管的动态显示或流水灯跑马灯等。其具体分析为:26位:25 24 23 22 21。04d0:0 0 0 0 00 0000 0000 0000 0000 0000/第一个状态0 0 0 0 1 111111。1 X秒/计数满22位为80ms4d1:0 0 0 1 0000000000。00000/第二个状态0 0 0 1 1111111。11111 Y秒/计数满22位为80ms4d2:0 0 1 0 0000000。00000 0 0 1 0 1111111.。11111111111 Z秒/计数满22位为80ms 4d3:0 0 1 1 0000000。00000000 /第三个 0 0 1 1 11111111111。1111111111 W秒/计数满22位为80ms。4d15:1 1 1 0 00000000000000000。000000/第四个1 1 1 0 1111111。1111111111/计数满22位为80ms从面可以看出每个状态停留的时间均为80ms,而每个状态在下一个时钟来时又加一,从而转到下一个状态。这样状态连续,而每个状态时间有一样,变可以实现动态显示和流水灯。附以上三个完整程序:第一个:module buzzer(clk,rst,out);input clk,rst;output out;reg out;reg3:0 clk_div1; /基频分频计数器,基频为4Mreg12:0 clk_div2;/音阶分频计数器,由基频分频产生各个音阶reg21:0 cnt;/各音阶发声时间长短计数器reg2:0 state;parameter duo=3822, /各个音调的分频系数 lai=3405,mi=3034,fa=2865,suo=2551,la=2273,xi=2024,duo1=1911;always(posedge clk or negedge rst)/这里采用了,分频的另一种手法,相当于延时。begin /分频的实现方式有多种。if(!rst) beginclk_div1=0; endelse beginif(clk_div1!=11)/在原来的时钟上分频,并未加入一个新的时钟。及原来的时钟到11个时钟 (波形)/才进行下一步做法。clk_div1=clk_div1+1;/相当于每4MH,做一次指令功能。因为11个时钟为220ns,所以周期为220ns,/频率为else /4MH。及原来的时钟到11个时钟(波形)才进行下一步做法(计时11个波形) clk_div1=0; endendalways(posedge clk or negedge rst)beginif(!rst) beginclk_div2=0;state=0;cnt=0;out=0; endelse if(clk_div1=11) begincase(state)3b000: begin /发“多”cnt=cnt+1;if(cnt=22h3fffff) state=3b001;if(clk_div2!=duo) /+3822clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b001: begin/发“来”cnt=cnt+1;if(cnt=22h3fffff) state=3b010;if(clk_div2!=lai)clk_div2=clk_div2+1; /else beginclk_div2=0;out=out;end end3b010:begin /发米“cnt=cnt+1;if(cnt=22h3fffff) state=3b011;if(clk_div2!=mi)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b011: begin /发法“cnt=cnt+1;if(cnt=22h3fffff) state=3b100;if(clk_div2!=fa)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b100: begin /发梭“ cnt=cnt+1;if(cnt=22h3fffff) state=3b101;if(clk_div2!=suo)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b101: begin /发拉“cnt=cnt+1;if(cnt=22h3fffff) state=3b110;if(clk_div2!=la)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b110: begin /发西“cnt=cnt+1;if(cnt=22h3fffff) state=3b111;if(clk_div2!=xi)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b111: begin /发多“(高音)cnt=cnt+1;if(cnt=22h3fffff) state=3b000;if(clk_div2!=duo1)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end endcase endendendmodule第二个:module ledwater (clk_50M,led_out,f_led_out);input clk_50M; /系统时钟输入50M /意味每一秒要变化50,000,000HZoutput led_out; /每一秒闪烁一下output f_led_out; /每二秒闪烁一下reg 24:0 count; /分频计数器,25000000分频 一秒reg 24:0 f_count;/分频计数器,12500000分频 0.5秒reg div_clk, f_div_clk;reg led_out, f_led_out;/分频计数器。得到一秒的频率always ( posedge clk_50M )beginif ( count=25000000 ) begin /我们的时钟本身是每一秒要变化50,000,000HZ /我们现在用count这个计数器让它自加到25,000,000HZ div_clk=div_clk; /在这里我们就得到了0.5秒变化一次的信号。 /所以一个周期就是1Hz也就是一秒。 count=0; /把计数器清零。 endelse count=count+1; /计数器自加。 led_out=div_clk; /利用分频计数器得到显示一秒的闪烁效果 /在LED灯上面表现出来。end /分频计数器。得到0.5秒的频率always ( posedge clk_50M )beginif ( f_count=12500000 ) /我们现在用count这个计数器让它自加到12,500,000HZ begin f_div_clk=f_div_clk; /在这里我们就得到了0.25秒变化一次的信号。 /所以一个周期就是0.5也就是2HZ。 f_count=0; endelse f_count=f_count+1; /计数器自加。 f_led_out=f_div_clk; /利用分频计数器得到显示一秒的闪烁效果 /在LED灯上面表现出来。endendmodule第三个:module ledsan(clk,led,res);input clk;output5:0 led;input res;reg 26:0 count;reg 5:0 led;always (posedge clk) begin count=count+1; endalways (posedge clk,negedge res) begin if(!res) begin led=6b000000; end else begin case(count26:23) 4d0: led=6b111110; /X miao 4d1: led=6b111101; /Y miao 4d2: led=6b11101

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论