Verilog中分频数的计算

才开始学Verilog的时候不知道分频是怎么计算的,经过一段时间的学习后,总结如下,如有错误,请大家指正~
例如:系统频率为50M,要控制LED,系统频率太高,直接使用系统频率,人眼将无法看到灯的亮灭;因此要进行分频。那么分频数怎么求呢?
因为人眼所能看到灯光的闪烁最大频率是30-50Hz,所以低于30-50Hz的频率人眼才能看到。
系统·频率(FPGA晶振)50M意味着什么呢?对应的周期为1/50M=0.02us,每隔0.01us翻转一次,换言之为10ns翻转一次。
若我们设置频率为1Hz(小于30-50Hz,人眼可见灯光的闪烁),那么需要多少分频才行呢?计算公式如下:(系统频率÷所需频率-2)÷2=分频数(divcnt)
((50×106Hz÷1Hz)-2)÷2=24999999;
进行25,000,000分频,采用计数器的方式。当计数值达到25,000,000时令divclk翻转。(1/50*106)*25000000=1/2s,意思就是每0.5s翻转一次,周期为1s。对应过来的频率是1/T=1Hz,人眼可见。

always@(posedge clk or negedge Rst_n)
begin
	if(!Rst_n)
	div_cnt=0;
	else if(div_cnt==50000000)//2s/20ns÷2,将ns换算成s后计算
	begin divclk=~divclk;div_cnt=0;end
	else div_cnt=div_cnt+1'b1;
end

div_cnt是1,分频就为1*2+2,即四分频,如下图所示;
在这里插入图片描述为什么要加2是不是很疑惑?我的理解如下:
因为这里的1指隔1个周期
在这里插入图片描述

现附上灯1s翻转一次的完整代码,供大家理解本片博客分频数的计算,可以试着修改div_cnt来体会分频。

`timescale 1ns / 1ps
module LED_1(
input clk,
input Rst_n,
output reg led
);
reg [31:0]div_cnt;
reg divclk;
always@(posedge clk or negedge Rst_n)
begin
	if(!Rst_n)
	begin div_cnt=0;led<=0;divclk<=0;end
	else if(div_cnt==50000000)//2s/20ns÷2,将ns换算成s后计算
	begin divclk<=~divclk;div_cnt<=0;end
	else div_cnt<=div_cnt+1'b1;
end
always@(posedge divclk)
	begin
	led=~led;
	end
	
endmodule

Testbench如下:

module LED_1_tst();
reg clk;
reg Rst_n;
wire led;

LED_1 uut(.clk(clk),
.Rst_n(Rst_n),
.led(led));
initial
	begin
		clk=0;
		Rst_n=0;
		#100 Rst_n=1;
		//#1000 $finish;
	end
always #10 clk=~clk;
endmodule

我会在下一篇博客里,介绍如何用利用分频和计数器实现LED1s翻转一次,以及LED1ms亮,0.8ms灭。

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Verilog是一种硬件描述语言,可用于设计字电路。相位计算通常用于字信号处理等应用,用于确定信号的相位角度。以下是一个使用Verilog实现相位计算的简单示例。 ```verilog module phase_calculator ( input wire clk, // 输入时钟信号 input wire reset, // 输入复位信号 input wire sample_in, // 输入采样信号 output wire [7:0] phase_out // 输出相位结果 ); reg [7:0] phase_reg; // 相位寄存器 always @(posedge clk or posedge reset) begin if (reset) begin phase_reg <= 8'b00000000; // 复位相位寄存器 end else begin // 计算相位 if (sample_in) begin phase_reg <= phase_reg + 1; // 每个采样周期相位加1 end end end assign phase_out = phase_reg; // 输出相位结果 endmodule ``` 在这个示例,我们定义了一个模块`phase_calculator`,它有四个输入端口:时钟信号`clk`,复位信号`reset`,采样信号`sample_in`,以及一个8位输出端口`phase_out`,用于输出相位结果。 在`always`块,我们使用时钟信号和复位信号控制逻辑。当复位信号为高电平时,相位寄存器被复位为0。否则,在每个采样周期,如果采样信号为高电平,相位寄存器的值增加1。这样,我们可以通过对采样信号进行计,从而计算出信号的相位角度。 最后,我们使用`assign`语句将相位寄存器的值赋给输出端口`phase_out`,以便将结果输出到其他电路。 这只是一个简单的示例,实际的相位计算可能需要更复杂的逻辑和算法,具体取决于应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IC媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值