基于verilog的分頻器設計(奇偶分頻原理及其電路實現:上)

在一個數字系統中往往需要多種頻率的時鐘脈沖作為驅動源,這樣就需要對FPGA的系統時鐘(頻率太高)進行分頻。分頻器主要分為奇數分頻,偶數分頻,半整數分頻和小數分頻,在對時鐘要求不是很嚴格的FPGA系統中,分頻器通常都是通過計數器的循環來實現的。

偶數分頻:假設為N分頻,由待分頻的時鐘觸發計數器計數,當計數器從0計數到N/2-1時,輸出時鐘進行翻轉,并給計數器一個復位信號,使得下一個時鐘從零開始計數。以此循環下去。這種方法可以實現任意的偶數分頻。如圖所示,兩個D觸發器級聯實現四分頻電路,原理:來一個時鐘脈沖,D端數據就被送到輸出端Q,同時輸出一個反向數據到Q非端,下一個時鐘脈沖到,重復上面過程,但數據己被取反,由此每兩個時鐘,Q端數被取反一次,由此得到二份頻,繼而得到四分頻。

image_thumb1

Tips: D觸發器的工作原理(驗證其狀態不變,可先假定初值為0或為1,根據邏輯關系分析)

image_thumb3

D觸發器的狀態表:CP為時鐘,R為置零端,S為置1端,D為信號輸入端,輸出信號有Q。

image

實現D觸發器功能的verilog代碼為

module D(q,qn,d,cp,r,s);
output q,qn; //D  觸發器的兩個輸出
input d,cp,r,s; //D  觸發器的四個輸入
reg q,qn; // 輸出寄存器
always@(posedge cp)  //在 在 cp  的上升沿觸發
begin
if({r,s}==2'b01) // 判斷是否有 r=0,s=1
begin
q=1'b0;
qn=1'b1;
end
else if({r,s}==2'b10) // 判斷是否有 r=1,s=0
begin
q=1'b1;
qn=1'b0;
end
else if({r,s}==2'b11) // 判斷是否有 r=1 ,s=1
begin
q=d;
qn=~d;
end
end
endmodule

對于分頻系數為10的分頻器,本例的輸入時鐘系統50M時鐘(clk_50M),輸出為十分頻時鐘(f_50)。設置一個3位的計數器,當計時寄存器到4(10/2-1)時,將輸出分頻信號取反即可得到10分頻的輸出。下圖分別為功能仿真和時序仿真(存在延遲)

module fengping_2(clk_50M,f_10);
input clk_50M; // 系統輸入時鐘,50M ,周期 20ns
output f_10;  //10  分頻輸出,5M
reg f_10;  // 輸出寄存器
reg[2:0] cnt;  // 計數寄存器
always@(posedge clk_50M) // 每個時鐘周期的上升沿觸發,
// 執行 begin_end  中的語句
begin
if(cnt==3'b100)  // 判斷 cnt  是否為 4, 是的話執行以下程序
begin
f_10<=~f_10; //把 把 f_10  取反
cnt<=3'b0;  // 計數寄存器清零
end
else //cnt  沒到 4 ,執行以下程序
begin
cnt<=cnt+3'b1;// 計數寄存器自加一
end
end
endmodule

image

image

奇數分頻:首先,完全可以通過計數器來實現,如進行三分頻,通過待分頻時鐘上升沿觸發計數器進行模三計數,當計數器計數到鄰近值進行兩次翻轉,比如可以在計數器計數到1時,輸出時鐘進行翻轉,計數到2時再次進行翻轉。即是在計數值在鄰近的1和2進行了兩次翻轉。這樣實現的三分頻占空比為1/3或者2/3。如果要實現占空比為50%的三分頻時鐘,可以通過待分頻時鐘下降沿觸發計數,和上升沿同樣的方法計數進行三分頻,然后下降沿產生的三分頻時鐘和上升沿產生的時鐘進行相或運算,即可得到占空比為50%的三分頻時鐘。這種方法可以實現任意的奇數分頻。歸類為一般的方法為:對于實現占空比為50%的N倍奇數分頻,首先進行上升沿觸發進行模N計數,計數選定到某一個值進行輸出時鐘翻轉,然后經過(N-1)/2再次進行翻轉得到一個占空比非50%奇數n分頻時鐘。再者同時進行下降沿觸發的模N計數,到和上升沿觸發輸出時鐘翻轉選定值相同值時,進行輸出時鐘時鐘翻轉,同樣經過(N-1)/2時,輸出時鐘再次翻轉生成占空比非50%的奇數n分頻時鐘。兩個占空比非50%的n分頻時鐘相或運算,得到占空比為50%的奇數n分頻時鐘。

module fenpin(input  i_clk,input  i_rst_n,output o_clk
);// log2(3) = 1.5850 <= 2  
reg [1:0] cnt_p;                        // 上升沿計數子// 3位上升沿計數器: 0 ~ 2
always @ (posedge i_clk, negedge i_rst_n)
beginif (!i_rst_n)cnt_p <= 0;elsebeginif (cnt_p == 2)            //2=3-1cnt_p <= 0;elsecnt_p <= cnt_p + 1'b1;end
end// log2(3) = 1.5850 <= 2  
reg [1:0] cnt_n;                        // 下降沿計數子// 3位下降沿計數器: 0 ~ 2
// 2 = 3 - 1
always @ (negedge i_clk, negedge i_rst_n)
beginif (!i_rst_n)cnt_n <= 0;elsebeginif (cnt_n == 2)                  //2=3-1cnt_n <= 0;elsecnt_n <= cnt_n + 1'b1;end
endreg o_clk_p;                            // 上升沿時鐘輸出寄存器// 輸出上升沿時鐘
// 0     ~ 1 ↑-> 1
// (1+1) ~ 2 ↑-> 0
// 1 = 3>>1
// 2 = 3 - 1
always @ (posedge i_clk, negedge i_rst_n)
beginif (!i_rst_n)o_clk_p <= 0;elsebeginif (cnt_p <= 1)                     // 1 = 3>>1 ,右移相當于除以2o_clk_p <= 1;elseo_clk_p <= 0;end
endreg o_clk_n;                            // 下降沿時鐘輸出寄存器// 輸出下降沿時鐘
// 0     ~  1 ↓-> 1
// (1+1) ~  2 ↓-> 0
// 1 = 3>>1
// 2 = 3 - 1
always @ (negedge i_clk, negedge i_rst_n)
beginif (!i_rst_n)o_clk_n <= 0;elsebeginif (cnt_n <= 1)                     // 1 = 3>>1 o_clk_n <= 1;elseo_clk_n <= 0;end
endassign o_clk = o_clk_n & o_clk_p;       // 按位與(作用:掩碼)endmodule

image

轉載于:https://www.cnblogs.com/Fun-with-FPGA/p/4700631.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java判斷布爾類型是否相等

public class Solution{public static void main(String args[]){boolean x1 true;boolean x2 false;boolean x3 true;if(x1!x2){System.out.println("布爾類型變量判斷是否相等可以用!");}if(x1x3){System.out.println("布爾類型變量判斷是否相等可以用&quo…

mysql 中文亂碼解決方法

最近在.NET 項目中用EF連接mysql&#xff0c;插入中文數據時老是顯示亂碼&#xff0c;在創建表時都已將編碼指定了&#xff0c;但是還是出現亂碼&#xff0c;折騰了一陣子才發現在連接字符串里面也要加上指定編碼 Character Setutf8(serverXXXXX;user idXXXX;passwordXXXXX;Cha…

提升您的休眠引擎

是否想知道如何調整基于Hibernate的應用程序以獲得無縫的可伸縮性和最佳性能&#xff1f; 本文探討了基于Hibernate的應用程序的調整技術&#xff0c;重點是有效但文獻記載不足的調整主題&#xff0c;例如繼承映射&#xff0c;二級緩存和增強的序列標識符生成器。 它還提供了一…

力扣53. 最大子序和

給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 思路&#xff1a;每個循環中&#xff0c;sum表示以nums[i]結尾的最大子序和&#xff0c;res表示目前得到的最大子序和。當循環結…

Swift中的延遲加載(懶加載)

Swift方式的延遲加載 而在Swift中&#xff0c;你只需一行代碼即可實現此機制&#xff1a; lazy var players String[]() 簡單、簡潔&#xff0c;直入主題。 但你得記住&#xff0c;你必須使用var關鍵字來定義延遲加載的屬性&#xff0c;不能使用let關鍵字&#xff0c;因為常量…

Spring,Quartz和JavaMail集成教程

Quartz是一個作業調度框架&#xff0c;用于調度要在指定的時間表上執行的作業。JavaMail是一個用于從Java應用程序發送/接收電子郵件的API。 Spring具有集成點&#xff0c;可以集成Quartz和JavaMail&#xff0c;從而使這些API易于使用。 讓我們創建一個小型演示應用程序&#x…

Java_Web三大框架之Hibernate操作數據庫(三)

使用Hibernate操作數據庫需要七個步驟&#xff1a;&#xff08;1&#xff09;讀取并解析配置文件Configuration conf newConfiguration().configure(); &#xff08;2&#xff09;讀取并解析映射信息&#xff0c;創建SessionFactorySessionFactory sf conf.buildSessionFacto…

android布局1

第二類&#xff1a;屬性值必須為id的引用名“id/id-name” 僅RelativeLayout中有效 android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左邊 android:layout_toRightOf 在某元素的右…

Spring MVC開發–快速教程

這是我們的JCG合作伙伴之一&#xff0c;來自Manoj的有關使用Spring開發Web應用程序的簡短教程&#xff0c; 網址為“ The Khangaonkar Report ”。 &#xff08;注意&#xff1a;對原始帖子進行了少量編輯以提高可讀性&#xff09; Spring MVC使用基于模型視圖控制器體系結構&…

spring mvc controller間跳轉 重定向 傳參

url&#xff1a;http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求&#xff1a;spring MVC框架controller間跳轉&#xff0c;需重定向。有幾種情況&#xff1a;不帶參數跳轉&#xff0c;帶參數拼接url形式跳轉&#xff0c;帶參數不拼接參…

尋找數組的中心索引

給你一個整數數組 nums &#xff0c;請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標&#xff0c;其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端&#xff0c;那么左側數之和視為 0 &#xff0c;因為在下標的左側不存在元素。這一點…

STL sector 應用

1 #include <iostream>2 #include <string>3 #include <vector>4 #include <cstdio>5 using namespace std;6 int n;7 vector<int> pile[30];8 9 //找到a所在pile和height&#xff0c;以應用的形式返回調用者&#xff0c; 10 void find_block(in…

將Jersey與Spring整合

Spring提供了很多好處&#xff0c;并通過其依賴項注入機制&#xff0c;應用程序生命周期管理和Hibernate支持&#xff08;僅舉幾例&#xff09;促進了最佳實踐。 另外&#xff0c;當您想擁有干凈的類似于REST的服務器端JSON Api時&#xff0c;我發現Jersey非常方便。 本文簡要介…

JAVAWEB 生成excel文字在一格顯示兩位不變成#號

在用java生成excel的時候會發現這種問題&#xff0c; 如果是人家給的模板還好&#xff0c;如果不是模板&#xff0c;而是通過代碼生成的話&#xff0c; 就需要進行處理了&#xff0c; 一個小單元格&#xff0c;如果是一位的話&#xff0c;如1-9顯示沒有問題&#xff0c;一旦是兩…

力扣面試題 01.07. 旋轉矩陣

給你一幅由 N N 矩陣表示的圖像&#xff0c;其中每個像素的大小為 4 字節。請你設計一種算法&#xff0c;將圖像旋轉 90 度。 不占用額外內存空間能否做到&#xff1f; 代碼一 思路&#xff1a;對于矩陣中第 ii 行的第 jj 個元素&#xff0c;在旋轉后&#xff0c;它出現在倒數…

依賴注入–手動方式

依賴注入是一種將行為與依賴解決方案分開的技術。 用簡單的話來說&#xff0c;它允許開發人員定義具有特定功能的類&#xff0c;這些功能取決于各種協作者&#xff0c;而不必定義如何獲取對這些協作者的引用。 以此方式&#xff0c;實現了各個組件之間的解耦&#xff0c;并且通…

一個疏忽引發的思考!(strerror)

前幾天寫代碼因為自己的疏忽導致一遍又一遍的Segmentation fault (core dumped)。該問題是因為strerror&#xff08;errno&#xff09;返回的指針指向非法的內存導致程序打印錯誤時崩潰。 嘗試數次無果&#xff0c;為了進度。簡單粗暴的換成了perror(str)。今天忙里偷閑&#x…

力扣面試題 01.08. 零矩陣

編寫一種算法&#xff0c;若M N矩陣中某個元素為0&#xff0c;則將其所在的行與列清零 代碼一思路&#xff1a; 第一次遍歷時記錄&#xff0c;用兩個布爾類型數組標記行和列中是否有0元素&#xff1b; 第二次遍歷時置零 class Solution {public void setZeroes(int[][] matr…

Java最佳實踐–字符串性能和精確字符串匹配

在使用Java編程語言時&#xff0c;我們將繼續討論與建議的實踐有關的系列文章&#xff0c;我們將討論String性能調優。 我們將專注于如何有效地處理字符串創建&#xff0c; 字符串更改和字符串匹配操作。 此外&#xff0c;我們將提供我們自己的用于精確字符串匹配的最常用算法的…

mac下開發環境常用操作與命令

【1】 修改hosts文件 vim /private/etc/hosts轉載于:https://www.cnblogs.com/zsmynl/p/4714492.html