分频器 偶分频 奇分频 任意分频

2023-10-19 16:08
文章标签 任意 分频器 分频

本文主要是介绍分频器 偶分频 奇分频 任意分频,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天学习了一下分频器及其Verilog实现

1.偶分频

实现一个NUM_DIV分频的分频器,下面代码中 NUM_DIV= 6,占空比50%

设计代码


module divider_even(clk,rst_n,clk_div);input clk;input rst_n;output clk_div;reg clk_div;parameter NUM_DIV = 6;reg    [3:0] cnt;always @(posedge clk or negedge rst_n)if(!rst_n) begincnt     <= 4'd0;clk_div    <= 1'b0;endelse if(cnt < NUM_DIV / 2 - 1) begincnt     <= cnt + 1'b1;clk_div    <= clk_div;endelse begincnt     <= 4'd0;clk_div    <= ~clk_div;endendmodule

仿真代码

 module divider_tb();reg clk;reg rst_n;wire clk_div;parameter DELY=100;
divider_even U_divider(.clk    (clk    ),.rst_n    (rst_n    ),.clk_div(clk_div)
);always #(DELY/2) clk=~clk;//??????
/*initial begin$fsdbDumpfile("divider_even.fsdb");$fsdbDumpvars(0,U_divider);end*/initial beginclk=0;rst_n=0;#DELY rst_n=1;//#((DELY*20)) $finish;
end
endmodule

波形图

从波形图中可以看到,clk_div的时钟频率是clk的1/6;计数cnt = 3清零

 

2.奇分频

设计目标:实现一个占空比50%,5分频的分频器

遇到一个错误,寄存器变量不能使用连续赋值语句

assign clk_div = clk_div1 | clk_div2;

** Error: E:/questasim/examples/labs/divider/odd_divider.v(53): Register is illegal in left-hand side of continuous assignment

解决方案很简单,只需要加一个initial,把这个赋值语句放在过程块里面就好了;

设计代码


//rtl
module divider_odd(clk,rst_n,clk_div
);input clk;input rst_n;output clk_div;reg clk_div;parameter NUM_DIV = 5;reg[2:0] cnt1;reg[2:0] cnt2;reg    clk_div1, clk_div2;always @(posedge clk or negedge rst_n)if(!rst_n)cnt1 <= 0;else if(cnt1 < NUM_DIV - 1)cnt1 <= cnt1 + 1'b1;elsecnt1 <= 0;always @(posedge clk or negedge rst_n)if(!rst_n)clk_div1 <= 1'b1;else if(cnt1 < NUM_DIV / 2)clk_div1 <= 1'b1;elseclk_div1 <= 1'b0;always @(negedge clk or negedge rst_n)if(!rst_n)cnt2 <= 0;else if(cnt2 < NUM_DIV - 1)cnt2 <= cnt2 + 1'b1;elsecnt2 <= 0;always @(negedge clk or negedge rst_n)
beginif(!rst_n)clk_div2 <= 1'b1;else if(cnt2 < NUM_DIV / 2)clk_div2 <= 1'b1;elseclk_div2 <= 1'b0;
endinitial
assign clk_div = clk_div1 | clk_div2;endmodule

仿真代码

//tb
module divider_tb();reg clk;reg rst_n;wire clk_div;parameter DELY=100;
divider_odd U_divider(.clk    (clk    ),.rst_n    (rst_n    ),.clk_div(clk_div)
);always #(DELY/2) clk=~clk;//??????
/*initial begin//   $fsdbDumpfile("divider_odd.fsdb");//  $fsdbDumpvars(0,U_divider);//end
*/initial beginclk=0;rst_n=0;#DELY rst_n=1;//#((DELY*20)) $finish;
end
endmodule

波形图

从波形图可以看到,实现了5分频,占空比50%

 3.任意占空比,任意分频

设计目标:时钟信号50M分频产生880Hz,而分频得到的信号的占空比为30%

设计代码


//rtl
module div_any(clk,rst_n,clk_div,counter
);input clk,rst_n;output clk_div;reg clk_div;output [15:0] counter;reg [15:0] counter;always @(posedge clk)if(!rst_n)counter <= 0;else if(counter==56817)counter <= 0;else counter <= counter+1;always @(posedge clk)if(!rst_n)clk_div <= 0;else if(counter<17045)clk_div <= 1;elseclk_div <= 0;endmodule

仿真代码


//tb
module div_tb();reg clk;reg rst_n;wire clk_div;wire [15:0] counter;parameter DELY=100;
div_any U_div(.clk    (clk    ),.rst_n  (rst_n  ),.counter(counter),.clk_div(clk_div)
);always #(DELY/2) clk=~clk;//??????
/*initial begin$fsdbDumpfile("div_any.fsdb");$fsdbDumpvars(0,U_div);end*/initial beginclk=0;rst_n=0;#DELY rst_n=1;#((DELY*80000)) $finish;
end
endmodule

波形图

 

 参考Verilog设计分频器(面试必看) - Zhangxianhe - 博客园

本文的波形都是自己仿真生成的

这篇关于分频器 偶分频 奇分频 任意分频的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240877

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统

linux 内核提权总结(demo+exp分析) -- 任意读写(二)

hijack_vdso篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改

linux 内核提权总结(demo+exp分析) -- 任意读写(一)

cred篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   每个线程在内核中都对应一个线程结构块thread_infothread_info中存在task_struct类型结构体 struct t

【视频教程】手把手AppWizard轻松制作一个emWin滑动主界面控制框架,任意跳转控制(2024-09-06)

现在的新版AppWizard已经比较好用,用户可以轻松的创建各种项目常规界面。 比如早期创建一个支持滑动的主界面框架,并且可以跳转各种子界面,仅仅界面布局和各种图片格式转换都要花不少时间,而现在使用AppWizard,可以说轻轻松松,毫不费力。 用户唯一要做的就是根据自己的芯片性能做一定的速度优化。 视频: https://www.bilibili.com/video/BV17Rp3eLE

短剧影视小程序任意文件读取

1 漏洞描述: 任意文件读取: 在/Ems.php 控制器中的 juhecurl 方法存在curl_exec函数,且参数url为用户可控,导致漏洞产生 2 搜索语句: Fofa: "/VwmRIfEYDH.php"   3 漏洞复现: poc GET /api/ems/juhecurl?url=file:///etc/passwd HTTP/1.1Host: your-ip

【漏洞复现】赛蓝企业管理系统 GetJSFile 任意文件读取漏洞

免责声明:         本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规或服务协议。同时,未经授权地访问系统、网络或应用程序可能导致法律责任或其他严重后果。作者不对读者基于本文内容而产生的任何行为或后果承担

【网络安全】Jenkins任意文件读取漏洞及检测工具(CVE-2024-23897)

原创文章,不得转载。 文章目录 漏洞成因影响范围检测工具更多细节 漏洞成因 Jenkins CLI 接口存在任意文件读取漏洞(CVE-2024-23897)。该问题源于 args4j 库在解析文件名参数时,会将@符号后的字符串视为文件名并尝试读取文件,而且该功能默认处于启用状态。 影响范围 Jenkins weekly <= 2.441 Jenkins LTS <=

js算法题,给任意一个偶数,找出他的所有的质数因子

/*给任意一个偶数,找出他的所有的质数因子*/ function primeFactor(n){     var factors=[],            divistor=2;     if(typeof n !=='number'||!Number.isInteger(n)){          return 0;     }; //如果不是偶数返回0,如果是0,返回0