net11 有限状态机
FPGA开发中 各个always块都是并行运行的 但有些时候希望顺序运行 有限状态机
要学会:1 两段式状态机写法 2 自动仿真脚本的使用方法
状态机
mealy型:输出不仅与当前状态有关,还与输入有关
moore型:输出只与当前状态有关。
正常不用考虑哪种类型,能够完成功能就行
改文件头
首选项 浏览插件目录 verilog gadget template verilog_header.v文件进行修改
声明状态机
首先确认有几个状态 编码
//2'b00 2'b01 2'b10 binary 2bit表示的状态,时钟采集信号时,就需要采集2个信号的状态,如果两个信号到达时间不一样,就容易产生时序问题
//3'b001 3'b010 3'b100 one hot 只判断某一位为高,就认为在哪一状态,不会去考虑另外两个比特的状态。能使我们时序上的逻辑特性变好
两段式 一段描述状态的迁移,一段描述赋值的操作
module fsm( input wire clk, input wire rst, input wire money, output reg tea); parameter IDLE=3'b001; parameter ONE=3'b010; parameter TWO=3'b100; reg [2:0]state; always@(posedge clk or negedge rst) begin if(!rst) state<=IDLE; else begin case(state) IDLE:begin if(money) state<=ONE; end ONE:begin if(money) state<=TWO; else if(!money)//这一句可以不写 因为是时序电路,所以不写的话默认是保持的。 state<=state; end TWO:if(money) state<=IDLE; default:state<=IDLE; endcase end end always @(posedge clk or negedge rst) begin if (!rst) begin tea<=0; end else if (state==TWO && money==1'b1) begin tea<=1'b1; end else begin tea<=0; end end endmodule
`timescale 1ns/1ns module tb_fsm(); reg clk,rst,money; wire tea; initial begin clk=0; rst=0; money=0; #50 rst=1'b1; end always #10 clk=~clk; always #10 money={$random}; fsm inst_fsm ( .clk (clk), .rst (rst), .money (money), .tea (tea) );//shift+tab 回退 endmodule

自动化仿真 通过脚本的方式启动仿真
添加界面(project)transcript栏 执行打印的一个过程
浙公网安备 33010602011771号