Verilog-HDL数字系统设计及其应用第11章.ppt
《Verilog-HDL数字系统设计及其应用第11章.ppt》由会员分享,可在线阅读,更多相关《Verilog-HDL数字系统设计及其应用第11章.ppt(108页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第11章 综合设计实例 11.1 有限状态机的概念及其设计实例有限状态机的概念及其设计实例11.1.1 有限状态机的概念有限状态机的概念有限状态机是时序电路的通用模型,任何时序电路都可以表示为有限状态机。有限状态机通常可分为两类:Moore型与Mealy型。下一状态只由当前状态决定的有限状态机称为Moore型有限状态机;下一状态不但与当前状态有关,而且与当前输入值有关的有限状态机为Mealy型有限状态机。实际上,Moore型有限状态机可看作Mealy型的特例。有限状态机从本质上讲是由寄存器与组合逻辑构成的时序电路,各个状态之间的转移总是在时钟的触发下进行的。通常可使用带有always语句的ca
2、se语句建模,状态信息存储在寄存器中,case语句的多个分支包含每个状态的行为。下面通过一个例子进行说明。 第11章 综合设计实例 【例例11-1】一个说明有限状态机描述的例子。/Moore型module sta_machine1(x, clock, current_state, z); parameter 1:0 set0 = 0,hold0 = 1,set1 = 2; input x, clock; output 1:0 current_state; output z; reg 1:0 current_state; reg z; /* 重新声明为寄存器型变量,以便于在always语句中赋值
3、。缺省时,端口是连线型,不能在always语句中赋值*/ reg 1:0 next_state; 第11章 综合设计实例 always (current_state) begin case (current_state) set0: begin z = 0 ; next_state = hold0; end第11章 综合设计实例 hold0: begin z = 0; if (x = 0) next_state = hold0; else next_state = set1; end第11章 综合设计实例 set1: begin z = 1; next_state = set0; end en
4、dcase end always (posedge clock) current_state = next_state;endmodule/Mealy型第11章 综合设计实例 module sta_machine2(x, clock, current_state, z); parameter 1:0 set0 = 0,hold0 = 1,set1 = 2; input x, clock; output 1:0current_state; output z; reg 1:0 current_state; reg z; /* 重新声明为寄存器型变量,以便于在always语句中赋值。缺省时,端口是连
5、线型,不能在always语句中赋值*/ reg 1:0 next_state;第11章 综合设计实例 always (x or current_state) begin case (current_state) set0: if(x=1) begin z = 0 ; next_state = hold0; end else z=1;第11章 综合设计实例 hold0: if (x = 0) begin next_state = hold0; z=0; end else begin next_state = set1; z=1; end第11章 综合设计实例 set1: if(x=1) begi
6、n z = 1; next_state = set0; end else z=0; endcase end always (posedge clock) begin current_state = next_state; endendmodule第11章 综合设计实例 11.1.2 有限状态机的设计实例有限状态机的设计实例在熟悉有限状态机基本描述方法的基础上,下面给出三个有限状态机的设计实例:饮料销售机、交通灯控制器与闹钟系统控制器。1. 饮料销售机饮料销售机这是一个饮料自动售货机的例子,每听饮料的售价为35美分,可以使用的硬币有三种:5美分(nickel)、一角(dime)、25美分(qua
7、rter),同时售货机具有找零功能。第11章 综合设计实例 【例例11-2】饮料销售机的例子。/功能模块部分define vend_a_drinkd,dispense,collect=idle,2b11module drink_machine(nickel_in,dime_in,quarter_in,collect, nickel_out,dime_out,dispense,reset,clk); parameter idle=0,five=1,ten=2,twenty_five=3, fifteen=4,thirty=5,twenty=6,owe_dime=7; input nickel_i
8、n,dime_in,quarter_in,reset,clk; output collect,nickel_out,dime_out,dispense; reg collect,nickel_out,dime_out,dispense; reg 2:0 d,q;第11章 综合设计实例 always (nickel_in or dime_in or quarter_in or reset) begin nickel_out=0; dime_out=0; dispense=0; collect=0; if(!reset) d=idle; else begin d=q;第11章 综合设计实例 cas
9、e(q) idle: if(nickel_in) d=five; else if (dime_in) d=ten; else if(quarter_in) d=twenty_five; five: if(nickel_in) d=ten; else if (dime_in) d=fifteen; else if(quarter_in) d=thirty;第11章 综合设计实例 ten: if(nickel_in) d=fifteen; else if (dime_in) d=twenty; else if(quarter_in) vend_a_drink; twenty_five: if(ni
10、ckel_in) d=thirty;第11章 综合设计实例 else if (dime_in) vend_a_drink; else if(quarter_in) begin vend_a_drink; nickel_out=1; dime_out=1; end第11章 综合设计实例 fifteen: if(nickel_in) d=twenty; else if (dime_in) d=twenty_five; else if(quarter_in) begin vend_a_drink; nickel_out=1; end第11章 综合设计实例 thirty: if(nickel_in)
11、vend_a_drink; else if (dime_in) begin vend_a_drink; nickel_out=1; end else if(quarter_in) begin vend_a_drink; nickel_out=1; d=owe_dime; end第11章 综合设计实例 twenty: if(nickel_in) d=twenty_five; else if (dime_in) d=thirty; else if(quarter_in) begin vend_a_drink; dime_out=1; end 第11章 综合设计实例 owe_dime: begin
12、dime_out=1; d=idle; end endcase end end always (posedge clk) begin q=d; endendmodule第11章 综合设计实例 /测试模块部分module stimulus; reg nickel_in,dime_in,quarter_in,reset,clk; wire collect,nickel_out,dime_out,dispense; drink_machine dr1(nickel_in,dime_in,quarter_in,collect,nickel_out, dime_out,dispense,reset,cl
13、k); initial begin reset=1; clk=1; nickel_in=0; dime_in=0; quarter_in=0;第11章 综合设计实例 #5 reset=0; #5 nickel_in=1; #2 reset=1; #3 nickel_in=0; dime_in=1; #10 dime_in=0; quarter_in=1; #10 nickel_in=1; quarter_in=0; #10 nickel_in=0;第11章 综合设计实例 repeat(5) begin #5 nickel_in=1; #5 nickel_in=0; end #5 $finish
14、; end always #5 clk=clk;endmodule仿真结果如图11.1所示。第11章 综合设计实例 图11.1 饮料销售机的仿真结果第11章 综合设计实例 在上面的例子中,将三种币值的投币信号(nickel_in、dime_in、quarter_in)作为模块的输入信号,系统的复位能力由输入信号reset控制,并且状态的转换是在输入时钟信号clk的上升沿完成的。为了便于比较,这里给出另外一种基于计数的实现方式,可供读者参考。module drink_machine2(nickel_in,dime_in,quarter_in,collect, nickel_out,dime_ou
15、t,dispense,reset,clk); input nickel_in, dime_in, quarter_in, reset, clk; output nickel_out, dime_out, collect, dispense; reg nickel_out, dime_out, dispense, collect; reg 3:0 nickel_count, temp_nickel_count; reg temp_return_change, return_change; always ( nickel_in or dime_in or quarter_in or collect
16、 or temp_nickel_count or reset or nickel_count or return_change)第11章 综合设计实例 begin nickel_out = 0; dime_out = 0; dispense = 0; collect = 0; temp_nickel_count = 0; temp_return_change = 0;第11章 综合设计实例 / 检查是否有钱放入 if (! reset) begin temp_nickel_count = nickel_count; if (nickel_in) temp_nickel_count = temp
17、_nickel_count + 1; else if (dime_in) temp_nickel_count = temp_nickel_count + 2; else if (quarter_in) temp_nickel_count = temp_nickel_count + 5;第11章 综合设计实例 if (temp_nickel_count = 7) begin temp_nickel_count = temp_nickel_count - 7; dispense = 1; collect = 1; end第11章 综合设计实例 if (return_change | collect
18、) begin if (temp_nickel_count = 2) begin dime_out = 1; temp_nickel_count = temp_nickel_count - 2; temp_return_change = 1; end第11章 综合设计实例 if (temp_nickel_count = 1) begin nickel_out = 1; temp_nickel_count = temp_nickel_count - 1; end end end end第11章 综合设计实例 always (posedge clk ) begin nickel_count = t
19、emp_nickel_count; return_change = temp_return_change; endendmodule第11章 综合设计实例 2. 交通灯控制器交通灯控制器本例实现高速公路与乡间小路红绿灯的控制。实现如下要求:(1) 只有在小路上发现汽车时,高速公路上的交通灯才可能变为红灯。(2) 当有汽车在小路上时,小路的交通灯保持为绿灯,但不能超过给定的延迟时间。(3) 公路灯转为绿灯后,即使小路上有汽车出现,而公路上并无汽车,也将在给定的时间内保持绿灯。此交通灯控制器可用一个有限自动机来实现。由上所述,它定义了5种状态,如表11.1所示。其状态转换图如图11.2所示。第11
20、章 综合设计实例 表 11.1 交通控制器的 5 种状态 状态 公路灯 小路灯 0 绿 红 1 黄 红 2 红 绿 3 红 黄 4 红 红 第11章 综合设计实例 图11.2 交通灯控制器的状态转换图状态1状态4状态0状态2状态3C&LSC|LS第11章 综合设计实例 图11.2中,C表示小路上有车;L表示过了一段长的时间;S表示过了一段短的时间;操作符“&”表示逻辑与的关系;操作符|表示逻辑或的关系。基于上述有限状态机的状态转换关系,可以得到如下的Verilog HDL实现程序。【例例11-3】交通灯控制器。/功能模块部分module traffic(car,timeoutL,timeout
21、S,newHL,newFL,newST); input car,timeoutL,timeoutS; output 3:1 newHL,newFL; output newST; reg 3:1 newHL,newFL; reg newST; reg 3:1 cur_state,next_state;第11章 综合设计实例 initial begin cur_state=3b111; newHL=3b100; newFL=3b001; newST=0; end第11章 综合设计实例 always (car or timeoutL or timeoutS) begin case(cur_state
22、) 3b000: begin newHL=3b100; newFL=3b001; if(car=1) & (timeoutL=1) begin next_state=3b100; newST=1; newHL=3b010; newFL=3b001; end第11章 综合设计实例 else begin next_state=3b000; newST=0; end end第11章 综合设计实例 3b100: begin newHL=3b010; newFL=3b001; if(timeoutS=1) begin next_state=3b010; newST=1; newHL=3b001; new
23、FL=3b100; end else begin next_state=3b100; newST=0; end end第11章 综合设计实例 3b010: begin newHL=3b001; newFL=3b100; if(car=0) | (timeoutL=1) begin next_state=3b110; newST=1; newHL=3b001; newFL=3b010; end else begin next_state=3b010; newST=0; end end第11章 综合设计实例 3b110: begin newHL=3b001; newFL=3b010; if(tim
24、eoutS=1) begin next_state=3b000; newST=1; newHL=3b100; newFL=3b001; end else begin next_state=3b110; newST=0; end end第11章 综合设计实例 3b111: begin next_state=3b000; newHL=3b100; newFL=3b001; newST=0; end endcase cur_state=next_state; endendmodule第11章 综合设计实例 /测试模块部分module sti_traffic; reg car,timeoutL,tim
25、eoutS; wire 3:1 newHL,newFL; wire newST; traffic t1(car,timeoutL,timeoutS,newHL,newFL,newST); initial begin car=0; timeoutL=0; timeoutS=0;第11章 综合设计实例 #20 car=1; timeoutL=1; #20 timeoutS=1; timeoutL=0; car=0; #20 car=1; #20 car=0; timeoutS=0; #20 timeoutS=1; #20 timeoutS=0; timeoutL=1; car=1; #10 tim
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog HDL 数字 系统 设计 及其 应用 11
限制150内