久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6446|回復: 2
收起左側

FPGA學習-計數器設計與驗證

[復制鏈接]
ID:108531 發表于 2016-3-12 22:45 | 顯示全部樓層 |閱讀模式

1、源程序(源碼注釋與源碼對應是最好的解釋)【時序邏輯】

/* 實驗名稱:計數器驗證

 * 程序功能:每 500ms ,LED 狀態亮或滅一次

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

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

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

 */

module mytest(clk_50M, rst_n, led);

    input clk_50M;        // 系統時鐘 50MHz

    input rst_n;            // 全局復位,低電平復位

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

   

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

    reg[24:0] cnt;     // 定義計數器寄存器

 

    // 計數器程序塊

    // always :對某些信號變化感興趣

    // posedge:  表示 clk_50m   上升沿時會進入該程序塊

    // negedge:    表示 rst_n    下降沿時會進入該程序塊

    always@(posedge clk_50M or negedge rst_n)

       

        if(1'b0 == rst_n)                    // 當 rst_n 引腳為低電平時表示復位

            cnt <= 25'd0;                    // 復位計數器的值

        else if(25'd24_999_999 == cnt)         // 由于 cnt 是從 0 開始計數,所以需要-1

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

        else

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

           

    // led 輸出程序塊

    always@(posedge clk_50M or negedge rst_n)

       

        if(1'b0 == rst_n)                // rst_n 復位時,點亮 led 不做其他事情

            led <= 1'b1;

        else if(25'd24_999_999 == cnt)    // 當計數器達到 500ms 時則翻轉一次 led 狀態

            led <= ~led;

        else

            ;                // rst_n 不是復位,同時計數器未滿,空語句,不做其他事情

endmodule 

2、仿真程序

/* 實驗名稱:計數器驗證 */

 `timescale 1ns/1ns

`define clock_period 20 // 時鐘周期 系統時鐘是50M/s 時鐘周期是1/50Mhz = 0.02us == 20ns

 

module mytest_tb;            // 由于是簡單的仿真測試,所以可以不跟端口列表

 

    reg clk, rst_n;        // 激勵信號源

    wire led;

 

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

   

    initial clk = 1;// 激勵輸出 小梅哥說這里 clk = 1 仿真時有一定的好處,建議保持這個習慣

    // "`" 表示調用宏定義參數   10ns 高電平 10ns 低電平形成一個時鐘周期

    always #(`clock_period/2) clk = ~clk;    // 產生時鐘信號 20ns一個周期   

    initial begin

        rst_n = 1'b0;                // 復位

        #(`clock_period * 200);         // 延時200個時鐘周期

        rst_n = 1'b1;

        #2000000000;                // 延時 2秒鐘

        $stop;

    end

 

endmodule

 

 

3、程序生成的波形

        由于時間太長,所以將比較值25'd24_999_999 修改為25'd24_999 時間原先為500ms變0.5ms

 

 

4、程序生成的電路圖

 

電路圖理解:

 

這個原理圖我一開始也看不太懂,后來經過視頻的講解以及結合代碼來看,總算是看明白了。

 

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

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

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

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

 

本來想畫流程圖的,由于項目比較緊,既然已經理解了,就不畫了,抓緊時間學下一個知識點。

 

回復

使用道具 舉報

ID:305020 發表于 2018-4-10 11:10 | 顯示全部樓層
您好  ,想請教您一些問題 ,我現在想做100mhz的計數器  周期是10ns應該怎么去做呢?
回復

使用道具 舉報

ID:310716 發表于 2018-4-21 10:05 | 顯示全部樓層
KUNH3266 發表于 2018-4-10 11:10
您好  ,想請教您一些問題 ,我現在想做100mhz的計數器  周期是10ns應該怎么去做呢?

比如系統時鐘是50Mhz,那只需要二分頻就可以了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区av在线 | 黄色成人av| 中文字幕在线欧美 | 免费午夜视频 | 午夜精品福利视频 | 国产一区高清 | 精品一区二区久久久久久久网站 | 亚洲精品二区 | 91porn在线 | 亚洲美女在线视频 | 欧美视频网 | 91视频正在播放 | 国产精品一区二区av | 成人综合在线视频 | 国产成人在线视频 | 久久久久久中文字幕 | 日本中文字幕在线观看 | 成人免费视频在线观看 | 亚洲中午字幕 | 天天操夜夜拍 | 91视频三区| 国产日韩精品视频 | 亚洲一区二区三区视频在线 | 91精品国产一区二区三区香蕉 | 欧美一级小视频 | 超碰免费在线 | 日韩免费视频一区二区 | 国产精品91网站 | 丝袜美腿一区二区三区 | 99久久久国产精品 | 影音先锋中文字幕在线观看 | 久草视频网站 | 精品国产一区二区三区久久影院 | 麻豆毛片| 一区二区三区不卡视频 | 亚洲一区二区三区四区视频 | 亚洲欧洲视频 | 久久精品小短片 | 国产成人一区二区三区电影 | 黄色大片网站 | 欧洲一区二区视频 |