今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦。在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然连上我只有两个人,但丝毫不影响我们的工作热情和创业野心。合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下!

首先小编在这里分享一个基于Verilog语言的分频器设计,该分频器实现了奇数、偶数、小数(0.5)分频,可综合,能跑700M左右的时钟,基本能够满足大部分应用需求。

一:背景

前天,组长交待一个任务,关于光纤通道时钟同步模块的设计。里面需要用到一个10M的时钟,而我的PCIe时钟为125M,所以需要一个12.5分频的分频器。小编偷懒从网上搜了一个,代码简洁,行为仿真也没问题,直接就用上了。昨天组长调用我的设计,发现综合出现了问题,一查代码,把我批了一通,还暂时取消了我带小弟的资格,原因就出在这分频器上。

二:问题代码分析

 module divf #
( parameter N = , // 分频数
parameter state= //奇偶分频为0,半分频为1
)
(
input clr,
input clk,
output clkout
); reg [:] M;
reg [:] count; always@(posedge clk or negedge clk)
begin
case(state)
:begin
if(!clr) count<=*N-;
else if(count==*N-)
begin
count<=;
M<=; //只on一个clk
end
else count<=count+;
end :begin
if(!clr) count<=*N;
else if(count==*N)
begin
count<=;
M<=N+;
end
else count<=count+;
end default:;
endcase
end assign clkout=(count<M)?:; endmodule

看到这样的代码,像我一样的菜鸟见了都会怦然心动,但仔细分析,问题就出来了。

always@(posedge clk or negedge clk)

触发器(FF)一般是上升沿触发,我做过实验,即使想要下降沿触发,布局布线后也会有一个反相器反相后用上升沿去触发。若同时使用上升沿和下降沿触发,例如always@(posedge clk or negedge clk),布局布线后等效于always@(posedge clk)。所以上面这种写法,若不是采用特定器件如ODDR,是很难完成上下时钟沿都采数据的(应该还有别的方法,请大牛不吝赐教)。所以如果用在高速时钟上,建议不要采用这种写法。

 assign clkout=(count<M)?1:0;

组合逻辑输出问题,如果时钟频率较高,100M以上,组合逻辑的延时很有可能超过时钟的建立时间,会产生毛刺,所以我们一般都要求寄存器打一拍输出。上面这个例子中,clkout=(count<M)?1:0; 比较器是个延时比较多的器件,所以对时钟要求高的情况下不能使用。

三:解决方案

使用两个always块,但两个always块不能对同一变量进行操作。

Always@(posedge clk) begin  … end

Always@(negedge clk) begin  … end

或者使用锁相环产生两个频率相同,相位差180度的clk,然后在每个上升沿输出

Always@(posedge clk1) begin  … end

Always@(negedge clk2) begin  … end

针对组合逻辑输出问题,能避免使用则避免使用,如果非要使用,也只能使用足够简单的组合逻辑,比如与或非逻辑。

四:代码示例

说明:用一个大case分三类讨论,看上去很挫,实际是为了裁剪方便。

代码功能:完成奇数分频和偶数分频,占空比50%。完成n+0.5分频,占空比无要求。

 module divf #
( parameter Div_num = , // 分频数
parameter state= //半分频为0,奇数分频为1,偶数分频为2
)
(
input clr,
input clk,
output Div_clk
);
reg [:] count; case(state)
: begin //ji_shu
reg pos_clk;
reg neg_clk; always@(posedge clk or negedge clr)
if(!clr) count<=;
else if(count== & pos_clk) count<=Div_num/-;
else if(count==) count<=Div_num/;
else count<=count-; always@(posedge clk or negedge clr)
if(!clr) pos_clk<=;
else if(count==) pos_clk<=~pos_clk;
else pos_clk<=pos_clk; always@(negedge clk or negedge clr)
if(!clr) neg_clk<=;
else neg_clk<=pos_clk; assign Div_clk = pos_clk & neg_clk;
end : begin //ou_shu
reg Div_clk1; always@(posedge clk or negedge clr)
if(!clr) count<=;
else if(count==) count<=Div_num/-;
else count<=count-; always@(posedge clk or negedge clr)
if(!clr) Div_clk1<=;
else if(count==) Div_clk1<=~Div_clk1; assign Div_clk = Div_clk1;
end : begin //ban_fen_pin
reg count_div;
reg count_div2;
wire clk_half; assign clk_half = clk^count_div2;
always@(posedge clk_half or negedge clr) //模Div_num 计数
if(!clr) count<=;
else if(count== Div_num-) count<=;
else count<=count+; always@(posedge clk_half or negedge clr) //模Div_num 计数
if(!clr) count_div<=;
else if(count== Div_num-) count_div<=;
else count_div<=; always@(posedge count_div or negedge clr) //对count_div二分频
if(!clr) count_div2<=;
else count_div2<=~count_div2; assign Div_clk = count_div;
end
endcase endmodule

五:仿真代码及结果

 module test_divf;
reg clk;
reg clr;
wire Div_clk; always # clk=~clk; initial
begin
# clr=;clk=;
# clr=;
//#1000 $stop;
end divf #
(
.Div_num ( ),
.state ( )
)divf(
.clr ( clr ),
.clk ( clk ),
.Div_clk ( Div_clk )
); endmodule

仿真结果

Div_num=5,state=1,实现5分频

Div_num=6,state=2,实现6分频

Div_num=6,state=0,实现5.5分频

六:总结

看到这个时候,如果您还记得我在开头说过要作一首诗,那么请您一定要关注“硬件为王”这个微信公共号(二维码见最下方),因为您是不折不扣的逻辑设计分析师。如果您已经忘了这个事了,很可能您只是百度进来抄代码的,那也请您关注“硬件为王”,因为我们会定期放出一些有用的代码和相关知识,上百度找总不如直接推送到手机上来的方便吧。

谢谢各位看官,请求大家多多支持并随时给我们提出宝贵意见!

基于Verilog的奇数偶数小数分频器设计的更多相关文章

  1. Verilog 任意(奇数/偶数)分频器

    参加过一次笔试,让实现3分频,楼主当时是懵逼的,脑子里只知道同时利用上升沿和下降沿,本来写对了,慌张面试,脑子不管用了,(因为是手写,只能用脑子仿真)后来又给改错了,捂脸... 还是逻辑不清晰,现在自 ...

  2. 基于Verilog HDL的超前进位全加器设计

    通常我们所使用的加法器一般是串行进位,将从输入的ci逐位进位地传递到最高位的进位输出co,由于电路是有延迟的,这样的长途旅行是需要时间的,所以为了加快加法器的运算,引入了超前进位全加器. 全加器的两个 ...

  3. 基于Verilog的偶数、奇数、半整数分频以及任意分频器设计

    在FPGA的学习过程中,最简单最基本的实验应该就是分频器了.由于FPGA的晶振频率都是固定值,只能产生固定频率的时序信号,但是实际工程中我们需要各种各样不同频率的信号,这时候就需要对晶振产生的频率进行 ...

  4. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  5. 基于Verilog HDL 的数字时钟设计

    基于Verilog HDL的数字时钟设计 一.实验内容:     利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...

  6. 基于Verilog HDL 的数字电压表设计

    本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...

  7. verilog简易实现CPU的Cache设计

    verilog简易实现CPU的Cache设计 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4661147.html所增加的Cache,相同的内容就不重复写了 ...

  8. 基于Verilog HDL 各种实验

    菜鸟做的的小实验链接汇总:           1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...

  9. 基于FPGA的VGA可移植模块终极设计【转】

    本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯   基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事, ...

随机推荐

  1. javaEE-EJB学习笔记

    EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序.简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行.凭借java跨平台的优势,用EJB技术部署的分布式系 ...

  2. 【转】教你弄清 OSX 的睡眠模式,以及合法的禁止产生 sleepimage

    原文链接 因为之前用的是网上流传的土法来禁止生成 sleepimage,尝到了苦头,而且2次! 大家知道 OSX 有几种睡眠模式,其中 hibernatemode 可以是 0 (传统睡眠方式,不生成 ...

  3. linux之redis

    配置环境变量的命令: 修改环境变量: vim /root/.bash_profile 添加以下配置: export PATH=/server/tools/redis/src:$PATH 激活环境变量 ...

  4. 选择 Java 编写 iOS 与 安卓 App的八大理由

    [编者按]本文作者为 RoboVM 的 CEO 兼联合创始人 Henric Müller,主要介绍选用 Java 编写移动应用的八大理由.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在过 ...

  5. springboot 文件上传 java.io.IOException: The temporary upload location [/tmp/xx] is not valid

    转自:http://meia.fun/article/1541578061808 首先分析下出现问题的原因:linux 下的 /tmp 目录,是用来存储由各种程序创建的临时文件的地方.一些配置,导致系 ...

  6. Selenium clear()方法无法清掉数据

    问题描述 clear()方法执行过后, 数据还是在. 根本原因 存在镜像节点. 操作clear()清掉数据后, 镜像节点的数据还在, 就会再补充回去. 解决办法 添加下面代码就可以连同镜像的数据一起去 ...

  7. C#实现字符串计算

    借用DataTable的Compute函数进行计算. string formula = "1+1*4/3+23*(1+2)"; DataTable dt = new DataTab ...

  8. iOS设计模式 - 备忘录

    iOS设计模式 - 备忘录 原理图 说明 1. 在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态 2. 本人已经将创建状态与恢复状态 ...

  9. MVC中JavaScript和CSS的自动打包与压缩

    在程序中安装System.Web.Optimization程序集 依赖关系如下图所示: 添加BundleConfiguration类 代码如下所示 注意必须使用对应的ScriptBundle和Styl ...

  10. Cloudstack

    1.cloudstack介绍 一个开源具有高可用性及扩展性的云计算平台,Cloudstack是一个开源的云操作系统: cloudstack支持管理大部分主流的hypervisors,如:VMware, ...