求用Verilog实现50MHz分频为8Hz的程序

2025年01月05日 09:00
有3个网友回答
网友(1):

50M分频道8hz的话 50 000 000/8=6250000
reg clk_div8;
reg [23:0]cnt;
always @(posedge clk)
begin
if(!rst_n)

begin

clk_div8<=0;
cnt<=0;

end
else if(cnt==24'd3125000)
begin

cnt<=0;
clk_div8<=~clk_div8;
end
end

分析:50M周围为20ns,在3125000*20ns=0.0625s后clk_div8翻转,即clk_div8周期为2*0.0625s=0.125s,然后就是8hz了,可以追问,望采纳

网友(2):

module gen_divd(reset,clkin,clkout);
input reset,clkin;
output clkout;
parameter divdWIDTH=1; //参数定义
parameter divdFACTOR=1;
reg clkout;
reg [divdWIDTH:0] cnt; //2位计数器,最大记到3

always @ (posedge reset or posedge clkin)
if(reset) // 高电平复位
begin
cnt<=0; //计数器清零
clkout<=0; //输出时钟清零
end
else
begin
cnt<=cnt+1'b1; //计数开始,来一个上升沿记一次数
if(cnt==(divdFACTOR-1)) //当cnt等于1
begin
cnt<=0; //计数器清零
clkout<=~clkout; //输出时钟翻转一次,就是简单的2分频
//假设开始clkout时低电平,当cnt计数到1(clkin刚好一个周期)时,clkout就翻转,变成高电平,clkout一个周期,相当于clkin的2个周期,实现2分频
end
end
endmodule

网友(3):

module (reset_n ,clk_50M,clk_8)
input wire reset_n ;
input wire clk_50M
output reg clk_8 ;

reg [21:0] div_cnt ; //分频计数器,用于分频计数加法操作
reg [21:0] div_cnt_t; //分频计数器,保持div_cnt值。用于分频计数判断,把计数器加法和分频值比较用触发器切开,这样时序上可跑更高的频率。

always@(posedge clk_50M or negedge reset_n)
begin
if(!reset_n)
div_cnt <= 'h0 ;
div_cnt_t <= 'h0 ;
else
div_cnt <=div_cnt +1 ;
div_cnt_t <= div_cnt ;
end

always@(posedge clk_50M or negedge reset_n)
begin
if(!reset_n)
clk_8 <= 'h0 ;

else if( div_cnt_t == 'h2faf07) //'h2faf07 为8Hz分频值。
clk_8 <= ~clk_8 ;
else
clk_8 <= clk_8 ;
end

endmodule