赞
踩
有限状态机是由寄存器和组合逻辑构成的硬件时序电路。其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。转向哪个状态不但取决于输入值,还取决于当前状态。其可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的核心控制。
module ex_fsm( input wire sclk, input wire rst, output reg k1, output reg k2, input wire A ); parameter IDLE = 4'b0001; //写出状态的表达式 parameter START = 4'b0010; parameter STOP = 4'b0100; parameter CLEAR = 4'b1000; reg [3:0] state; //4'b0001,4'b0010,4'b0100,4'b1000 //四个状态:4'b0001,4'b0010,4'b0100,4'b1000。独热码占用寄存器数量多,但是组合逻辑资源消耗少,高速。 //用独热码时,每个状态用1比特表示。if(state == 4'b0001) ---> if(state[0] == 1'b1) //四个状态:2'b00,2'b01,2'b10,2'b11。二进制编码用的寄存器数量少,但是用的组合逻辑资源较多 //第一段描述状态机 always @ (posedge sclk or negedge rst) if(rst == 1'b0) state <= IDLE; else case(state) IDLE: if(A == 1'b1) //输入A=1进行状态的跳转 state <= START; START: if(A == 1'b0) state <= STOP; STOP: if(A == 1'b1) state <= CLEAR; CLEAR: if(A == 1'b0) state <= IDLE; default: state <= IDLE; endcase //第二段用状态机控制变量输出---k1 always @ (posedge sclk or negedge rst) if(rst == 1'b0) k1 <= 1'b0; else if(state == IDLE && A== 1'b1) k1 <= 1'b0; else if(state == CLEAR && A == 1'b0) k1 <= 1'b1; //k2 always @ (posedge sclk or negedge rst) if(rst == 1'b0) k2 <= 1'b0; else if(state == STOP && A == 1'b1) k2 <= 1'b1; else if(state == CLEAR && A == 1'b0) k2 <= 1'b0; endmodule
`timescale 1ns/1ns module tb_ex_fsm; reg sclk,rst; reg A; wire k1,k2; initial begin sclk <= 0; rst <= 0; #100; rst <= 1; end initial begin #200; in_data(); end always #10 sclk <= ~sclk; ex_fsm tb_ex_fsm( .sclk(sclk), .rst(rst), .k1(k1), .k2(k2), .A(A) ); task in_data(); //产生数据A integer i; begin for (i=0;i<1024;i=i+1) begin @(posedge sclk); if(i<50) A <= 0; else if (i < 200) A <= 1; else if (i < 700) A <= 0; else if (i < 800) A <= 1; else if (i < 900) A <= 0; end end endtask endmodule
后仿真:带有器件延时文件的仿真。
.sdo文件是延时文件
.vo是网表文件
库文件:quartus—>eda—>sim_ilb
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。