加减计数器可以实现加1或减1操作。
module count32( input wire clk, input wire rst, input wire s, output reg[31:0] out);always@( posedge clk) begin if(rst) begin out <= 32'h0; if(s) out <= out + 32'h1; end else begin out <= 32'hffffffff; if(s) out <= out - 32'h1; endendendmodule
4.6 其他时序逻辑电路
五. 有限状态机的设计
5.1 有限状态机概述
finite state machine FSM
设计技术是数字系统设计的重要组成部分,也是时序电路设计中经常采用的一种设计方式,适用于实现高效率、高可靠的控制模块,
在一些需要控制高速器件的场合
5进制计数器
module count5_moor( input wire clk, input wire reset, output reg cout, output reg[2:0] out);reg[2:0] current; parameter s0 = 3'b000,s1 = 3'b001,s2 = 3'b010,s3 = 3'b011,s4 = 3'b100;//????always@(posedge clk or negedge reset) begin if(!reset) begin out <= 0; current <= s0; cout <= 0; end else case(current) s0: begin out <= 1; current <= s1; cout <= 0; end s1: begin out <= 2; current <= s2; cout <= 0; end s2: begin out <= 3; current <= s3; cout <= 0; end s3: begin out <= 4; current <= s4; cout <= 10; end s4: begin out <= 0; current <= s0; cout <= 0; end default :current = s0; endcase endendmodule module count5_moor_tb; reg clk; reg reset; wire cout; wire[2:0] out; integer i;initial begin clk = 0;reset = 0;#5 clk = 1;#5 clk = 0;#5 clk = 1;#5 clk = 0; #20 reset = 1;#5 clk = 1;#5 clk = 0;#5 clk = 1;#5 clk = 0; #5 clk = 1;#5 clk = 0; #5 clk = 1;#5 clk = 0; endcount5_moor count5_moor0( .clk(clk), .reset(reset), .count(count), .out(out) );endmodule 110序列检测器
module detector_110_moor( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] current; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b10,s3 = 2'b11;always@(posedge clk or posedge reset) begin if(reset) begin current <= s0; end else case(current) s0: begin if(in == 1'b1) current <=s1; else current <= s0; end s1: begin if(in == 1'b1) current <=s2; else current <= s0; end s2: begin if(in == 1'b1) current <=s2; else current <= s3; end s3: begin if(in == 1'b1) current <=s1; else current <= s0; end default: current <= s0; endcase endalways@(current) begin if (current == s3) out <= 1'b1; else out <= 1'b0; endendmodule module detector_110_moor_tb; reg clk; reg reset; reg in; wire out;initial begin clk = 0; reset = 1; #20 reset = 0; #5 clk = 1; in = 1; #5 clk = 0; in = 0; #5 clk = 1; in = 1; #5 clk = 0; in = 1; #5 clk = 1; in = 0; #5 clk = 0; in = 1; #5 clk = 1; in = 1; #5 clk = 0; in = 1;end detector_110_moor detector_110_moor0( .clk(clk), .reset(reset), .in(in), .out(out));endmodule 1.2米里型状态机
110序列检测器
module detector_110_dealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] current; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11;always@(posedge clk or posedge reset) begin if(reset) begin current <= s0; end else case(current) s0: begin if(in == 1'b1) current <=s1; else begin current <= s0;out <=0; end end s1: begin if(in == 1'b1) current <=s2; else begin current <= s0;out <=0;end end s2: begin if(in == 1'b1) current <=s2; else begin current <= s0;out <=1;end end default: current <= s0; endcase endendmodule
两个always进程语句来描述状态机。其中一个always进程语句来描述有限状态机的次态逻辑和状态寄存器和输出逻辑中的任意两个,另外一个always进程语句则用来描述有限状态机剩余的功能。
程序中用parameter和二进制数的方式定义状态。第一个always进程语句实现的是一个寄存器,第二个always语句是一个纯粹的组合快。
module detector_110_mealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] current; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11; always@(posedge clk or posedge reset) begin if(reset) begin current <= s0; end else case(current) s0: begin if(in == 1'b1) current <=s1; else current <= s0; end s1: begin if(in == 1'b1) current <=s2; else begin current <= s0;end end s2: begin if(in == 1'b1) current <=s2; else begin current <= s0;end end default: current <= s0; endcase end always@(current or in) begin if((current == s2)&(in == 1'b0)) out <= 1'b1; else out <= 1'b0; endendmodule module detector_110_mealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] p_state,n_state; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11; always@(posedge clk) begin if(reset) p_state <=s0; else p_state <= n_state; end always@(p_state or in ) begin case(p_state) s0: begin if(in == 1'b1) n_state <=s1; else begin n_state <= s0;out = 1'b0; end end s1: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;out = 1'b0;end end s2: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;out = 1'b1;end end default: n_state <= s0; endcase end endmodule 第一个always语句用来描述有限状态机的次态逻辑。第二个always语句用来描述状态寄存器和输出逻辑。
三进程描述方式
三个进程语句来描述有限状态机的功能,
分别描述状态机的
次态逻辑
状态寄存器
和输出逻辑(可以组合逻辑输出,也可以时序逻辑输出)
module detector_110_three_Mealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] p_state,n_state; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11; always@(posedge clk) begin if(reset) p_state <=s0; else p_state <= n_state; end always@(p_state or in ) begin case(p_state) s0: begin if(in == 1'b1) n_state <=s1; else begin n_state <= s0; end end s1: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;end end s2: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;end end default: n_state <= s0; endcase end always@(p_state or in) begin case (p_state) s0: out = 1'b0; s1: out = 1'b0; s2: if(in == 1'b0) out = 1'b1; else out = 1'b0; default: out =1'b0; endcase endendmodule
加减计数器可以实现加1或减1操作。
module count32( input wire clk, input wire rst, input wire s, output reg[31:0] out);always@( posedge clk) begin if(rst) begin out <= 32'h0; if(s) out <= out + 32'h1; end else begin out <= 32'hffffffff; if(s) out <= out - 32'h1; endendendmodule
4.6 其他时序逻辑电路
五. 有限状态机的设计
5.1 有限状态机概述
finite state machine FSM
设计技术是数字系统设计的重要组成部分,也是时序电路设计中经常采用的一种设计方式,适用于实现高效率、高可靠的控制模块,
在一些需要控制高速器件的场合
5进制计数器
module count5_moor( input wire clk, input wire reset, output reg cout, output reg[2:0] out);reg[2:0] current; parameter s0 = 3'b000,s1 = 3'b001,s2 = 3'b010,s3 = 3'b011,s4 = 3'b100;//????always@(posedge clk or negedge reset) begin if(!reset) begin out <= 0; current <= s0; cout <= 0; end else case(current) s0: begin out <= 1; current <= s1; cout <= 0; end s1: begin out <= 2; current <= s2; cout <= 0; end s2: begin out <= 3; current <= s3; cout <= 0; end s3: begin out <= 4; current <= s4; cout <= 10; end s4: begin out <= 0; current <= s0; cout <= 0; end default :current = s0; endcase endendmodule module count5_moor_tb; reg clk; reg reset; wire cout; wire[2:0] out; integer i;initial begin clk = 0;reset = 0;#5 clk = 1;#5 clk = 0;#5 clk = 1;#5 clk = 0; #20 reset = 1;#5 clk = 1;#5 clk = 0;#5 clk = 1;#5 clk = 0; #5 clk = 1;#5 clk = 0; #5 clk = 1;#5 clk = 0; endcount5_moor count5_moor0( .clk(clk), .reset(reset), .count(count), .out(out) );endmodule 110序列检测器
module detector_110_moor( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] current; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b10,s3 = 2'b11;always@(posedge clk or posedge reset) begin if(reset) begin current <= s0; end else case(current) s0: begin if(in == 1'b1) current <=s1; else current <= s0; end s1: begin if(in == 1'b1) current <=s2; else current <= s0; end s2: begin if(in == 1'b1) current <=s2; else current <= s3; end s3: begin if(in == 1'b1) current <=s1; else current <= s0; end default: current <= s0; endcase endalways@(current) begin if (current == s3) out <= 1'b1; else out <= 1'b0; endendmodule module detector_110_moor_tb; reg clk; reg reset; reg in; wire out;initial begin clk = 0; reset = 1; #20 reset = 0; #5 clk = 1; in = 1; #5 clk = 0; in = 0; #5 clk = 1; in = 1; #5 clk = 0; in = 1; #5 clk = 1; in = 0; #5 clk = 0; in = 1; #5 clk = 1; in = 1; #5 clk = 0; in = 1;end detector_110_moor detector_110_moor0( .clk(clk), .reset(reset), .in(in), .out(out));endmodule 1.2米里型状态机
110序列检测器
module detector_110_dealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] current; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11;always@(posedge clk or posedge reset) begin if(reset) begin current <= s0; end else case(current) s0: begin if(in == 1'b1) current <=s1; else begin current <= s0;out <=0; end end s1: begin if(in == 1'b1) current <=s2; else begin current <= s0;out <=0;end end s2: begin if(in == 1'b1) current <=s2; else begin current <= s0;out <=1;end end default: current <= s0; endcase endendmodule
两个always进程语句来描述状态机。其中一个always进程语句来描述有限状态机的次态逻辑和状态寄存器和输出逻辑中的任意两个,另外一个always进程语句则用来描述有限状态机剩余的功能。
程序中用parameter和二进制数的方式定义状态。第一个always进程语句实现的是一个寄存器,第二个always语句是一个纯粹的组合快。
module detector_110_mealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] current; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11; always@(posedge clk or posedge reset) begin if(reset) begin current <= s0; end else case(current) s0: begin if(in == 1'b1) current <=s1; else current <= s0; end s1: begin if(in == 1'b1) current <=s2; else begin current <= s0;end end s2: begin if(in == 1'b1) current <=s2; else begin current <= s0;end end default: current <= s0; endcase end always@(current or in) begin if((current == s2)&(in == 1'b0)) out <= 1'b1; else out <= 1'b0; endendmodule module detector_110_mealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] p_state,n_state; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11; always@(posedge clk) begin if(reset) p_state <=s0; else p_state <= n_state; end always@(p_state or in ) begin case(p_state) s0: begin if(in == 1'b1) n_state <=s1; else begin n_state <= s0;out = 1'b0; end end s1: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;out = 1'b0;end end s2: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;out = 1'b1;end end default: n_state <= s0; endcase end endmodule 第一个always语句用来描述有限状态机的次态逻辑。第二个always语句用来描述状态寄存器和输出逻辑。
三进程描述方式
三个进程语句来描述有限状态机的功能,
分别描述状态机的
次态逻辑
状态寄存器
和输出逻辑(可以组合逻辑输出,也可以时序逻辑输出)
module detector_110_three_Mealy( input wire clk, input wire reset, input wire in, output reg out); reg[1:0] p_state,n_state; parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b11; always@(posedge clk) begin if(reset) p_state <=s0; else p_state <= n_state; end always@(p_state or in ) begin case(p_state) s0: begin if(in == 1'b1) n_state <=s1; else begin n_state <= s0; end end s1: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;end end s2: begin if(in == 1'b1) n_state <=s2; else begin n_state <= s0;end end default: n_state <= s0; endcase end always@(p_state or in) begin case (p_state) s0: out = 1'b0; s1: out = 1'b0; s2: if(in == 1'b0) out = 1'b1; else out = 1'b0; default: out =1'b0; endcase endendmodule