4.7典型实例7:主动转化量程频率计操控器
4.7.1实例内容及方针
1.实例内容
本实例运用VerilogHDL规划一个可主动转化量程的频率计操控器。在规划过程中,运用了状况机的规划办法,读者可根据归纳实例6的流程将本实例的言语规划模块添加到自己的工程中。
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”文件夹。