【FPGA】分频器


分频器

分频器是数字系统设计中最常见的基本电路之一。所谓“分频”,就是把输入信号的频率成倍数的低于输入频率的输出信号。
分频器分为偶数分频器和奇数分频器,和计数器非常类似,有时候甚至可以说就是一个东西。

偶数分频器

这里用六分频器作为例子
在这里插入图片描述
波形图:
在这里插入图片描述
代码:

module divider_six
(
input wire sys_clk,
input wire sys_rst_n,

output reg clk_out
);
reg [1:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)
if (!sys_rst_n == 1`d0)
cnt <= 2`d0;
else if (cnt == 2`d2)
cnt <= 2`d0;
else 
cnt <= cnt+2`d0;

always@(posedge sys_clk or negedge sys_rst_n)
if (!sys_rst_n == 1`b0)
clk_out <= 1`b0;
else if(cnt == 2`d2)
clk_out <= ~clk_out;
else 
clk_out <= clk_out;



endmodule

电路图:
在这里插入图片描述

奇数分频器

波形图:
在这里插入图片描述
代码:

module divider_five
(
input wire sys_clk,
input wire sys_rst,

output wire clk_out

);
reg [2:0] cnt;
reg clk_1;
reg clk_2;

always @(posedge sys_clk or negedge sys_rst)
   if (!sys_rst == 1`b0)
	cnt <=3`d0;
	else  if(cnt == 3`d4)
	cnt <=3`d0;
	else 
	cnt <=cnt + 3`d1;
	
always@(posedge sys_clk or negedge sys_rst)
   if(!sys_rst ==1`b0)
	clk_1 <= 1`b0;
	else  if(cnt == 3`d2)
	clk_1 <= 1`b1;
	else  if ( cnt == 3`d4)
	clk_1 <= 1`b0;
	else clk_1 <= clk_1;

always@(posedge sys_clk or negedge sys_rst)
   if(!sys_rst ==1`b0)
	clk_2 <= 1`b0;
	else if (cnt ==3`d2)
	clk_2 <= 1`b1;
	else if (cnt == 3`d4)
	clk_2 <= 1`b0;
	else 
	clk_2 <= clk_2;
	
assign clk_out = (clk_1 | clk_2);

endmodule

电路图:
在这里插入图片描述

### Vivado FPGA 分频器 RTL 实现教程 #### 1. 偶数分频器的设计 偶数分频器可以通过简单的计数器实现。其基本原理是通过对输入时钟进行计数,在特定条件下切换输出时钟的状态。以下是基于 Verilog 的偶数分频器代码示例: ```verilog module even_divider #(parameter DIV_FACTOR = 2)( input wire clk, // 输入时钟 input wire reset, // 复位信号 output reg divided_clk // 输出时钟 ); reg [31:0] counter; always @(posedge clk or posedge reset) begin if (reset) begin counter <= 0; divided_clk <= 0; end else begin if (counter == DIV_FACTOR - 1) begin counter <= 0; divided_clk <= ~divided_clk; // 切换输出状态 end else begin counter <= counter + 1; end end end endmodule ``` 上述代码实现了对输入时钟 `clk` 进行偶数分频的功能,其中 `DIV_FACTOR` 定义了分频系数[^3]。 --- #### 2. 奇数分频器的设计 奇数分频器相比偶数分频器更加复杂,因为它通常需要在时钟的上升沿和下降沿分别处理。以下是一个典型的奇数分频器设计: ```verilog module odd_divider #(parameter DIV_ODD = 3)( input wire clk, // 输入时钟 input wire reset, // 复位信号 output reg divided_clk // 输出时钟 ); reg [31:0] counter; reg state; always @(posedge clk or posedge reset) begin if (reset) begin counter <= 0; divided_clk <= 0; state <= 0; end else begin if (state == 0 && counter == (DIV_ODD / 2)) begin divided_clk <= ~divided_clk; state <= 1; counter <= 0; end else if (state == 1 && counter == ((DIV_ODD - 1) / 2)) begin divided_clk <= ~divided_clk; state <= 0; counter <= 0; end else begin counter <= counter + 1; end end end endmodule ``` 此模块通过两个阶段来完成奇数分频操作,确保输出波形接近理想的占空比[^4]。 --- #### 3. 使用 PLL 实现分频 对于某些特殊需求(如小数分频),可以考虑使用 FPGA 中集成的 PLL 来实现更精确的分频效果。PLL 提供了一种硬件级解决方案,能够支持更高的分频倍率以及更好的性能表现[^2]。 ##### 示例 XDC 文件配置: 假设目标芯片为 Artix-7 系列,可以在项目目录下的 `.xdc` 文件中指定如下约束条件: ```tcl create_clock -name sys_clk -period 10.000 [get_ports clk_in] set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_in_IBUF] # 设置输出时钟频率 create_generated_clock -name div_clk \ -source [get_pins pll_inst/CLKOUT0] \ -divide_by 10 \ [master_clock sys_clk] ``` 以上脚本用于创建一个由 PLL 控制的新时钟信号,并将其分配给下游逻辑单元作为驱动源[^5]。 --- #### 4. 综合注意事项 无论采用哪种方法构建分频器,都需要注意以下几点事项: - **复位机制**:建议加入异步或同步复位功能以提高系统的鲁棒性和可维护性; - **资源优化**:合理调整参数大小避免占用过多 LUT 和 FF 资源; - **仿真验证**:务必运行完整的功能测试流程并观察波形图确认预期行为是否一致。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值