lcytms 发表于 2017-7-24 09:52:55

表示方法之四(续)

modulefsm (Clock, Reset, A,K2, K1, state);
input Clock, Reset, A;
output K2, K1;
output state;
reg state ;
 
assign
K2= state;// 把状态变量的最高位用作输出K2
assign
K1= state;// 把状态变量的最低位用作输出K1

lcytms 发表于 2017-7-24 09:54:06

表示方法之四(续)

parameter
//-------output coded state assignment   ---
//--------       K2_i_j_n_K1 –
Idle      =5'b0_0_0_0_0,
Start       =5'b0_0_0_1_0,
Stop      =5'b0_0_1_0_0,
StopToClear =5‘b1_1_0_0_0,//这里就是状态变化
Clear       =5‘b0_1_0_1_0,//从而产生了输出
ClearToIdle =5'b0_0_1_1_1;
 
主要的改进在状态变化产生输出的过程编入了状态编码
中,这样就省去了多余的always block。这里如何编码
是最重要的。

lcytms 发表于 2017-7-24 09:55:27

表示方法之四(续)

always @(posedge Clock)
if (!Reset)
   begin
   state <= Idle;
   end
else
case (state)
    Idle :if (A)   
            state <= Start;      
            else state <= Idle;
               
    Start:if (!A)state <= Stop;
               elsestate <= Start;
      

lcytms 发表于 2017-7-24 09:56:40

表示方法之四(续)

Stop:   if (A)
             state <= StopToClear;      
         elsestate <= Stop;

StopToClear:state <= Clear;//既然是to clear状态自然为clear

Clear:if (!A)
            state <= ClearToIdle;      
      elsestate <= Clear;
               
ClearToIdle:state <= Idle;
 
default:   state <= Idle;
endcase
endmodule

lcytms 发表于 2017-7-24 09:58:24

状态机的测试

    不同风格的描述适合不同规模的状态机和不同的综合工具,有的风格查错和修改较容易,但写简单的状态机时比较麻烦。
Synopsys公司的综合器建议使用这种风格来描述状态机。
 
   上面四个例子是同一个状态机的四种不同的Verilog HDL模型,它们都是可综合的,在设计复杂程度不同的状态机时有它们各自的优势。
如用不同的综合器对这四个例子进行综合,综合出的逻辑电路可能会有些不同,但逻辑功能是相同的。
下面列出测试这些不同风格状态机的测试模块,供同学们参考:
 

小舍YZ 发表于 2017-7-24 14:25:55

不同风格的描述适合不同规模的状态机和不同的综合工具,有的风格查错和修改较容易,但写简单的状态机时比较麻烦。
Synopsys公司的综合器建议使用这种风格来描述状态机。

赞,,,,,,,,,,,,,,,,谢谢分享。。。。。。。。。。。。。。。。。:lol

4798345 发表于 2017-7-24 16:23:46

感谢楼主                        

lcytms 发表于 2017-7-25 09:40:05

状态机的测试模块

`timescale 1ns/1ns
module t;
   reg a;
   reg clock,rst;
   wire k2,k1;
initial            // initial常用于仿真时信号的给出。
   begin
       a=0;
       rst = 1;       //给复位信号变量赋初始值
       clock = 0;      //给时钟变量赋初始值
       #22 rst = 0;    //使复位信号有效
       #133 rst = 1;   //经过一个多周期后使复位信号无效
   end
 

lcytms 发表于 2017-7-25 09:41:44

状态机的测试模块

always #50 clock = ~clock; //产生周期性的时钟
 
always @ (posedge clock)   //在每次时钟正跳变沿时刻产生不同的a
      begin   
             #30 a = {$random}%2;   // 每次a是 0还是1是随机的。
             #(3*50+12);// a 的值维持一段时间
      end
initial
      begin   #100000   $stop;end   
            //系统任务,暂停仿真以便观察仿真波形。
 
//----------- 调用被测试模块t.m ----------
fsmm(.Clock(clock), .Reset(rst),.A(a),.K2(k2),.K1(k1));   
   
endmodule   
 

lcytms 发表于 2017-7-25 09:43:41

状态机设计的总结:

有限状态机设计的一般步骤:
              1)  逻辑抽象,得出状态转换图

              2)  状态化简

             3)  状态分配
   在触发器资源丰富的FPGA或ASIC设计中采用独热编码(one-hot-coding),既可以使电路性能得到保证又可充分利用其触发器数量多的优势,也可以采取输出编码的状态指定来简化电路结构,并提高状态机的运行速度。
 
4) 选定触发器的类型并求出状态方程、驱动方程和输出方程。
 
 5)   按照方程得出逻辑图
页: 1 2 3 4 5 6 [7] 8 9 10 11
查看完整版本: Verilog HDL 夏宇闻--数字系统设计的核心知识