0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的計(jì)數(shù)器設(shè)計(jì)

CHANBAEK ? 來源:小小研究生 ? 作者:xxyjs2020 ? 2023-06-23 16:51 ? 次閱讀

數(shù)電基礎(chǔ)

關(guān)于時(shí)序邏輯設(shè)計(jì)的部分依然強(qiáng)烈推薦mooc上華科的數(shù)字電路與邏輯設(shè)計(jì)。

計(jì)數(shù)器可以分為同步和異步計(jì)數(shù)器,2進(jìn)制、10進(jìn)制和任意進(jìn)制計(jì)數(shù)器,加法和減法計(jì)數(shù)器。同步和異步是指觸發(fā)器是否都由同一個(gè)時(shí)鐘信號控制。一個(gè)觸發(fā)器能存儲1位二進(jìn)制數(shù),所以由N個(gè)觸發(fā)器構(gòu)成N位寄存器。例如3個(gè)JK觸發(fā)器可以存儲000-111種狀態(tài)。在數(shù)電的原理方面,mooc上講解的很清晰,可以自行學(xué)習(xí)同步或異步的二進(jìn)制寄存器、使用復(fù)位清零和反饋置數(shù)將M進(jìn)制構(gòu)成N進(jìn)制(N

設(shè)計(jì)規(guī)劃

本例將采用一個(gè)外部時(shí)鐘信號,一個(gè)復(fù)位鍵和一個(gè)LED燈來實(shí)現(xiàn)1s內(nèi)LED閃爍(亮0.5s滅0.5s)。這種計(jì)時(shí)的功能在FPGA中是通過計(jì)數(shù)器完成的: 經(jīng)歷一個(gè)時(shí)鐘周期,計(jì)數(shù)器+1 ,我們只需要計(jì)算出計(jì)數(shù)截止的值,就可以完成計(jì)時(shí)。由于采用的50MHz時(shí)鐘頻率,也就是1s產(chǎn)生510e7個(gè)時(shí)鐘。那么亮滅0.5s就是需要計(jì)2.510e7個(gè)數(shù)。計(jì)數(shù)器從0-24999999,2^24<24999999<2^25,因此需要25個(gè)觸發(fā)器,即25位寄存器。這個(gè)計(jì)數(shù)過程是:復(fù)位鍵生效時(shí)計(jì)數(shù)器歸零,釋放后的第一個(gè)時(shí)鐘上升沿開始計(jì)數(shù),從0計(jì)到2499999時(shí)LED燈改變狀態(tài),計(jì)數(shù)器歸零重新開始計(jì)數(shù),到2499999時(shí)LED燈改變狀態(tài)...

圖片

編寫代碼

module counter
#(
parameter CNT_MAX = 25'd24_999_999
 )
 (
 input wire sys_clk , //系統(tǒng)時(shí)鐘50MHz
 input wire sys_rst_n , //全局復(fù)位
 output reg led_out 
 );


 reg [24:0] cnt; //經(jīng)計(jì)算得需要25位寬的寄存器才夠500ms


 //cnt:計(jì)數(shù)器計(jì)數(shù),當(dāng)計(jì)數(shù)到CNT_MAX的值時(shí)清零
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt <= 25'b0;
 else if(cnt == CNT_MAX)
 cnt <= 25'b0;
 else
 cnt <= cnt + 1'b1;


 //led_out:輸出控制一個(gè)LED燈,每當(dāng)計(jì)數(shù)滿標(biāo)志信號有效時(shí)取反
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 led_out <= 1'b0;
 else if(cnt == CNT_MAX)
 led_out <= ~led_out;
 endmodule

代碼注釋:與#define 標(biāo)識符 常量類似,這里使用參數(shù)的方式定義常量。在RTL代碼中實(shí)例化該模塊時(shí),如果需要兩個(gè)不同計(jì)數(shù)值的計(jì)數(shù)器,只需要修改常數(shù)值。使用testbench仿真時(shí)也需要實(shí)例化,0.5s才能看到led_out的變化,仿真時(shí)間過長。如果我們直接修改參數(shù)縮短時(shí)間就能看到效果。parameter定義的是局部參數(shù),只在本模塊中有效,不會影響實(shí)際值。

我們觀察cnt和led_out的變化條件:計(jì)數(shù)器發(fā)生改變的條件有兩個(gè),一個(gè)是時(shí)鐘上升沿,一個(gè)是復(fù)位有效(復(fù)位下降沿)。計(jì)數(shù)器發(fā)生的改變有兩個(gè),要么+1要么清零。清零條件有兩個(gè):復(fù)位和溢出。因此第一個(gè)always塊中有三個(gè)判斷條件:復(fù)位和溢出時(shí)清零,其他的時(shí)候+1。

led_out的變化條件:時(shí)鐘上升沿和復(fù)位有效(復(fù)位下降沿)。LED燈狀態(tài)的變化有兩個(gè),當(dāng)復(fù)位時(shí)LED燈為低電平,溢出時(shí)取反。

圖片

編寫testbench

`timescale 1ns/1ns
module tb_counter();


//reg define
reg sys_clk;
reg sys_rst_n;


//wire define
wire led_out;


 //初始化輸入信號
 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end


 //sys_clk:每10ns電平翻轉(zhuǎn)一次,產(chǎn)生一個(gè)50MHz的時(shí)鐘信號
 always #10 sys_clk = ~sys_clk;


 //---------------------flip_flop_inst----------------------
 counter
 #(
 .CNT_MAX (25'd24 ) 
 )
 counter_inst(
 .sys_clk (sys_clk ), 
 .sys_rst_n (sys_rst_n ), 
 .led_out (led_out ) 
 );


 endmodule

初始化:時(shí)鐘高電平,復(fù)位低電平,20s延遲后復(fù)位高電平。

實(shí)例化:此處的參數(shù)只對該模塊有效,想要改變這個(gè)模塊里的參數(shù)數(shù)值,只需要在這里改變即可。這里設(shè)置成24是為了方便觀察,節(jié)省時(shí)間。

對比波形

圖片

24個(gè)時(shí)鐘脈沖輸出就會取反,同理trl文件中24999999個(gè)脈沖(0.5s)之后LED燈會改變狀態(tài),實(shí)現(xiàn)1s內(nèi)閃爍。

分配管腳

圖片

全編譯后上板驗(yàn)證

圖片

圖片

LED燈在1s內(nèi)閃爍,且S1一直按LED燈會一直亮(S1按下去為低電平,復(fù)位有效,led_out=0,LED燈亮,和預(yù)期一致。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21783

    瀏覽量

    605006
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2259

    瀏覽量

    94849
  • 數(shù)字電路
    +關(guān)注

    關(guān)注

    193

    文章

    1620

    瀏覽量

    80741
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2002

    瀏覽量

    61279
  • 時(shí)鐘信號
    +關(guān)注

    關(guān)注

    4

    文章

    451

    瀏覽量

    28627
收藏 人收藏

    評論

    相關(guān)推薦

    06 06_BCD計(jì)數(shù)器設(shè)計(jì)與驗(yàn)證 - 第8節(jié) #硬聲創(chuàng)作季

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 02:17:16

    06 06_BCD計(jì)數(shù)器設(shè)計(jì)與驗(yàn)證 - 第9節(jié)

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 02:18:07

    07 1-6 FPGA仿真工具的使用 2 1-6 FPGA仿真工具的使用 2 - 第3節(jié)

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 03:05:33

    07 1-6 FPGA仿真工具的使用 2 1-6 FPGA仿真工具的使用 2 - 第4節(jié) #硬聲創(chuàng)作季

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 03:06:23

    07 5_工具篇_Vivado軟件的使用 - 第2節(jié)

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 03:08:56

    07 5_工具篇_Vivado軟件的使用 - 第8節(jié) #硬聲創(chuàng)作季

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 03:14:01

    07 07_Nios II軟件框架結(jié)構(gòu)深入剖析1 - 第9節(jié)

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 03:22:29

    07 07_Xilinx嵌入式裸機(jī)硬件編程原理 - 第5節(jié) #硬聲創(chuàng)作季

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 03:26:43

    #硬聲創(chuàng)作季 #硬聲創(chuàng)作季

    fpga計(jì)數(shù)器函數(shù)代碼
    充八萬
    發(fā)布于 :2023年08月18日 03:28:25

    FPGA計(jì)數(shù)器時(shí)間問題

    這個(gè)計(jì)數(shù)器是0.5秒的,晶振是50MB。我想改變25000000這個(gè)的數(shù)值,從而改變時(shí)間,但是不行。后來我改變buffer=buffer+1就可以了,成了buffer=buffer+2,時(shí)間就改變了。能告訴我為什么嗎?
    發(fā)表于 08-22 10:46

    FPGA如何實(shí)現(xiàn)按鍵除抖

    抖動!當(dāng)按下按鍵時(shí),要是幸運(yùn)的話結(jié)果會如圖:這是比較罕見的,比較常見的應(yīng)該如下圖:【FPGA計(jì)數(shù)器】假設(shè)你在FPGA中加入了一個(gè)計(jì)數(shù)器,讓后將其顯示出來。如下圖:按下10次得到的結(jié)果可
    發(fā)表于 08-01 18:11

    怎么從FPGA輸入流到FX2LP?

    CycONEV(因?yàn)锳N61345使用XILIXX-SARTAN6 FPGA)。我用USB控制中心和流線型軟件來顯示來自FX2LP的數(shù)據(jù)。數(shù)據(jù)從FPGASTRONSGOOD(計(jì)數(shù)器從0000到FFFF)出來
    發(fā)表于 10-22 10:37

    FPGA計(jì)數(shù)器Spartan3 Nexys板不起作用

    我已經(jīng)寫了這段代碼。我希望它可以作為一個(gè)計(jì)數(shù)器,這樣每一秒都可以。增加顯示屏上顯示的數(shù)字。但由于某種原因不會增加,并保持為零。我花了3天時(shí)間對它進(jìn)行調(diào)試,并且很高興得到一些關(guān)于為什么這不起作用的反饋。這是代碼:http://pastebin.com/Ep96QhHp
    發(fā)表于 03-09 07:41

    基于FPGA的PWM計(jì)數(shù)器改進(jìn)設(shè)計(jì)

    簡單改變FPGA計(jì)數(shù)器規(guī)格使作為DAC功能PWM計(jì)數(shù)器的紋波降低。
    發(fā)表于 04-06 11:11 ?1999次閱讀
    基于<b class='flag-5'>FPGA</b>的PWM<b class='flag-5'>計(jì)數(shù)器</b>改進(jìn)設(shè)計(jì)