第8章数字系统设计verilog HDL(第6版)王金明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第8章 Verilog有限状态机设计
8.1 有限状态机
摩尔型(Moore)状态机
米里型(Mealy)状态机
用状态机设计模5计数器
module fsm(clk,clr,z,qout);
input clk,clr; output reg z; output reg[2:0] qout; always @(posedge clk or posedge clr) //此过程定义状态转换begin if(clr) qout<=0; //异步复位
else case(qout)
3'b000: qout<=3'b001;
3'b001: qout<=3'b010;
3'b010: qout<=3'b011;
3'b011: qout<=3'b100;
3'b100: qout<=3'b000;
default: qout<=3'b000;/*default语句*/
endcase
end
always @(qout) /*此过程产生输出逻辑*/ begin case(qout)
3'b100: z=1'b1;
default:z=1'b0;
endcase
end
endmodule
8.2 有限状态机的几种描述方式
“101”序列检测器的Verilog 描述(三个过程)
module fsm1_seq101(clk,clr,x,z);input clk,clr,x; output reg z; reg[1:0] state,next_state;parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10; /*状态编码,采用格雷(Gray )编码方式*/always @(posedge clk or posedge clr) /*该过程定义当前状态*/begin if(clr) state<=S0; //异步复位,s0为起始状态else state<=next_state;end always @(state or x) /*该过程定义次态*/begin case (state)
S0:begin if(x) next_state<=S1;else next_state<=S0; end S1:begin if(x) next_state<=S1;else next_state<=S2; end
S2:begin
if(x) next_state<=S3; else next_state<=S0; end S3:b e g i n
i f(x)
next_state<=S1;
else next_state<=S2; end
default:next_state<=S0;
/*default语句*/ endcase
end always @(state)
/*该过程产生输出逻辑*/ begin case(state)
S3: z=1'b1;
default:z=1'b0; endcase
end
endmodule
“101”序列检测器的Verilog描述(三个过程)
“101”序列检测器(单过程描述)module fsm4_seq101(clk,clr,x,z);
input clk,clr,x; output reg z; reg[1:0] state; parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;
/*状态编码,采用格雷(Gray)编码方式*/
always @(posedge clk or posedge clr)
Begin if(clr) state<=S0; //异步复位,s0为起始状态else case(state)
S0:begin if(x) begin state<=S1; z=1'b0;end
else begin state<=S0; z=1'b0;end
end
S1:begin if(x) begin state<=S1; z=1'b0;end
else begin state<=S2; z=1'b0;end
end
S2:begin if(x) begin state<=S3; z=1'b0;end
else begin state<=S0; z=1'b0;end
end
S3:begin if(x) begin state<=S1; z=1'b1;end
else begin state<=S2; z=1'b1;end
end
default:begin state<=S0; z=1'b0;end /*default语句*/ endcase end
endmodule
8.3 状态编码常用的编码方式
一位热码编码选择对话框(Quartus Ⅱ)
在Verilog语言中,有两种方式可用于定义状态编码,分别用parameter和'define语句实现,比如要为state0、state1、state2、state3四个状态定义码字为:00、01、11、10,可采用下面两种方式。

方式1:用parameter参数定义
parameter
state1=2'b00,state2=2'b01,state3=2'b11,state4=2'b10; ……
case(state)
state1:…; //调用
state2:…;
……
状态编码的定义方式2:用'define语句定义
'define state1 2'b00 //不要加分号“;”'define state2 2'b01
'define state3 2'b11
'define state4 2'b10
case(state)
'state1:…; //调用,不要漏掉符号“'”'state2:…;
……
8.4 有限状态机设计要点
多余状态的处理
习题 8
习题 8
实验与设计
“101”序列检测器的Verilog描述(三个过程)module backlight(clk50m,turnl,turnr,brake,fault,lightl,lightr);
(* chip_pin="Y2" *) input clk50m; //时钟
(* chip_pin="AB28" *) input turnl; //左转信号
(* chip_pin="AC28" *) input turnr; //右转信号
(* chip_pin="AC27" *) input brake; //刹车信号
(* chip_pin="AD27" *) input fault; //故障信号
(* chip_pin="E18,F18,F21" *)output[2:0] lightl; //左侧灯
(* chip_pin="E19,F19,G19" *)output[2:0] lightr; //右侧灯
reg[23:0] count;
wire clock;
reg[2:0] shift=3'b001;
reg flash=1'b0;
always@(posedge clk50m)
begin if(count==12500000) count<=0; else count<=count+1; end assign clock=count[23];
always@(posedge clock)
begin shift={shift[1:0],shift[2]};flash=~flash; end
assign lightl=turnl?shift:brake?3'b111:fault?{3{flash}}:3'b000;
assign lightr=turnr?shift:brake?3'b111:fault?{3{flash}}:3'b000; endmodule
ADC0809工作时序ADC0809引脚图。

相关文档
最新文档