目录
在实际的项目工程中,经常需要不同的时钟频率工作,或者在一些笔试面试中,时钟分频也会被问到,因此这篇文章介绍几种常见的时钟分频的案例:偶数分频、奇数分频、任意小数分频。
偶数分频是最常见的分频方式也是最简单的,只需要一个简单的计数器即可,如果要实现4分频的时钟,只需要计数器从0计数到3,然后输出的时钟在计数到1和3的时钟翻转即可。
//`timescale 100ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: freq_div_even
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description: 实现偶数四分频
// Additional Comments:
//
//
module freq_div_even(
input clk,
input rst,
output reg clk_out
);
reg [1:0] cnt;
always @(posedge clk or posedge rst) begin
if (rst) begin
cnt <= 'd0;
end
else if (cnt == 'd3) begin
cnt <= 'd0;
end
else begin
cnt <= cnt + 'd1;
end
end
always @(posedge clk or posedge rst) begin
if (rst) begin
clk_out <= 'd0;
end
else if (cnt == 'd1) begin
clk_out <= 'd1;
end
else if (cnt == 'd3) begin
clk_out <= 'd0;
end
else begin
clk_out <= clk_out;
end
end
endmodule
`timescale 10ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: tb_freq_div_even
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description:
// Additional Comments:
//
//
module tb_freq_div_even();
reg clk;
reg rst;
wire clk_out;
initial begin
clk = 'd0;
rst = 'd1;
#20
rst = 'd0;
end
always #10 clk = ~clk;
freq_div_even inst_freq_div_even (
.clk(clk),
.rst(rst),
.clk_out(clk_out)
);
endmodule

可以看到原时钟为50Mhz,在四分频后时钟为12.5Mhz,符合设计要求。如果要设计八分频甚至更大的分频也是如此操作。

相对于偶数分频,奇数分频要复杂一些,不仅要实现奇数分频而且占空比为50%,这里需要多加一个计数器,一个计数器由输入时钟上升沿触发,另一个计数器由输入时钟下降沿触发,最后将两个计数器的输出做相运算,即可得到奇数分频并且占空比为50%的时钟。
//`timescale 100ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: freq_div_odd
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description: 实现奇数五分频
// Additional Comments:
//
//
module freq_div_odd(
input clk,
input rst,
output wire clk_out
);
reg [2:0] cnt1;
reg [2:0] cnt2;
reg clk1;
reg clk2;
always @(posedge clk or posedge rst) begin
if (rst) begin
cnt1 <= 'd0;
end
else if (cnt1 == 'd4) begin
cnt1 <= 'd0;
end
else begin
cnt1 <= cnt1 + 'd1;
end
end
always @(posedge clk or posedge rst) begin
if (rst) begin
clk1 <= 'd0;
end
else if (cnt1 < 'd2) begin
clk1 <= 'd1;
end
else begin
clk1 <= 'd0;
end
end
always @(negedge clk or posedge rst) begin
if (rst) begin
cnt2 <= 'd0;
end
else if (cnt2 == 'd4) begin
cnt2 <= 'd0;
end
else begin
cnt2 <= cnt2 + 'd1;
end
end
always @(negedge clk or posedge rst) begin
if (rst) begin
clk2 <= 'd0;
end
else if (cnt2 < 'd2) begin
clk2 <= 'd1;
end
else begin
clk2 <= 'd0;
end
end
assign clk_out = clk1 | clk2;
endmodule
`timescale 10ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: tb_freq_div_odd
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description:
// Additional Comments:
//
//
module tb_freq_div_odd();
reg clk;
reg rst;
wire clk_out;
initial begin
clk = 'd0;
rst = 'd1;
#20
rst = 'd0;
end
always #10 clk = ~clk;
freq_div_odd inst_freq_div_odd (
.clk(clk),
.rst(rst),
.clk_out(clk_out)
);
endmodule


任意小数分频如果要分的更细一些,可以分成半整数分数和非半整数的小数分频,因为半整数也属于小数,所以这里统一用任意小数分频的设计方法实现。
在设计时也可以选择直接调用 PLL 锁相环实现,比如要实现 6.3 的分频,可以先将源时钟 10 倍频,得到源时钟的 10 倍频率的时钟,再进行 63 分频实现,这样就可以得到 63 分频的时钟。
另外也可以自己设计实现,分频结果 N = M + P,其中 M 为小数分频值得整数部分,P 为小数分频值得小数部分,同时小数可以用分式表示 b/a+b,比如 0.3 可以表示为3/7+3,此时b = 3,则原式可以表示为 N = M + b/a+b,对 M 进行通分得到 N = M(a+b) + b/a+b = [aM + b(M+1)]/a+b,这样就可以列出二元一次方程,6.3分频可以写成分式63/10。
可以得到以下二元一次不等式:
6a + 7b = 63
a + b = 10
解得:a = 7,b = 3
表示先做 7 次 6 分频,再做 3 次 7 分频即可达到 6.3 分频的目的。
//`timescale 100ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: freq_div_decimal
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description: 实现任意小数分频,以6.3分频为例
// Additional Comments:
// 先做 7 次 6 分频,再做 3 次 7 分频
//
//
module freq_div_decimal(
input clk,
input rst,
output reg clk_out
);
reg [3:0] cnt1;
reg [3:0] cnt2;
always @(posedge clk or posedge rst) begin
if (rst) begin
cnt1 <= 'd0;
end
else if ((cnt2 < 'd7) &&(cnt1 == 'd5)) begin
cnt1 <= 'd0;
end
else if (cnt1 == 'd6) begin
cnt1 <= 'd0;
end
else begin
cnt1 <= cnt1 + 'd1;
end
end
always @(posedge clk or posedge rst) begin
if (rst) begin
cnt2 <= 'd0;
end
else if ((cnt2 == 'd9) && (cnt1 == 'd6)) begin
cnt2 <= 'd0;
end
else if ((cnt1 == 'd5) && (cnt2 < 'd7)) begin
cnt2 <= cnt2 + 'd1;
end
else if (cnt1 == 'd6) begin
cnt2 <= cnt2 + 'd1;
end
else begin
cnt2 <= cnt2;
end
end
always @(posedge clk or posedge rst) begin
if (rst) begin
clk_out <= 'd0;
end
else if ((cnt1 == 'd5) && (cnt2 < 'd7)) begin
clk_out <= 'd1;
end
else if (cnt1 == 'd6) begin
clk_out <= 'd1;
end
else begin
clk_out <= 'd0;
end
end
endmodule
`timescale 10ps / 1ps
//
// Engineer:
// Create Date: 2022/07/24
// Design Name:
// Module Name: tb_freq_div_even
// Tool Versions: Vivado 2021.2
// Encode: GBK
// Description:
// Additional Comments:
//
//
module tb_freq_div_even();
reg clk;
reg rst;
wire clk_out;
initial begin
clk = 'd0;
rst = 'd1;
#20
rst = 'd0;
end
always #10 clk = ~clk;
freq_div_decimal inst_freq_div_decimal (
.clk(clk),
.rst(rst),
.clk_out(clk_out)
);
endmodule

可以看到仿真波形,先经过了 7 次的 6 分频,再经过 3 次的 7 分频,最终形成 6.3 分频的时钟输出。

总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg