3分頻器 verilog解析

2021-07-23 03:49:48 字數 3695 閱讀 7278

分頻分為偶分頻和奇分頻。
分頻器從某種程度上來講是計數器有計畫的輸出。
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;

endelse if(count==0) // 第乙個clk上公升沿來的時候q翻轉一次計數器加一;

begin

q<=~q;

count<=count+1'b1;

endelse if(count==2) //第3個clk上公升沿來的時候輸出q翻轉一次計數器歸零;

begin

q=~q;

count<=2'b00; //把計數復位

endelse // 第二個clk上公升沿來的時候q不動作,計數器加一。

begin

count<=count+1'b1;

endendmodule

//測試**(testbench)適合xilinx的vivado

module 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;

endelse

if(k==2) //計數到3個邊沿之後。輸出時鐘就會翻轉一次。

begin

k<=0;

clk_3<=~clk_3;

endelse

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)

begin

if ( 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;

endcase

endalways @( posedge reset_n or posedge clk ) //the first divder module.

begin

if ( 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.

begin

if ( 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

verilog奇數分頻器的問題講解(7分頻為例)

先不多嗶嗶,直接上 veriloghdl 的後面講原理 module fenpin3 clk,clk7,rst input clk,rst 設定rst的目的是當rst 1的時候給cnt0和cnt1賦初值 output clk7 reg 2 0 cnt0,cnt1 定義兩個加法器分別生成兩個7分頻的訊...

N 0 5分頻器的verilog實現

先說一種設計思路 通過兩個分頻時鐘的與操作實現。兩個分頻時鐘的占空比均為 n 1 2 n 1 對於5.5分頻電路來講,其占空比為6 11,不過這兩個分頻時鐘乙個是基於時鐘上公升沿觸發乙個是基於時鐘下降沿觸發,並且時鐘的初始化值相反,這樣將這兩個時鐘相與就可以得到5.5分頻的電路了.module ha...

試驗二 分頻器實驗

對開發板上面的50mhz 輸入時鐘進行二的整數次冪分頻,冪數分別為 18,19,20,21,22,23,24,25,然後用分頻後的時鐘來控制開發板上面八個led 閃亮,觀 察分頻的效果。module fre clk,rst,led0,led1,led2,led3,led4,led5,led6,led...