欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: FPGA學(xué)習(xí)-計(jì)數(shù)器設(shè)計(jì)與驗(yàn)證 [打印本頁(yè)]

作者: 51hei人人    時(shí)間: 2016-3-12 22:45
標(biāo)題: FPGA學(xué)習(xí)-計(jì)數(shù)器設(shè)計(jì)與驗(yàn)證

1、源程序(源碼注釋與源碼對(duì)應(yīng)是最好的解釋)【時(shí)序邏輯】

/* 實(shí)驗(yàn)名稱:計(jì)數(shù)器驗(yàn)證

 * 程序功能:每 500ms ,LED 狀態(tài)亮或滅一次

 * 時(shí)鐘計(jì)算:50MHz 的時(shí)鐘頻率,那么時(shí)鐘周期就是 1/50Mhz = 0.02us == 20ns

 *                500ms = 500_000_000ns = 500_000_000ns/20ns = 25_000_000次

 *                也就是說(shuō)在 50MHz 的時(shí)鐘頻率下,累加 25000000 次就等于 500ms 的時(shí)間

 */

module mytest(clk_50M, rst_n, led);

    input clk_50M;        // 系統(tǒng)時(shí)鐘 50MHz

    input rst_n;            // 全局復(fù)位,低電平復(fù)位

    output reg led;       // led 指示燈輸出

   

    // 25000_000 => 0x17D7840 => 4*6+1 = 25位

    reg[24:0] cnt;     // 定義計(jì)數(shù)器寄存器

 

    // 計(jì)數(shù)器程序塊

    // always :對(duì)某些信號(hào)變化感興趣

    // posedge:  表示 clk_50m   上升沿時(shí)會(huì)進(jìn)入該程序塊

    // negedge:    表示 rst_n    下降沿時(shí)會(huì)進(jìn)入該程序塊

    always@(posedge clk_50M or negedge rst_n)

       

        if(1'b0 == rst_n)                    // 當(dāng) rst_n 引腳為低電平時(shí)表示復(fù)位

            cnt <= 25'd0;                    // 復(fù)位計(jì)數(shù)器的值

        else if(25'd24_999_999 == cnt)         // 由于 cnt 是從 0 開(kāi)始計(jì)數(shù),所以需要-1

            cnt <= 25'd0;                    // 避免溢出

        else

            cnt <= cnt + 1'b1;                // 計(jì)數(shù)器計(jì)數(shù)(累加)

           

    // led 輸出程序塊

    always@(posedge clk_50M or negedge rst_n)

       

        if(1'b0 == rst_n)                // rst_n 復(fù)位時(shí),點(diǎn)亮 led 不做其他事情

            led <= 1'b1;

        else if(25'd24_999_999 == cnt)    // 當(dāng)計(jì)數(shù)器達(dá)到 500ms 時(shí)則翻轉(zhuǎn)一次 led 狀態(tài)

            led <= ~led;

        else

            ;                // rst_n 不是復(fù)位,同時(shí)計(jì)數(shù)器未滿,空語(yǔ)句,不做其他事情

endmodule 

2、仿真程序

/* 實(shí)驗(yàn)名稱:計(jì)數(shù)器驗(yàn)證 */

 `timescale 1ns/1ns

`define clock_period 20 // 時(shí)鐘周期 系統(tǒng)時(shí)鐘是50M/s 時(shí)鐘周期是1/50Mhz = 0.02us == 20ns

 

module mytest_tb;            // 由于是簡(jiǎn)單的仿真測(cè)試,所以可以不跟端口列表

 

    reg clk, rst_n;        // 激勵(lì)信號(hào)源

    wire led;

 

    mytest counter0(.clk_50M(clk), .rst_n(rst_n), .led(led));

   

    initial clk = 1;// 激勵(lì)輸出 小梅哥說(shuō)這里 clk = 1 仿真時(shí)有一定的好處,建議保持這個(gè)習(xí)慣

    // "`" 表示調(diào)用宏定義參數(shù)   10ns 高電平 10ns 低電平形成一個(gè)時(shí)鐘周期

    always #(`clock_period/2) clk = ~clk;    // 產(chǎn)生時(shí)鐘信號(hào) 20ns一個(gè)周期   

    initial begin

        rst_n = 1'b0;                // 復(fù)位

        #(`clock_period * 200);         // 延時(shí)200個(gè)時(shí)鐘周期

        rst_n = 1'b1;

        #2000000000;                // 延時(shí) 2秒鐘

        $stop;

    end

 

endmodule

 

 

3、程序生成的波形

        由于時(shí)間太長(zhǎng),所以將比較值25'd24_999_999 修改為25'd24_999 時(shí)間原先為500ms變0.5ms

 

 

4、程序生成的電路圖

 

電路圖理解:

 

這個(gè)原理圖我一開(kāi)始也看不太懂,后來(lái)經(jīng)過(guò)視頻的講解以及結(jié)合代碼來(lái)看,總算是看明白了。

 

首先,從25為寄存器(cnt[24..0])開(kāi)始看:

    情況1:寄存器為0~0x17D783E時(shí),Q會(huì)輸出該值,傳給加法器進(jìn)行累加,同時(shí)傳給25位比較器(Equal0)

的A端口,比較器會(huì)將該值(A端口)與B端口值(0x17D783F)比較,A與B不等則輸出0到翻轉(zhuǎn)器的ENA.同時(shí)也輸入到25位二路選擇器的 SEL 端,翻轉(zhuǎn)器那邊不會(huì)觸發(fā),而二路選擇器的SEL等于0,所以會(huì)選擇DATAA的數(shù)據(jù)輸出給寄存器。而DATAA的數(shù)據(jù)是由加法器累加(0x17D783E+1),由再傳給寄存器,進(jìn)入情況2。

    情況2:寄存器為0x17D783F時(shí),Q會(huì)輸出該值,傳給加法器進(jìn)行累加,同時(shí)傳給比較器的A端口,比較器判斷A與B端口相等,則輸出1到翻轉(zhuǎn)器的ENA端口,同時(shí)輸出1給選擇器的 SEL端口。翻轉(zhuǎn)器會(huì)翻轉(zhuǎn)電平輸出,而選擇器則會(huì)選擇 DATAB 端口的數(shù)據(jù)(0)傳給寄存器,此時(shí)寄存器的值為0.

 

本來(lái)想畫流程圖的,由于項(xiàng)目比較緊,既然已經(jīng)理解了,就不畫了,抓緊時(shí)間學(xué)下一個(gè)知識(shí)點(diǎn)。

 


作者: KUNH3266    時(shí)間: 2018-4-10 11:10
您好  ,想請(qǐng)教您一些問(wèn)題 ,我現(xiàn)在想做100mhz的計(jì)數(shù)器  周期是10ns應(yīng)該怎么去做呢?
作者: lemonn    時(shí)間: 2018-4-21 10:05
KUNH3266 發(fā)表于 2018-4-10 11:10
您好  ,想請(qǐng)教您一些問(wèn)題 ,我現(xiàn)在想做100mhz的計(jì)數(shù)器  周期是10ns應(yīng)該怎么去做呢?

比如系統(tǒng)時(shí)鐘是50Mhz,那只需要二分頻就可以了。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1