1、一、 EDA的概念 1、定义:电子(系统)设计的自动化,或电子线路或系统的计算机辅助设计。是基于计算机平台的一整套先进的设计电子系统的软件工具。 2、研究对象:电子电路与系统设计的全过程:低频、高频、微波电路、线性与非线性电路、模拟和数字电路、分离电路和集成电路。 3、设计的层次 三个层次: Ø 系统级 Ø 电路级 Ø 物理实现级。 4.EDA技术发展的三个阶段 Ø CAD阶段(70s):EDA的初级阶段。利用功能有限的计算机进行简单的电路性能分析和预测,PCB的计算机辅助布局布线,如smart work。 Ø CAE阶段(80s):CAD工具逐步完善和发展,将许多单点工具
2、集成在一起使用, EDA阶段(90s):超大规模集成电路时代,集成电路工艺水平达到深亚微米,一个芯片可集成上千万个晶体管,速度达giga bit/s,对电子设计的工具提出了更高的要求,同时也促进了设计工具的发展。出现了众多的ICCAD工具,如CADENCE,MENTOR GRAPHICS,SYNOPSIS等著名公司的EDA软件;中国的熊猫系统等。 6、现代EDA 技术的特点 1)采用硬件描述语言(HDL);具有如下突出优点:语言的公开性和可利用性、设计与工艺无关、宽范围的描述能力、便于大规模系统设计和设计的可复用、交流、保存、修改; 2)高层综合和优化:开发工具支持系统级的综合和仿真,
3、可更好地支持自上而下的设计方法; 3)并行工程:系统化的、集成化的、并行的产品及相关过程的开发模式,支持多人同时并行进行设计工作。 4)开放性和标准化:EDA工具的相互兼容,有利于资源共享。 二、数字系统的设计思想 系统级设计à功能级描述à功能仿真à门级描述à时序仿真;自上而下逐级细化的设计方法。设计需要经过 “设计-验证-修改-再验证”的过程。 三、IP核复用技术与SOC 1、IP复用技术 1)何谓IP复用技术:Intellectual Property(IP)原指知识产权、著作权等,在IC设计领域指具有某种功能的虚拟电路模块。设计系统时使用或反复使用某些IP称IP复用。 2
4、IP分硬核、固核和软核三种。硬核指固定的版图模块,用户不能修改;软核指用HDL描述的功能模块,用户可以进行修改;固核介于硬核和软核之间,用户可进行一些修改。 2、SOC 1)定义:System On a Chip系统芯片,即把整个系统集成在一片芯片中。 2)硬件和软件技术发展到今天,用户已经可以通过编程设计自己的系统,该系统可以包括微处理器(MCU)、RAM/ROM和逻辑电路等。 四、数字系统的实现方式 1、全定制(full custom)方式:基于版图的设计方法,分通用和专用集成电路设计; 2、半定制(semi custom)设计:是在厂家提供的基本单元的基础上的进行的二次设计
5、又有一下三种方式: u 门阵列(gate array):在半成品基础上的设计方式。半成品含有加工好的大量的晶体管和IO焊盘,但没有布线。布线由用户设计,实现特定的功能。 u 标准单元(standard cell):利用厂家的标准单元进行设计的方式。 u PLD方式:器件已经制造好,用户自己编程便可实现各种功能。 5、硬件描述语言的不足 Ø 电路采用高级的简明结构HDL描述,它意味着放弃了对电路门级实现定义的控制; Ø 由综合工具生成的逻辑实现效果不好; Ø 工具的不同导致综合质量的不同。 第二部分 可编程逻辑器件(PLD) 1、ASIC:Application Sp
6、ecific Integrated Circuits,即专用集成电路,是面向特定用户、具有专门用途的芯片,并依此区别于通用芯片. 2、PLD,Programmable Logic Devices,是20世纪70s发展起来的一种新型器件,它的应用和发展不仅简化了电路设计,降低了成本,提高了系统的可靠性,且给数字系统的设计带来了革命性变化。 (二)PLD的分类 (p18) (四)CPLD的结构与特点(EMP7032内部结构图) CPLD是在PAL、GAL的基础上发展起来的阵列型PLD,具有高密度高速度的优点。从结构上看,CPLD一般包括3种结构: u 宏单元:主要包括与或阵列、触发
7、器和多路选择器 等电路,可独立配置为组合逻辑或时序逻辑; u 可编程IO单元:可独立配置为输入、输出和双向 IO; u 可编程内部连线(PIA):其作用是在各逻辑宏单 元之间以及宏单元和IO之间提供互连网络。 (五)FPGA的结构与特点(FLEX10K10内部结构图) 与CPLD相比,FPGA具有更高的集成度、更强的逻辑功能和更大的灵活性。一般由3部分组成: n 可配置逻辑块(CLB,Configurable Logic Block ) n 输入输出模块(IOB) n 可编程互连线(PI) n 片内RAM
8、五)FPGA的结构与特点 1、可配置逻辑块(CLB,Configurable Logic Block ):是FPGA的基本结构单元,不仅能实现逻辑函数,还可以配置成RAM等形式。其显著特点是内部有查找表(LUT); 2、输入输出模块(IOB):作用同CPLD; 3、可编程互连线(PI):作用同CPLD,不同点是其布线延时不固定,与路径有关,而CPLD的固定。 4、片内RAM:其读的速度(3-4ns)和写的速度(5ns)非常快,比任何片外解决方案快很多倍,可配置成各种形式。 六)在系统可编程(ISP)与边界扫描(BST)技术 1、在系统可编程:ISP,In System Progr
9、ammable,指的是对器件、电路板或整个电子系统的逻辑功能可随时进行修改或重构的能力。 2、边界扫描测试(BST)技术:由于器件越来越复杂,表面封装技术和电路板制造技术的进步,使得电路板的变小变密,传统的测试方法很难实现。 (七)PLD产品概述:PLD的发展趋势 p 向大规模、高集成度方向发展; p 向低电压、低功耗、低价格的方向发展; p 向高速可预测延时方向发展; p 在PLD内嵌入多种功能模块; p 向模数混合可编程的方向发展。 二、ALTERA可编程逻辑器件 (二)MAX7000系列器件 MAX7000系列内部结构:组成模块: (1)LAB: Logic Arr
10、ay Block,逻辑阵列块,内含16个宏单元,是器件的主要组成部分; (2)MC:Macrocell,宏单元,由逻辑阵列、乘积项选择矩阵和可编程触发器组成,用于实现各种逻辑;(宏单元结构图) (3)EPT:Expander Product Term,扩展乘积项,用于辅助逻辑阵列实现复杂的逻辑; (4)PIA:Programmable Interconnect Array,可编程连线阵列,把LAB相互连接构成所需的逻辑。这个全局总线是可编程通道,它把器件中任何信号源连到其目的地;MAX系列的PIA有固定的布线延时,而FLEX系列的布线延时与路径有关; (5)I/O Control Bl
11、ock:I/O控制块,它允许每个I/O单独地配置为输入、输出和双向输入输出中的一种方式。(图) (三)FLEX10K系列内部结构:小结 1)FLEX系列器件的特点: 1.容量大,用于实现复杂的电路和系统 2.内部含有ROM/RAM; 3.内部含LUT,尽量采用查表法实现逻辑函数; 4.FLEX器件内部布局布线的延时与路径有关。 2)器件的特性设定 1.电压摆率(Slew-Rate)设定:设置低噪声/高速度方式; 2.漏极开路(Open-Drain)设定: 3.多电压(MultiVolt)I/O接口:FLEX10K的核和外围IO可以工作于不同的电压,其中Vccin引脚为内核
12、和输入缓冲器提供工作电压,Vccio为I/O引脚提供工作电压。 第三部分 可编程逻辑器件开发软件 第四部分:基于原理图输入的数字电路(系统)设计 2参数化计数器的使用( lpm_counter) 1)输入信号选择 n data[]:数据输入,用于预置数; n clock:输入时钟; n clk_en:输入时钟使能; n cnt_en:计数器使能; n updown:加(1)减(0)法选择; n aclr:异步清零; n aset:异步置数(AVALUE); n aload:异步置数(data[]); n sclr:同步清零; n
13、 sload:同步置数(data[]); n sset:同步置数(SVALUE)。 2)输出信号选择 u q[]:计数值输出; u eq[15..0]:计数值译码输出: q[]=0 eq[0]=1; q[]=1 eq[1]=1;……q[]=15 eq[15]=1; 3 参数化RAM/ROM的使用( lpm_rom) 设计要点1:存储器输入输出的选择: INPUTS OUTPUTS address[] :输入地址
14、 q[]:存储器输出 Inclock :输入锁存时钟 Outclock :输出锁存时钟 memenab:使能 (六) 小结 (一)基于PLD的数字系统设计的优点 1、系统开发周期短 l 设计输入方法灵活多样; l 软件仿真,错误自动定位 l 修改方便; 2、系统体积小 3、系统可靠性好 4、系统保密性好 5、价格?可进一步降低价格。 (二)系统的设计思想 1、TOP-DOWN:用于设计性能级:概念-〉产品说明书(性能指标)-〉系统输入输出图(黑匣子); 功能级:系统输入输出图-〉系统框图(功能划分)-〉功能实现-〉仿真-〉网表; 结构级:原理图网表-
15、〉版图布局-〉版图布线-〉后仿真-〉网表 物理级:基本逻辑单元的设计。 重要概念: l from concept to netlist; l from concept to layout; l from concept to product; 2、bottom-up:用于实现基本逻辑单元-〉子功能模块-〉子系统-〉系统 (三)基于MAXPLUS II的系统设计流程 3.1概念-〉功能模块 3.2设计输入 1、原理图输入方法 l 最基本的方法; l 充分利用已有基本单元,74XX等; l 缺点:不够灵活(虽然编译时可自动消除冗余电路),如32位加法器等。 例1:多路选
16、择器 输入信号:in1[3..0],in2[3..0],in3[3..0],d[2..0]; 输出信号:q[3..0]; 要求:d[]=110时,q[]=in1[]; d[]=101时q[]=in2[];d[]=011时q[]=in3[]; 点评:该多路选择器不属于常规电路,没有现成的电路(74XX),用原理图输入非常麻烦,但用文本输入则方便快捷。 SUBDESIGN trymux ( in1[3..0],in2[3..0],in3[3..0],d[2..0] :INPUT; q[3..0] :OUTPUT; ) begin
17、 defaults q[]=GND; end defaults; case d[] is when B"110"=>q[]=in1[]; when B"101"=>q[]=in2[]; when B"011"=>q[]=in3[]; end case; end; 例2:地址发生器 输入信号:clk; 输出信号:111->110->101->011->110…; 要求:每来一个时钟脉冲,产生循环地址110、101、011;初始值为111。 点评:1)本地址发生器也不是规范电路,用原理图输入方法非常麻烦,但用AHDL非常方便;2)在AHDL中,状
18、态机是非常好用的工具,可方便地实现各种时间序列,如计数器、序列发生器、地址发生器、波形发生器等。 3.3 设计编译 编译的功能为:逻辑综合、逻辑试配 1、选择一个器件系列,不知具体选用哪个型号时选AUTO; 2、打开Design Doctor,进行错误检测和错误定位; 3、打开保护位: l 选择是否设置保护位; l 选择保留资源(reserved sources)的比例;I/O和逻辑单元一般留10%,使器件留有修改的余地。 4、选择全局的项目逻辑综合方式:选择是否自动选全局clock、clear、preset、output enable(缺省); 5、打开FLOOR PL
19、AN EDITOR观察试配结果 l 可以为某些型号指定引脚号; l 一般不能全部指定,否则影响试配的成功; 3.4 设计仿真 1、编辑输入波形,注意要覆盖设计电路的所有功能; 2、输入/输出信号可以从SNF选择,把有用的、关键的信号选出,不重要的中间波形可不选; 3、信号可选group形式或单个形式; 4、选择前仿真还是后仿真; 5、结果不对时,重新设计电路。 3.5 设计的下载 1、用编程卡+主编程器+适配器下载; 2、用BYTE BLASTER/BIT BLASTER下载(ISP器件); 3.5 通电试验 1、每个VCC 与GND之间要加0.1μF的电容; 2、
20、通电后器件微微发热,是正常现象; 3、学会一些调试手段和方法; (三)系统设计的要点 1、概念-〉功能模块的能力训练; 2、熟练运用三种设计输入方法,特别是综合运用原理图输入和文本输入方法;文本输入方法中必须掌握组合逻辑电路和状态机的设计方法; 3、熟练掌握以上数字系统设计的各个环节。 第五部分 Verilog HDL (一) 硬件描述语言的概念 n 硬件描述语言(Hardware Description Language),是电子系统硬件行为描述、结构描述、数据流描述的语言。 n 硬件描述语言诞生原因:在计算机辅助电子设计的过程中,逻辑图、分立元件作为整个越来越复杂的电
21、子系统的设计已经不适应,需要一种硬件描述语言来作为EDA工具的工作语言。 二、Verilog HDL语言介绍 1、Verilog HDL实例 module adder1(cout,sum,a,b,cin,enable); //模块声明 output[7:0] sum; //输出声明 output cout; input[7:0] a,b; //输入声明 input cin,enable; reg cout; //变量类型声明 reg[7:0] sum; always@(posedge enable) //always语句 begin {cout,sum}
22、a[7:0]+b[7:0]+cin; end endmodule 2、Verilog HDL程序基本结构 module<顶层模块名>(输入输出端口列表) output 端口名1,。。。,端口名N; input 端口名1,。。。,端口名M; wire //结果信号名 assign always@(敏感信号表达式) begin end 元件例化:and myand(a,b,c); Endmodule 3、Verilog HDL中逻辑功能的定义 1)用assign语句 Assign F=~((A&B)|(C&D)); 2)用元件例化 And myand3
23、f,a,b,c); 3)用always@语句描述各种逻辑功能 (二) 数据类型及常量、变量 1、常量的表示 8’b11000101 8’hc5 197 6’b1001xx-------------不定值 8’b1010zzzz----------高阻态 Parameter SEL=8, CODE=8’ha3; 2、变量的表示 Wire 数据名1,。。。,数据名n; Verilog HDL的缺省输入输出信号类型,只能用assign赋值,取值为0,1,x,z。 Reg 数据名1,。。。,数据名n; Reg[7:0] data; Reg[7:0] mymem
24、[1023:0] 变量小结: s型变量:其输出始终根据输入的变化而更新其值的变量,它一般指硬件电路中的各种物理连接。如wire变量。 2.register变量:它对应的是具有状态保持作用的电路元件,如触发器、寄存器等。如reg, integer变量。 3.register与nets变量的根本区别:前者有记忆性,后者无。 (三)运算符及表达式 6、缩减运算符 &:与;~&:与非;|:或;~|:或非;^:异或;^~, ~^:同或 缩减运算符是单目运算符,对单个操作数进行运算。 例若定义 reg[3:0] a; 则:b=&a等效为 b=a[0]&a[1]&a[2
25、]&a[3]; 又如,若A=5’b11001,则 &A=0; |A=1; 7、移位运算符 >>:右移 <<:左移; 例:若A=5’b11001,则A>>2的值为:5‘b00110 8、条件运算符----?: 是一种三目运算符,对三个操作数进行运算。其用法如下: Signal=condition? true_expression : false_expression Condition=1时执行true_expression,condition=0时执行false_expression. 9、位拼接运算符:{ } 作用:把两个或多个信号的某些位拼接起来。 例
26、如:全加器的描述 input[3:0] ina,inb; ina+inb+cin的进位自动放入 input cin; output[3:0] sum; output cout; assign {cout, sum}=ina+inb+cin; (三)运算符及表达式:运算符的优先级 不清楚优先级时,用扩号()来控制运算的优先级。 (四)赋值语句 1、连续赋值语句(continue assignments)assign为连续赋值语句,它对wire型变量进行赋值。例如:assign c=a&b;这里a b c为wire型变量,a和b信号的任何变化都随时反映到c上来,因此称
27、为连续赋值方式; 2、过程赋值语句(procedural assignments)对寄存器型(reg)变量进行赋值。分为非阻塞赋值语句和阻塞赋值语句。 (1)非阻塞赋值(non-blocking):b<=a; 特点:非阻塞赋值必需在块结束时才完成赋值操作,即b的值不是立刻就变的。 (2)阻塞赋值(blocking):b=a; 特点:赋值语句结束时就完成赋值操作,即b的值在赋值语句结束后立刻就变。 (五)条件语句 1、if –else语句(p144) 语句若为多句,用begin-end括起来。 2、case语句(p145) 要点:敏感表达式一般为一个变量或表达式;一般
28、要列出敏感表达式的所有可能取值,不能穷举时,剩余其它情况执行 default语句; 2)casez与casex语句 当case的分支取值每些位为高阻z,那末对这些位不予比较,只比关注别的位的比较结果,这时用casez语句;当case的分支取值每些位为高阻z或不定值x,那末对这些位不予比较,只比关注别的位的比较结果,这时用casex语句;可以用“?”标识x或z,表示无关值.如: Casez(select) 4’b???1: out=a; 4’b??10: out=b; //优先编码器 4’b?100: out=c; 4’b1000: out=d; endcase
29、 3、条件语句小结: 1)使用条件语句时,应注意列出所有条件分支,否则编译器认为条件不满足时,会引进一个触发器保持原值; 2)不可能列出所有分支时,if 语句后加else,case语句最后加default语句; 例6.9: Module burried_ff(c,b,a); Output c; Input b, a; Reg c; Always @ (a or b) begin if ((a==1)&&(b==1)) c=1; end endmodule 实现的功能为 实现的电路为 例6.
30、10 Module tryand2(c,b,a); Output c; Input b, a; Reg c; Always @ (a or b) begin if (a==1)&&(b==1) c=1; else c=0; end endmodule 实现的功能为 实现的电路为 (六)循环语句:for 语句 For(表达式1;表达式2;表达式3) 表达式1:循环变量初值;表达式2:循环结束条件;表达式3:循环变量增值。 Module voter
31、7(pass,vote); Output pass; Input [6:0] vote; Reg [2:0] sum; Integer i; Reg pass; Always@(vote) Begin sum=0; for(i=0;i<=6;i=i+1) if(vote[i]) sum=sum+1; if(sum[2]) pass=1;//4人以上为1。 else pass=0; end (七)结构说明语句:always@语句 格式:always@(<敏感信号表达式>) 敏感信号表达式:又称敏感表,当该表达式的值改变时,就会执行一遍块内的语句。例如:
32、 always@(in0 or in1 or in2 or in3); always@(posedge clk or negedge clear);上升沿posedge;下降沿negedge (八)语句的顺序执行与并行执行 always@块内的语句按照指定的顺序执行;always@块语句、assign语句、元件例化语句之间并行执行。 module serial1(q,a,clk); input clk; output q,a; reg q,a; always@(posedge clk) begin q=~q; a=~q; end endmodule
33、module serial2(q,a,clk); input clk; output q,a; reg q,a; always@(posedge clk) begin a=~q; q=~q; end endmodule 再如: module paral1(q,a,clk); input clk; output q,a; reg q,a; always@(posedge clk) begin a=~q; end always@(posedge clk) begin q=~q; end endmodule module paral2(
34、q,a,clk); input clk; output q,a; reg q,a; always@(posedge clk) begin q=~q; end always@(posedge clk) begin a=~q; end endmodule 注:两个模块的功能是一样的! (九)不同抽象级别的Verilog HDL模型 Verilog HDL的门级描述(p179):调用门原语(primitive)进行电路描述。 Verilog HDL行为级描述(p180):用各种语句进行电路描述。 对于设计者而言,采用的描述级别越高,设计越容易。但对综合器而言
35、有可能无法将某些抽象级别高的描述转化为电路。因此设计者应了解综合器的性能。 第六部分:用Verilog HDL语言设计数字电路 一、常用组合电路的设计 (一)、基本门电路的设计 1)调用门原语的描述方法 module gate1(f,a,b,c,d); 2)用assign语句描述 input a,b,c,d; module gate1(f,a,b,c,d); output f; input a,b,c,d;
36、 nand(f1,a,b); output f; and(f2,b,c,d); assign f=(!(a&b))|(b&c&d); or(f,f1,f2); endmodule endmodule 3) 用always语句的描述方法 module gate1(f,a,b,c,d); input a,b,c,d; output f; reg f;--------------
37、注意 always@(a or b or c or d) begin f=!(a&b)|(b&c&d); end endmodule (二)、编码译码器 1、3-8译码器 module decoder_38(out,in); output[7:0] out; input[2:0] in; reg[7:0] out; always@(in) begin case(in)--------------------------设计要点:采用case语句。 3'd0:out=8'b11111110; 3'd1:out=8'b11111101; 3
38、'd2:out=8'b11111011; 3'd3:out=8'b11110111; 3'd4:out=8'b11101111; 3'd5:out=8'b11011111; 3'd6:out=8'b10111111; 3'd7:out=8'b01111111; Endcase------------------------此处加不加default语句?? end endmodule (二)、编码译码器 2、8-3优先编码器 要点:用if-else语句。 module try83coder(none_on,outcode,a,b,c,d,e,f,g,h
39、); output none_on; output[2:0] outcode; input a,b,c,d,e,f,g,h; reg[3:0] outtemp; assign {none_on,outcode}=outtemp; always@(a or b or c or d or e or f or g or h) begin if(h) outtemp=4'b0111; else if(g) outtemp=4'b0110; else if(f) outtemp=4'b0101; else if(e) outtemp=4'b0100; else if(d)
40、outtemp=4'b0011; else if(c) outtemp=4'b0010; else if(b) outtemp=4'b0001; else if(a) outtemp=4'b0000; else outtemp=4'b1000; end endmodule 用case语句实现8-3优先编码器 module try83coder(none_on,outcode,a,b,c,d,e,f,g,h); output none_on; output[2:0] outcode; input a,b,c,d,e,f,g,
41、h; reg[3:0] outtemp; assign {none_on,outcode}=outtemp; always@(a or b or c or d or e or f or g or h) begin casez({a,b,c,d,e,f,g,h}) 8’b???????1: outtemp=4'b0111; 8’b??????10 : outtemp=4'b0110; 8’b?????100: outtemp=4'b0101; 8’b????1000: outtemp=4'b0100; 8’b???10000: outtemp=4'b0011;
42、8’b??100000: outtemp=4'b0010; 8’b?1000000: outtemp=4'b0001; 8’b10000000: outtemp=4'b0000; default: outtemp=4’b1000; endcase end endmodule 3、BCD-7段码译码器 二、常用时序电路模块的设计 1、D触发器1:基本D触发器 Module DFF(Q,D,CLK); Output Q; Input D,CLK; Reg Q; Always@(posedge CLK) begin Q=D
43、 end endmodule 2、D触发器2:带置位和清零端 Module DFF(Q,D,CLK,CLR,PRESET); Output Q; Input D,CLK,CLR,PRESET; Reg Q; Always@(posedge CLK or posedge PRESET ) begin If(PRESET) Q=1; else if(CLR) Q=0; else Q=D; end endmodule 3、数据寄存器 (特点:边沿敏感) Module reg8(data_in,data_out, clk,clr); In
44、put[7:0] data_in; Input clk,clr; Output[7:0] data_out; Reg[7:0] data_out; Always@ (posedge clk or posedge clr) begin if(clr) data_out=0; else data_out=data_in; end endmodule 4、移位寄存器 Module shifter(din,clk,clr,dout); Input din,clk,clr; Output[7:0] dout; Reg[7:0] dout; Always@(po
45、sedge clk) Begin If(clr) dout=8’b00000000; else begin dout=dout>>1; dout[7]=din; end end endmodule 5、8位加法/减法计数器 module counter(d,clk,clear,load,up_down,q) input[7:0] d; input clk,clear,load,up_down; output[7:0] q; reg[7:0] cnt; assign q=cnt; always@(posedge clk) begin
46、 if(!clear) cnt=8’h00; else if(load) cnt=d; else if(up_down) cnt=cnt+1; else cnt=cnt-1; end ednmodule 问题:1、该计数器的特点?2、任意进制计数器的设计? 6、模60BCD码计数器 module count_60(qout,cout,data,load,reset,clk); output[7:0] qout; output cout; input[7:0] data; input load,clk,reset; reg[7:0] qout; alw
47、ays@(posedge clk) begin if(reset) qout=0; //同步复位 else if(load) qout=data; //同步置数; else begin if(qout[3:0]==9) //模10控制 begin qout[3:0]=0; if(qout[7:4]==5) qout[7:4]=0; //模60控制;
48、else qout[7:4]=qout[7:4]+1; end else qout[3:0]=qout[3:0]+1; end end assign cout=(qout==8b’01011001)?1:0; //进位控制; endmodule 三、有限状态机 1、状态机的概念 moor状态机:输出只与当前状态有关;mealy状态机:输出与当前状态和输入有关; 2、moor状态机的实现:用case 语句和else-if语句实现。 module moor_fsm(clk,reset,
49、in,state_out); input clk, reset, in; output state_out; reg state_out; reg[3:0] current, next; parameter ST1=4'b0001, ST2=4'b0010, ST3=4'b0100, ST4=4'b1000; always@(posedge reset or posedge clk) begin if(reset) begin state_out=0; current=ST1;end else begin case(current) ST1:begin state_out=0; if(in) next=ST2; else next=ST1;end ST2:begin state_out=1; if(in) next=ST3; else next=ST2;end ST3:begin state_out=1; if(in) next=ST4; else next=ST3;end ST4:begin state_out=0; if(in) next=ST1; else next=ST4;end default: n






