新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 硬件描述語言Verilog HDL設(shè)計(jì)進(jìn)階之:自動(dòng)轉(zhuǎn)換量程頻率計(jì)控制器

        硬件描述語言Verilog HDL設(shè)計(jì)進(jìn)階之:自動(dòng)轉(zhuǎn)換量程頻率計(jì)控制器

        作者: 時(shí)間:2017-06-05 來源:網(wǎng)絡(luò) 收藏

        4.7典型實(shí)例7:自動(dòng)轉(zhuǎn)換量程

        4.7.1實(shí)例內(nèi)容及目標(biāo)

        1.實(shí)例內(nèi)容

        本實(shí)例使用設(shè)計(jì)一個(gè)可自動(dòng)轉(zhuǎn)換量程的。在設(shè)計(jì)過程中,使用了狀態(tài)機(jī)的設(shè)計(jì)方法,讀者可根據(jù)綜合實(shí)例6的流程將本實(shí)例的語言設(shè)計(jì)模塊添加到自己的工程中。

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

        2.實(shí)例目標(biāo)

        通過本實(shí)例,讀者應(yīng)達(dá)到下面的目的。

        ·掌握使用Verilog設(shè)計(jì)狀態(tài)機(jī)的方法。

        ·掌握Verilog設(shè)計(jì)的一般方法。

        4.7.2原理簡(jiǎn)介

        頻率計(jì)是電路調(diào)試?yán)锩娉3S玫降囊环N儀器。本實(shí)例提到的自動(dòng)轉(zhuǎn)換量程并不是講解如何設(shè)計(jì)一個(gè)頻率計(jì),而是講解如何設(shè)計(jì)這個(gè)頻率計(jì)的量程轉(zhuǎn)換機(jī)制。通過Verilog語言設(shè)計(jì)將量程轉(zhuǎn)換變成自動(dòng)化,自適應(yīng)地將輸入反映至量程上。

        此自動(dòng)轉(zhuǎn)換量程頻率計(jì)需要外部提供一個(gè)超量程信號(hào)和一個(gè)欠量程信號(hào),代表輸入比當(dāng)前量程的狀態(tài)。這兩個(gè)信號(hào)可以通過其他的模塊或者裝置獲得,讀者可自行分析。

        同時(shí),該頻率計(jì)還向外部提供一個(gè)用于選擇標(biāo)準(zhǔn)時(shí)基的信號(hào)。通過該信號(hào),頻率計(jì)可以完成量程的切換和顯示。讀者可根據(jù)頻率計(jì)其他模塊的需要調(diào)整輸出信號(hào)的設(shè)計(jì)。

        4.7.3代碼分析

        下面給出自動(dòng)轉(zhuǎn)換量程頻率計(jì)控制器的Verilog源代碼,首先介紹端口信號(hào)的定義及說明,讀者可以通過這些端口將此控制器模塊實(shí)例化至自己的工程設(shè)計(jì)中。

        ·clk:輸入時(shí)鐘。

        ·clear:異步復(fù)位信號(hào)。

        ·reset:用來在量程轉(zhuǎn)換開始時(shí)復(fù)位計(jì)數(shù)器。

        ·std_f_sel:用來選擇標(biāo)準(zhǔn)時(shí)基。

        ·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;

        //內(nèi)部信號(hào)說明
        reg[1:0] std_f_sel;
        reg reset;
        reg[5:0] present,next; //用于保存當(dāng)前狀態(tài)和次態(tài)的中間變量

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

        always @(posedge clk or posedge clear) begin
        if(clear)
        present=start_fl0k; //異步復(fù)位至start_fl0k狀態(tài)
        else
        present=next; //狀態(tài)轉(zhuǎn)換
        end

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

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

        在狀態(tài)機(jī)設(shè)計(jì)中,常常將狀態(tài)轉(zhuǎn)換和狀態(tài)輸出控制分為兩個(gè)部分進(jìn)行設(shè)計(jì),方便語言的編寫修改和讀寫規(guī)則。在下面的源代碼中讀者應(yīng)該注意這個(gè)設(shè)計(jì)的特點(diǎn)。

        4.7.4參考設(shè)計(jì)

        本實(shí)例相關(guān)參考設(shè)計(jì)文件在本書實(shí)例代碼的“典型實(shí)例7”文件夾。



        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 哈密市| 登封市| 行唐县| 绥滨县| 新巴尔虎右旗| 志丹县| 靖江市| 静宁县| 凌海市| 湖北省| 茂名市| 安岳县| 龙里县| 武定县| 隆昌县| 阿坝县| 天等县| 名山县| 桂林市| 兴国县| 抚松县| 常熟市| 磴口县| 曲麻莱县| 师宗县| 龙井市| 宁陕县| 建瓯市| 武清区| 遂川县| 通道| 克山县| 白河县| 静海县| 舞钢市| 阆中市| 洪雅县| 尼玛县| 海原县| 山西省| 迁西县|