使用計數器控制暫存器反轉,很容易實現奇數倍分頻,但是新增了占空比為50%這一限制條件的話,有些同學就會犯難,因為數位電路不存在小數,而奇數除以二卻是乙個小數,這導致占空比為50%無法實現。本文將通過**的方式詳細解答這個問題。
解這個題的思路非常簡單,就是通過計數器控制兩個暫存器實現兩個占空比小於50%的奇數倍分頻,但是這兩個暫存器的時鐘控制乙個是上公升沿觸發,乙個是下降沿觸發,這會導致生成兩個相位差為90度的時鐘。對這兩個時鐘進行或運算,就可以得出結果。
實現**
module divfrequency(
clk,
rst_n,
clk_out);
input clk;
input rst_n;
output clk_out;
parameter n =
3'd5;//n為變頻數,可以變換
wire clk_out;
reg clk_reg1;
reg clk_reg2;
reg [2
:0]div_cnt;
wire [2
:0]a;
wire [2
:0]b;
assign a = n>
>1;
//n>
>
1相當於除以2然後取整
assign b = n -
1'b1;
always@(posedge clk or negedge rst_n )
//計數器
if(!rst_n)
div_cnt <=0;
else
if(div_cnt =
= b)
div_cnt <=0;
else
div_cnt <= div_cnt+
1'b1;
always@(posedge clk or negedge rst_n )
//第乙個時鐘暫存器
if(!rst_n)
clk_reg1 <=0;
else
if(div_cnt ==0
) clk_reg1 <= ~clk_reg1;
else
if(div_cnt =
= a)
clk_reg1 <= ~clk_reg1;
always@(negedge clk or negedge rst_n )
//第二個時鐘暫存器
if(!rst_n)
clk_reg2 <=0;
else
if(div_cnt ==1
)//由於是下降沿觸發,而計數器是上公升沿觸發,故比第乙個時鐘多1
clk_reg2 <= ~clk_reg2;
else
if(div_cnt =
= a +
1'b1 )//同上
clk_reg2 <= ~clk_reg2;
assign clk_out = clk_reg1|clk_reg2;
endmodule
測試**
`define clock_period 20
`timescale 1ns/
1nsmodule divfrequency_tb;
reg clk;
reg rst_n;
wire clk_out;
initial
begin
clk =1;
end always #(`clock_period/
2) clk = ~clk;
divfrequency u0(
clk,
rst_n,
clk_out);
initial
begin
rst_n =1;
#(`clock_period)
rst_n =0;
#(`clock_period)
rst_n =1;
#(`clock_period*40)
$stop
;end
endmodule
modelsim**結果 FPGA實現任意奇數分頻
我們都知道用fpga做偶數分頻很簡單,只需要用計數器計數到分頻係數n的一半再減去1,不斷去翻轉分頻的訊號即可得到分頻的訊號,那麼奇數奇數分頻其實也是一樣的,但是如果要得到占空比為50 的訊號,那可能就需要處理一下才可以,下圖為占空比為50 的3分頻訊號產生原理。利用原始訊號的上公升沿產生乙個三分頻的...
面試題 並查集
n個數,分別是1 n,現把他們分堆並給出兩兩關係例如2 5 1 5,給出關係的兩個數必須在同一堆,問最大分堆數。建圖dfs或者並查集。沒有寫,先貼乙個模板上來。1389.cpp 定義控制台應用程式的入口點。並查集,求每個集合中的元素個數 在合併時將子樹中的結點數目加到根結點 include stda...
FPGA工程師筆試面試題(二)
1 ic設計中同步復位與非同步復位的區別 同步復位在時鐘沿才復位訊號,完成復位動作。非同步復位不管時鐘,只要復位訊號滿足條件,就完成復位動作。非同步復位對復位訊號要求比較高,不能有毛刺,如果其與時鐘關係不確定,也可能出現亞穩態。2 moore 與 mealy狀態機的特徵 兩種典型的狀態機是摩爾 mo...