在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過Verilog實現對一個頻率的任意占空比的任意分頻

ZYNQ ? 來源:ZYNQ ? 2023-01-05 09:33 ? 次閱讀

verilog程序設計中,我們往往要對一個頻率進行任意分頻,而且占空比也有一定的要求這樣的話,對于程序有一定的要求,現在我在前人經驗的基礎上做一個簡單的總結,實現對一個頻率的任意占空比的任意分頻。

比如:我們FPGA系統時鐘是50M Hz,而我們要產生的頻率是880Hz,那么,我們需要對系統時鐘進行分頻。我們很容易想到用計數的方式來分頻:

50000000/880 = 56818

這個數字不是2的整冪次方,那么怎么辦呢?我們可以設定一個參數,讓它到56818的時候重新計數不就完了嗎?呵呵,程序如下:

module div(clk, clk_div);

input clk;

output clk_div;

reg [15:0] counter;

always @(posedge clk)

if(counter==56817) counter <= 0;

else counter <= counter+1;

assign clk_div = counter[15];

endmodule

下面我們來算一下它的占空比:我們清楚地知道,這個輸出波形在counter為0到32767的時候為低,在32767到56817的時候為高,占空比為40%多一些,如果我們需要占空比為50%,那么怎么辦呢?不用急,慢慢來。

我們再設定一個參數,使它為56817的一半,使達到它的時候波形翻轉,那不就完了嗎?呵呵,再看看:

module div(clk, clk_div);
input clk;
output clk_div;
reg [14:0] counter;
always @(posedge clk)
if(counter==28408) counter <= 0;
else counter <= counter+1;
reg clk_div;
always @(posedge clk)
  if(counter==28408) clk_div <= ~clk_div;
endmodule

占空比是不是神奇地變成50%了呢?呵呵。

繼續讓我們來看如何實現任意占空比,比如還是由50 M分頻產生880 Hz,而分頻得到的信號的占空比為30%。

56818×30%=17045

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

三分頻的Verilog實現

//很實用也是筆試面試時常考的,已經經過仿真

占空比要求50%和不要求占空比差別會很大,先看一個占空比50%的描述

module div3(CLKIN,CLKOUT,RESETn);
input CLKIN,RESETn;
output CLKOUT;
 
//internal counter signals
reg[1:0] count_a;
reg[1:0] count_b;
reg      CLKOUT;
 
always @(negedge RESETn or posedge CLKIN)
begin
    if (RESETn==1'b0)
        count_a<=2'b00;
    else
        if (count_a==2'b10)
            count_a<=2'b00;
        else
            count_a<=count_a+1;
end
 
always @(negedge RESETn or negedge CLKIN)
begin
    if (RESETn==1'b0)
        count_b<=2'b0;
    else
        if (count_b==2'b10)
            count_b<=2'b00;
        else
            count_b<=count_b+1;
end
 
always @(count_a or count_b or RESETn)
begin
 if (RESETn==1'b0)
   CLKOUT=1'b0;
 else if((count_a+count_b==4)||(count_a+ count_b==1))
   CLKOUT=~CLKOUT;
end
endmodule


0 1 2 0 1 2
/ / / /
0 1 2 0 1 2

下面是一個非50%的描述,只用了上升沿

module div3(CLKIN,CLKOUT,RESETn);
input CLKIN,RESETn;
output CLKOUT;
 
 
wire d;
reg     q1,q2;
wire         CLKOUT;
 
always @(negedge RESETn or posedge CLKIN)
begin
    if (RESETn==1'b0)
        q1<=1'b0;
    else
        q1<=d;
end
 
always @(negedge RESETn or posedge CLKIN)
begin
    if (RESETn==1'b0)
        q2<=1'b0;
    else
        q2<=q1;
end
assign d=~q1 & ~q2;
assign CLKOUT=q2;
endmodule

占空比不是50%,只用了單沿觸發器,寄存器輸出。

至于其他奇數要求50%的或者不要求的占空比的,都可以參照上面兩個例子做出。
占空比為50%的一個更好的實現。

module div3(CLKIN,CLKOUT,RESETn);
input CLKIN,RESETn;
output CLKOUT;
//internal counter signals
reg[1:0] count_a;
reg            b,c;
//reg        CLKOUT;
wire CLKOUT;
always @(negedge RESETn or posedge CLKIN)
begin
    if (RESETn==1'b0)
        count_a<=2'b00;
    else
        if (count_a==2'b10)
            count_a<=2'b00;
        else
            count_a<=count_a+1;
end
always @(negedge RESETn or negedge CLKIN)
begin
    if (RESETn==1'b0)
        b<=1'b0;
    else
        if (count_a==2'b01)
            b<=2'b0;
        else
            b<=1'b1;
end
always @(negedge RESETn or posedge CLKIN)
begin
    if (RESETn==1'b0)
        c<=1'b0;
    else
        if (count_a==2'b10)
            c<=1'b1;
        else if (count_a==2'b01)
            c<=1'b0;
end
assign          CLKOUT=b & c;
endmodule

時鐘選擇器的Verilog寫法!

CPRI有3種數據時鐘,61.44M 122.88M 245.76M,需要模塊能夠根據外部的速率指示信號(一個2位的輸入信號,由模塊外部給定)選擇其中的一種時鐘作為模塊的工作時鐘

但由于所選用的FPGA工作頻率關系,不能超過400M,無法通過寄存器方式實現時鐘源的選擇.

使用雙邊觸發的方式將最高的頻率進行分頻,代碼如下,已經通過ModelSim的仿真,可以實現。

module clk_div(
                  reset,        //復位信號
                  data_rate,    //數據速率指示
                  clk2,         //245.76M的時鐘輸入
                  time1,        //分頻計數器
                  clk           //選擇后的時鐘輸出
                  );
input       reset;
input [1:0] data_rate;
input       clk2;
output [1:0] time1;
output      clk;
reg [1:0] time1;
reg       clk;                  
                  
always@(clk2 or reset)
if(reset)
   begin
     time1=2'b00;
     clk=1'b0;
   end
else
   begin
     time1=time1+1'b1;
     case(data_rate)
       2'b00:if(time1==2'b00)
                clk=~clk;
             else
                clk=clk;  
       2'b01:if(time1[0]==1'b1)
                clk=~clk;
             else
                clk=clk;
       2'b10:clk=clk;
       2'b11:clk=~clk;
     endcase
   end
endmodule      

verilog 實現gray碼計數器

//16位gray碼計數器,gary碼狀態改變時候每次只改變一個bit
//,可以有效防止競爭和毛刺的產生。
module gray_counter(clk,clr,start,stop,q,cout);
 input clk;
 input clr;
 input start,stop;
 output reg [3:0] q;
 output reg cout;
 reg flag=1;
 reg [3:0] s,next_s;
 
 //parameter S0=0, S1=1, S2=2, S3=3, S4=4, S5=5, S6=6, S7=7;
 //parameter S8=8, S9=9, S10=10, S11=11, S12=12, S13=13, S14=14, S15=15;
 parameter s0=0000, s1=0001, s2=0011, s3=0010;
 parameter s4=0110, s5=0111, s6=0101, s7=0100;
 parameter s8=1100, s9=1101, s10=1111,s11=1110;
 parameter s12=1010, s13=1011, s14=1001, s15=1000;
 always @(posedge clk)
 begin
  if (clr) s <= s0;
  else   s <= next_s;
 end 
 /*always @(posedge start or posedge stop)
 begin
  if(start) flag=1;
  else if (stop) flag=0;
 end*/
 always @(s or flag)     /*該進程實現狀態的轉換*/
 begin    
  case (s)
   s0: begin
   if (flag)  next_s <=s1;
   // else       next_s <=s0;
    end
   s1: begin
   if (flag)    next_s <= s2;
   end
   s2: begin
   if (flag)   next_s <=s3;
   ////else        next_s <=s0;
   end
   s3: begin
   if (flag)    next_s <=s4;
   //else        next_s <=s3;
   end
   s4: begin
   if (flag)     next_s <= s5;
   end
   s5: begin
   if (flag)   next_s <=s6;
   //else        next_s <=s0;
   end
   s6: begin
   if (flag)   next_s <=s7;
   //else        next_s <=s3;
   end
   s7: begin
   if (flag)  next_s <=s8;
   //else       next_s <=s0;
   end
   s8: begin
   if (flag)    next_s <= s9;
   end
   s9: begin
   if (flag)   next_s <=s10;
   ////else        next_s <=s0;
   end
   s10: begin
   if (flag)    next_s <=s11;
   //else        next_s <=s3;
   end
   s11: begin
   if (flag)     next_s <= s12;
   end
   s12: begin
   if (flag)   next_s <=s13;
   //else        next_s <=s0;
   end
   s13: begin
   if (flag)   next_s <=s14;
   //else        next_s <=s3;
   end
   s14: begin
   if (flag)   next_s <=s15;
   ////else        next_s <=s0;
   end
   s15: begin
   if (flag)    next_s <=s0;
   //else        next_s <=s3;
   end
   default:    next_s <=s0;   /*default語句*/
  endcase
 end
 always @(s)          /*該進程定義組合邏輯(FSM的輸出)*/  
 begin
  case(s)
  s0: q=0;
  s1: q=4;
  s2: q=2;
  s3: q=3;
  s4: q=4;
  s5: q=5;
  s6: q=6;
  s7: q=7;
  s8: q=8;
  s9: q=9;
  s10: q=10;
  s11: q=11;
  s12: q=12;
  s13: q=13;
  s14: q=14;
  s15: q=15;    
  default:q=0;     /*default語句,避免鎖存器的產生*/
  endcase
 end
 always @(s)
    begin
   if (s==s15) cout=1;//assign cout=q;
   else cout=0;
 end
endmodule

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1629

    文章

    21736

    瀏覽量

    603319
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110095

原文標題:Verilog_實現任意占空比、任意分頻的方法

文章出處:【微信號:ZYNQ,微信公眾號:ZYNQ】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ads1672可以設置任意的采樣頻率

    ads1672在20M時鐘下的采樣頻率是625k,在10M時鐘下的采樣頻率是312.5k。我想設置任意的采樣頻率,可行嗎,緊急,緊急。緊急,求教了
    發表于 12-09 06:24

    是德任意波形發生器應用領域

    在現代電子設計與測試領域,任意波形發生器(AWG)作為種強大的信號源,扮演著不可或缺的角色。它能夠生成各種復雜的模擬波形,滿足從基礎研究到復雜系統開發的廣泛應用需求。是德科技作為全球領先的電子
    的頭像 發表于 10-18 16:25 ?201次閱讀
    是德<b class='flag-5'>任意</b>波形發生器應用領域

    1653系列函數任意波形發生器

    問題,滿足多樣化的信號激勵應用需求。 主要特性 1、豐富的帶寬配置、更多的輸出通道數量 1653系列函數任意波形發生器包含120MHz、250MHz、350MHz、500MHz、1GHz和3.2GHz 6種帶寬機型,滿足客戶不同輸出信號頻率的信號發生需求。500MHz帶寬
    的頭像 發表于 10-15 17:13 ?184次閱讀

    基于 FPGA 的任意波形發生器+低通濾波器系統設計

    設計基于Verilog HDL語言使用Artix-7系列芯片在EGO1開發板上實現簡易的任意波形發生器。該波形發生器能夠產生正弦波、方波
    發表于 07-15 18:33

    什么是任意波形發生器

    在電子測量、通信、科研以及音樂創作等多個領域中,波形發生器作為種能夠產生特定波形信號的電子設備,發揮著不可或缺的作用。而任意波形發生器(Arbitrary Waveform Generator
    的頭像 發表于 05-30 15:53 ?989次閱讀

    任意波是什么意思?怎么調呢?

    任意波形是指可以按照用戶需求生成的波形,它不同于傳統的正弦波、方波、鋸齒波等標準波形
    的頭像 發表于 05-28 16:23 ?469次閱讀

    什么是任意波形發生器?任意波形發生器是干什么用的?

    任意波形發生器是種高度靈活的電子測試設備,它能夠生成幾乎任何類型的電信號波形。
    的頭像 發表于 05-28 16:19 ?838次閱讀

    任意波形發生器的使用方法

    提供了極大的便利。然而,要想充分發揮任意波形發生器的性能,掌握其正確的使用方法至關重要。本文將對任意波形發生器的使用方法進行詳細介紹,包括設備準備、參數設置、波形生成、輸出檢測等步驟,旨在幫助用戶更好地理解和使用這重要工具。
    的頭像 發表于 05-21 17:26 ?1384次閱讀

    任意波形發生器的定義、特點及應用

    任意波形發生器(Arbitrary Waveform Generator,簡稱AWG)是電子測試與測量領域中的種重要設備。隨著電子技術的飛速發展,對信號源的需求也日益復雜和多樣化。傳統的信號源設備
    的頭像 發表于 05-21 17:19 ?1270次閱讀

    任意波形發生器如何輸出電壓

    任意波形發生器(Arbitrary Waveform Generator,簡稱AWG)是種電子測試設備,它能夠產生各種形狀、頻率和振幅的電壓信號,以滿足電子電路、自動控制以及教學實驗等領域的多種
    的頭像 發表于 05-15 15:38 ?811次閱讀

    任意波形發生器與示波器怎么連接

    在電子測試領域中,任意波形發生器和示波器是兩種非常重要的測試設備。任意波形發生器能夠產生多種波形信號,用于模擬各種實際環境中的信號;而示波器則用于觀測和分析這些信號的特征。本文將詳細介紹任意波形發生器與示波器的連接方法,并探討其
    的頭像 發表于 05-15 15:38 ?1036次閱讀

    文帶你了解PWM原理、頻率占空比

    會下降。也就是,在定的頻率下,通過不同的占空比 即可得到不同的輸出模擬電壓。pwm就是通過這種原理實現
    發表于 03-27 14:12

    淺談任意波形發生器及通道合并功能

    淺談任意波形發生器及通道合并功能? 任意波形發生器(AWG)是種能夠產生各種復雜波形的信號發生器。它可以通過調節其輸出信號的幅值、頻率、相
    的頭像 發表于 01-19 15:54 ?653次閱讀

    任意波發生器如何輸出波形、帶調制的信號?

    任意波發生器,如何輸出波形、帶調制的信號? 任意波發生器是種用于產生各種波形的信號發生器。它可以生成特定頻率、幅度、相位和形狀的波形,并在需要時進行調制。在本文中,我們將探討如何使用
    的頭像 發表于 01-19 15:54 ?769次閱讀

    占空比信號和頻率信號的區別

    占空比信號和頻率信號是電子工程領域中常見的兩種信號類型,它們在性質和應用領域上有著較大的差異。下面將詳細介紹占空比信號和頻率信號的概念、特點以及應用。
    的頭像 發表于 01-05 16:51 ?2491次閱讀
    主站蜘蛛池模板: 高清欧美一级在线观看| 台湾久久| 大量国产后进翘臀视频| 日本免费不卡视频| 日韩a一级欧美一级| 亚洲最大成人综合网| 午夜色网站| 日本写真高清视频免费网站网| 欧美feer| 成年毛片| 免费一级特黄3大片视频 | 日本免费黄色| 一级毛片在线播放| av72成人| 一级特黄性生活大片免费观看| 色噜噜狠狠狠狠色综合久| 久久婷婷六月| 五月天伦理| 婷婷色九月综合激情丁香| 四虎在线电影| 伊人网综合视频| 1024你懂的国产精品| 天天摸日日| 夜夜爱夜夜做夜夜爽| 天天躁夜夜躁狠狠躁2021a| 免费一看一级毛片| 天天爽视频| 国产h视频在线观看高清| 一级片在线免费播放| 国产1区2区三区不卡| mmmxxx69日本| 毛片毛多| www.免费| 亚洲一区在线视频观看| 婷婷综合激情网| 激情天堂| 啪啪免费网| 欧美三页| 波多野结衣三个女人蕾丝边| 四虎国产在线观看| bt在线www天堂资源网|