Verilog 20分频设计

Verilog 20分频设计,第1张

分频器是FPGA设计中使用频率非常高的基本单元之一。尽管目前在大部分设计中还广泛使用集成锁相环(如altera的PLL,Xilinx的DLL)来进行时钟分频、倍频以及相移设计,但是,对于时钟要求不太严格的设计,通过自主设计进行时钟分频的实现方法仍然非常流行。首先这种方法可以节省锁相环资源,再者,这种方式只消耗不多的逻辑单元就可以达到对时钟 *** 作的目的。 偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。

module odd_division(clk,rst,count,clk_odd)/*count没必要放在端口中,这里只是为了仿真时观察*/

inputclk,rst

output clk_odd

output[3:0] count

reg clk_odd

reg[3:0] count

parameterN = 6/*6分频* /

always @ (posedge clk)

if(! rst)

begin

count <= 1'b0

clk_odd <= 1'b0

end

else

if ( count <N/2-1)

begin

count <= count + 1'b1

end

else

begin

count <= 1'b0

clk_odd <= ~clk_odd

end

endmodule

奇数倍分频:归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数从零开始,到N-1)/2进行输出时钟翻转,然后经过(N+1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N计数,到和腊答上升沿过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频败基时钟相或运算,得到占空比为50%的奇数n分频时钟。

module even_division(clk,rst,count1,count2,clk_even)/*count1,count2没必要放在端口中,这里只是为了仿真时观察*/

inputclk,rst

output[3:0] count1,count2

output clk_even

reg[3:0] count1,count2

reg clkA,clkB

wire clk_even,clk_re

parameterN = 5 /*5分频*/

assign clk_re = ~clk

assign clk_even = clkA | clkB

always @(posedge clk)

if(! rst)

begin

count1 <= 1'b0

clkA <= 1'b0

end

else

if(count1 <(N - 1))

begin

count1 <= count1 + 1'b1 /*这里是阻塞赋值是先执行了下察局谨面的IF判断,最后才赋的值。最初看这程序时没注意,想了好半天*/

if(count1 == (N - 1)/2)

begin

clkA <= ~clkA

end

end

else

begin

clkA <= ~clkA

count1 <= 1'b0

end

always @ (posedge clk_re)

if(! rst)

begin

count2 <= 1'b0

clkB <= 1'b0

end

else

if(count2 <(N - 1))

begin

count2 <= count2 + 1'b1

if(count2 == (N - 1)/2)

begin

clkB <= ~clkB

end

end

else

begin

clkB <= ~clkB

count2 <= 1'b0

end

endmodule

这么高的频率不可能写出频率可变的方波,因为使用verilog只能对一个方波进行分频,而不能倍频。V5的片子跑到1G已经够高了,再高应该就不可能了,PLL生成1G的方波应该可以,指好肆但是1G的方波进行分频只能是2分频,4分频,6分频。。。。(如果不要求50%的占空比可以3分频,5分袜兆频。。。),唯轿也就是最多能出个500M.,333M,250M三个频率,要实现250M到500M以1M步进是不可能的,只能考虑模拟电路出波形。

library ieee

use ieee.std_logic_1164.all

entity count is

port (clk :in std_logic

rst: in std_logic

cout:out std_logic_vector(6 downto 0))

architecture bhv of count is

signal count:std_logic_vector(6 downto 0)

begin

process(clk,rst)

begin

if rst = '1' then

count<=(others=>'0')

elsif clk'event and clk= '1' then

if count>="1011001" then

count<=(others=>'0'物大)

else

count<=count+1

end if

end if

end process

end

接下来在进如橡行引脚分配,可以利用渣蚂旁xilinx的dcm进行分频和降频,这样就能控制频率


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8219818.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存