4.7 典型實例7:自動轉(zhuǎn)換量程頻率計控制器
4.7.1 實例內(nèi)容及目標(biāo)
1.實例內(nèi)容
本實例使用Verilog HDL設(shè)計一個可自動轉(zhuǎn)換量程的頻率計控制器。在設(shè)計過程中,使用了狀態(tài)機的設(shè)計方法,讀者可根據(jù)綜合實例6的流程將本實例的語言設(shè)計模塊添加到自己的工程中。
2.實例目標(biāo)
通過本實例,讀者應(yīng)達到下面的目的。
· 掌握使用Verilog設(shè)計狀態(tài)機的方法。
· 掌握Verilog設(shè)計的一般方法。
4.7.2 原理簡介
頻率計是電路調(diào)試?yán)锩娉3S玫降囊环N儀器。本實例提到的自動轉(zhuǎn)換量程頻率計控制器并不是講解如何設(shè)計一個頻率計,而是講解如何設(shè)計這個頻率計的量程轉(zhuǎn)換機制。通過Verilog語言設(shè)計將量程轉(zhuǎn)換變成自動化,自適應(yīng)地將輸入反映至量程上。
此自動轉(zhuǎn)換量程頻率計需要外部提供一個超量程信號和一個欠量程信號,代表輸入比當(dāng)前量程的狀態(tài)。這兩個信號可以通過其他的模塊或者裝置獲得,讀者可自行分析。
同時,該頻率計還向外部提供一個用于選擇標(biāo)準(zhǔn)時基的信號。通過該信號,頻率計可以完成量程的切換和顯示。讀者可根據(jù)頻率計其他模塊的需要調(diào)整輸出信號的設(shè)計。
4.7.3 代碼分析
下面給出自動轉(zhuǎn)換量程頻率計控制器的Verilog源代碼,首先介紹端口信號的定義及說明,讀者可以通過這些端口將此控制器模塊實例化至自己的工程設(shè)計中。
· clk:輸入時鐘。
· clear:異步復(fù)位信號。
· reset:用來在量程轉(zhuǎn)換開始時復(fù)位計數(shù)器。
· std_f_sel:用來選擇標(biāo)準(zhǔn)時基。
· 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)部信號說明
reg[1:0] std_f_sel;
reg reset;
reg[5:0] present,next; //用于保存當(dāng)前狀態(tài)和次態(tài)的中間變量
//狀態(tài)編碼,采用獨熱碼
parameter start_fl00k = 6'b000001, //狀態(tài)A
fl00k_cnt = 6'b000010, //狀態(tài)B
start_fl0k = 6'b000100, //狀態(tài)C
fl0k_cn = 6'b001000, //狀態(tài)D
start_flk = 6'b010000, //狀態(tài)E
flk_cnt = 6'b100000; //狀態(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ā)信號列表
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; //進入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; //進入1k量程狀態(tài)
else if(cntover) //過量程
next<=start_fl00k; //進入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; //進入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=2'b00;
end
fl00k_cnt: begin //100k量程控制狀態(tài)輸出控制
reset=0;
std_f_sel=2'b00;
end
start_fl0k: begin //10k量程狀態(tài)輸出控制
reset=1;
std_f_sel=2'b01;
end
fl0k_cnt: begin //10k量程控制狀態(tài)輸出控制
reset=0;
std_f_sel=2'b01;
end
start_flk: begin //1k量程狀態(tài)輸出控制
reset=1;
std_f_sel=2'b11;
end
flk_cnt: begin //1k量程控制狀態(tài)輸出控制
reset=0;
std_f_sel=2'b11;
end
default: begin //默認(rèn)(10k量程)狀態(tài)輸出控制
reset=1;
std_f_sel=2'b01;
end
endcase
end
endmodule
在狀態(tài)機設(shè)計中,常常將狀態(tài)轉(zhuǎn)換和狀態(tài)輸出控制分為兩個部分進行設(shè)計,方便語言的編寫修改和讀寫規(guī)則。在下面的源代碼中讀者應(yīng)該注意這個設(shè)計的特點。
4.7.4 參考設(shè)計
本實例相關(guān)參考設(shè)計文件在本書實例代碼的“典型實例7”文件夾。