新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 硬件描述語言Verilog HDL設計進階之:自動轉換量程頻率計控制器

        硬件描述語言Verilog HDL設計進階之:自動轉換量程頻率計控制器

        作者: 時間:2017-06-05 來源:網絡 收藏

        4.7典型實例7:自動轉換量程

        4.7.1實例內容及目標

        1.實例內容

        本實例使用設計一個可自動轉換量程的。在設計過程中,使用了狀態機的設計方法,讀者可根據綜合實例6的流程將本實例的語言設計模塊添加到自己的工程中。

        本文引用地址:http://www.104case.com/article/201706/348828.htm

        2.實例目標

        通過本實例,讀者應達到下面的目的。

        ·掌握使用Verilog設計狀態機的方法。

        ·掌握Verilog設計的一般方法。

        4.7.2原理簡介

        頻率計是電路調試里面常常用到的一種儀器。本實例提到的自動轉換量程并不是講解如何設計一個頻率計,而是講解如何設計這個頻率計的量程轉換機制。通過Verilog語言設計將量程轉換變成自動化,自適應地將輸入反映至量程上。

        此自動轉換量程頻率計需要外部提供一個超量程信號和一個欠量程信號,代表輸入比當前量程的狀態。這兩個信號可以通過其他的模塊或者裝置獲得,讀者可自行分析。

        同時,該頻率計還向外部提供一個用于選擇標準時基的信號。通過該信號,頻率計可以完成量程的切換和顯示。讀者可根據頻率計其他模塊的需要調整輸出信號的設計。

        4.7.3代碼分析

        下面給出自動轉換量程頻率計控制器的Verilog源代碼,首先介紹端口信號的定義及說明,讀者可以通過這些端口將此控制器模塊實例化至自己的工程設計中。

        ·clk:輸入時鐘。

        ·clear:異步復位信號。

        ·reset:用來在量程轉換開始時復位計數器。

        ·std_f_sel:用來選擇標準時基。

        ·cntover:代表超量程。

        ·cntlow:代表欠量程。

        module control(std_f_sel,reset,clk,clear,cntover,cntlow);
        //端口說明
        output[1:0] std_f_sel;
        output reset;
        input clk,clear,cntover,cntlow;

        //內部信號說明
        reg[1:0] std_f_sel;
        reg reset;
        reg[5:0] present,next; //用于保存當前狀態和次態的中間變量

        //狀態編碼,采用獨熱碼
        parameter start_fl00k = 6b000001, //狀態A
        fl00k_cnt = 6b000010, //狀態B
        start_fl0k = 6b000100, //狀態C
        fl0k_cn = 6b001000, //狀態D
        start_flk = 6b010000, //狀態E
        flk_cnt = 6b100000; //狀態F

        always @(posedge clk or posedge clear) begin
        if(clear)
        present=start_fl0k; //異步復位至start_fl0k狀態
        else
        present=next; //狀態轉換
        end

        always @(present or cntover or cntlow) begin //狀態轉換的觸發信號列表
        case(present) //用case語句描述狀態轉換
        start_fl00k: //100k量程狀態
        next=fl00k_cnt;
        fl00k_cnt: begin //100k量程控制狀態
        if(cntlow) //欠量程
        next=start_fl0k; //進入10k量程狀態
        else
        next=fl00k_cnt; //保持100k量程控制狀態
        end
        start_fl0k: //10k量程狀態
        next=fl0k_cnt;
        fl0k_cnt: begin //10k量程控制狀態
        if(cntlow) //欠量程
        next=start_flk; //進入1k量程狀態
        else if(cntover) //過量程
        next=start_fl00k; //進入100k量程狀態
        else
        next=fl0k_cnt; //保持1k量程控制狀態
        end
        start_flk: //1k量程狀態
        next=flk_cnt;
        flk_cnt: begin //1k量程控制狀態
        if(cntover) //過量程
        next=start_fl0k; //進入10k量程狀態
        else
        next=flk_cnt; //保持1k量程控制狀態
        end
        default:
        next=start_fl0k; //缺省狀態為10k量程狀態
        endcase
        end

        //各狀態的輸出控制模塊
        always @(present) begin
        case(present)
        start_fl00k: begin //100k量程狀態輸出控制
        reset=1;
        std_f_sel=2b00;
        end
        fl00k_cnt: begin //100k量程控制狀態輸出控制
        reset=0;
        std_f_sel=2b00;
        end
        start_fl0k: begin //10k量程狀態輸出控制
        reset=1;
        std_f_sel=2b01;
        end
        fl0k_cnt: begin //10k量程控制狀態輸出控制
        reset=0;
        std_f_sel=2b01;
        end
        start_flk: begin //1k量程狀態輸出控制
        reset=1;
        std_f_sel=2b11;
        end
        flk_cnt: begin //1k量程控制狀態輸出控制
        reset=0;
        std_f_sel=2b11;
        end
        default: begin //默認(10k量程)狀態輸出控制
        reset=1;
        std_f_sel=2b01;
        end
        endcase
        end
        endmodule

        在狀態機設計中,常常將狀態轉換和狀態輸出控制分為兩個部分進行設計,方便語言的編寫修改和讀寫規則。在下面的源代碼中讀者應該注意這個設計的特點。

        4.7.4參考設計

        本實例相關參考設計文件在本書實例代碼的“典型實例7”文件夾。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 隆安县| 车险| 甘洛县| 德惠市| 高陵县| 雅江县| 平陆县| 德保县| 江达县| 铁岭市| 贡嘎县| 浮山县| 文水县| 杨浦区| 章丘市| 南漳县| 博兴县| 辰溪县| 遂川县| 永清县| 荔波县| 万州区| 上杭县| 冀州市| 巴塘县| 灵石县| 海淀区| 阳山县| 宁河县| 威海市| 阿尔山市| 纳雍县| 安平县| 桓台县| 盐源县| 那曲县| 宁蒗| 苏尼特左旗| 通道| 互助| 财经|