3分频器 verilog解析
来源:互联网 发布:mac python 编辑:程序博客网 时间:2024/04/29 20:04
<span style="font-size:18px;">分频分为偶分频和奇分频。</span>
<span style="font-size:18px;">分频器从某种程度上来讲是计数器有计划的输出。</span>
1.偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。这种方法可以实现任意的偶数分频。
2.奇数倍分频:
A、第一种比较简单的办法,通过计数器来实现。如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到0的时候输出的时钟翻转一次,当计数器计数到2(1也是可以的,只要在0-2之间输出时钟变化一次即可)的时候再翻转一次这样就可实现三分频,不过这种方法得到的时钟占空比不是那么的优美,是1/3或者是2/3。下面是对应的三分频verilog代码和相应的testbench代码。
//三分频,占空比不是50%。module div_3 (q,clk,reset); output q; input reset; input clk; reg q; reg [1:0] count; // 设了一个2位的计数器可以从0计数到2;always @ (posedge clk or posedge reset) // 同步复位,上升沿有效 if (reset) // 复位 begin q<=1'b0; count<=2'b00; end else if(count==0) // 第一个CLK上升沿来的时候q翻转一次计数器加一; begin q<=~q; count<=count+1'b1; end else if(count==2) //第3个CLK上升沿来的时候输出q翻转一次计数器归零; begin q=~q; count<=2'b00; //把计数复位 end else // 第二个CLK上升沿来的时候q不动作,计数器加一。 begin count<=count+1'b1; endendmodule
<pre name="code" class="html">//测试代码(testbench)适合xilinx的vivadomodule test; reg clk; reg reset; wire q; div_3 d3 (q,clk,reset);always #20 clk=~clk; initial begin clk=1'b0; reset=1'b1; #24 reset =1'b0; endendmodule
下面是仿真出来的结果,最后输出的时钟的周期是原来时钟周期的三倍,但是唯一不同的地方就是占空比不是50%。
B、如果对于自己的结果不是很满意,可以再搞一个占空比是50%的出来,先把原理讲一下:
1)首先,如果我们同时利用时钟的上升沿和下降沿来制作一个分频器,这个只是理论上的,一般不用这种方法。
我们还是来整三分频的分频器。用一个3模的计数器,时钟的上上沿和下降沿都计数,那么当计数器从0计数到2的时候输出时钟就会翻转一次,计数器复位,然后等待计数3次之后再翻转一次,计数器复位。用代码表示是这个样子的。
always @( posedge clk or negedge clk) //时钟的上升沿河下降沿都有效 if(reset) begin k<=0; clk_3<=0; end else if(k==2) //计数到3个边沿之后。输出时钟就会翻转一次。 begin k<=0; clk_3<=~clk_3; end else k<=k+1;2)接下来搞一种用“”或“”逻辑来实现奇数分频的技术。
接着来玩儿三分频的计数器。
module fdiv( clk, reset_n, clkout );input clk;input reset_n;output clkout;reg [1:0] count;reg div1;reg div2;wire clkout;always @(posedge clk)beginif ( reset_n ) count <= 2'b00;else case ( count ) 2'b00 : count <= 2'b01; 2'b01 : count <= 2'b10; 2'b10 : count <= 2'b00; default : count <= 2'b00; endcaseendalways @( posedge reset_n or posedge clk ) //the first divder module.beginif ( reset_n ) div1 <= 1'b1; //this is the first problem that I wanna to solve, because I just wondering the "1" cannot make a high level. else if ( count == 2'b00 ) div1 <= ~ div1;endalways @( posedge reset_n or negedge clk ) //the second divder module.beginif ( reset_n ) div2 <= 1'b1;else if ( count == 2'b10 ) div2 <= ~ div2;endassign clkout = div1 ^ div2;endmodule这是验证代码
`timescale 1ns/1ns//`include "fdiv.v"module fsim(); reg clk; //input 对应的端口应当申明为 reg, reg reset_n; wire clkout; //output 对应的端口申明为 wire, // wire[2:0] div1; //怎么让结果里面显示出来中间的一些变量的变化 fdiv fdiv( clk, reset_n, clkout ); always #20 clk=~clk; initial begin clk=1'b0; reset_n=1'b1; #40 reset_n =1'b0; endendmodule
0 0
- 3分频器 verilog解析
- Verilog分频器
- Verilog 分频器
- verilog分频器代码
- verilog分频器代码
- [FPGA] 单数分频器Verilog
- verilog分频器设计
- verilog语言设计分频器
- verilog-分频器的设定
- verilog hdl 分频器
- Verilog实现分频器
- Verilog任意整数分频器
- Verilog语言——20分频器
- 分频器的几种写法.[Verilog]
- 用Verilog语言实现任意整数分频器
- verilog学习笔记——偶数分频器
- 分频器
- 分频器
- 回文检测(包含中文与字符)
- C# Tcp协议收发数据(TCPClient发,Socket收)
- Jenkins构建Android项目持续集成之findbugs的使用
- Python学习笔记:Python的名字空间
- oracle的sql
- 3分频器 verilog解析
- 窗体效果
- oracleorc存储过程&函数&触发器
- java 中基本数据类型在内存中占据的存储大小
- 判断平年闰年
- Linux用户和组的操作
- orc的plsql和动态sql
- 【计算机网络】 之 VLSM
- Android初级学习之Intent的简单使用