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