资源描述
一、 EDA的概念
1、定义:电子(系统)设计的自动化,或电子线路或系统的计算机辅助设计。是基于计算机平台的一整套先进的设计电子系统的软件工具。
2、研究对象:电子电路与系统设计的全过程:低频、高频、微波电路、线性与非线性电路、模拟和数字电路、分离电路和集成电路。
3、设计的层次
三个层次:
Ø 系统级
Ø 电路级
Ø 物理实现级。
4.EDA技术发展的三个阶段
Ø CAD阶段(70s):EDA的初级阶段。利用功能有限的计算机进行简单的电路性能分析和预测,PCB的计算机辅助布局布线,如smart work。
Ø CAE阶段(80s):CAD工具逐步完善和发展,将许多单点工具集成在一起使用, EDA阶段(90s):超大规模集成电路时代,集成电路工艺水平达到深亚微米,一个芯片可集成上千万个晶体管,速度达giga bit/s,对电子设计的工具提出了更高的要求,同时也促进了设计工具的发展。出现了众多的ICCAD工具,如CADENCE,MENTOR GRAPHICS,SYNOPSIS等著名公司的EDA软件;中国的熊猫系统等。
6、现代EDA 技术的特点
1)采用硬件描述语言(HDL);具有如下突出优点:语言的公开性和可利用性、设计与工艺无关、宽范围的描述能力、便于大规模系统设计和设计的可复用、交流、保存、修改;
2)高层综合和优化:开发工具支持系统级的综合和仿真,可更好地支持自上而下的设计方法;
3)并行工程:系统化的、集成化的、并行的产品及相关过程的开发模式,支持多人同时并行进行设计工作。
4)开放性和标准化:EDA工具的相互兼容,有利于资源共享。
二、数字系统的设计思想
系统级设计à功能级描述à功能仿真à门级描述à时序仿真;自上而下逐级细化的设计方法。设计需要经过 “设计-验证-修改-再验证”的过程。
三、IP核复用技术与SOC
1、IP复用技术
1)何谓IP复用技术:Intellectual Property(IP)原指知识产权、著作权等,在IC设计领域指具有某种功能的虚拟电路模块。设计系统时使用或反复使用某些IP称IP复用。
2)IP分硬核、固核和软核三种。硬核指固定的版图模块,用户不能修改;软核指用HDL描述的功能模块,用户可以进行修改;固核介于硬核和软核之间,用户可进行一些修改。
2、SOC
1)定义:System On a Chip系统芯片,即把整个系统集成在一片芯片中。
2)硬件和软件技术发展到今天,用户已经可以通过编程设计自己的系统,该系统可以包括微处理器(MCU)、RAM/ROM和逻辑电路等。
四、数字系统的实现方式
1、全定制(full custom)方式:基于版图的设计方法,分通用和专用集成电路设计;
2、半定制(semi custom)设计:是在厂家提供的基本单元的基础上的进行的二次设计,又有一下三种方式:
u 门阵列(gate array):在半成品基础上的设计方式。半成品含有加工好的大量的晶体管和IO焊盘,但没有布线。布线由用户设计,实现特定的功能。
u 标准单元(standard cell):利用厂家的标准单元进行设计的方式。
u PLD方式:器件已经制造好,用户自己编程便可实现各种功能。
5、硬件描述语言的不足
Ø 电路采用高级的简明结构HDL描述,它意味着放弃了对电路门级实现定义的控制;
Ø 由综合工具生成的逻辑实现效果不好;
Ø 工具的不同导致综合质量的不同。
第二部分 可编程逻辑器件(PLD)
1、ASIC:Application Specific Integrated Circuits,即专用集成电路,是面向特定用户、具有专门用途的芯片,并依此区别于通用芯片.
2、PLD,Programmable Logic Devices,是20世纪70s发展起来的一种新型器件,它的应用和发展不仅简化了电路设计,降低了成本,提高了系统的可靠性,且给数字系统的设计带来了革命性变化。
(二)PLD的分类 (p18)
(四)CPLD的结构与特点(EMP7032内部结构图)
CPLD是在PAL、GAL的基础上发展起来的阵列型PLD,具有高密度高速度的优点。从结构上看,CPLD一般包括3种结构:
u 宏单元:主要包括与或阵列、触发器和多路选择器
等电路,可独立配置为组合逻辑或时序逻辑;
u 可编程IO单元:可独立配置为输入、输出和双向
IO;
u 可编程内部连线(PIA):其作用是在各逻辑宏单
元之间以及宏单元和IO之间提供互连网络。
(五)FPGA的结构与特点(FLEX10K10内部结构图)
与CPLD相比,FPGA具有更高的集成度、更强的逻辑功能和更大的灵活性。一般由3部分组成:
n 可配置逻辑块(CLB,Configurable Logic Block )
n 输入输出模块(IOB)
n 可编程互连线(PI)
n 片内RAM
(五)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 Programmable,指的是对器件、电路板或整个电子系统的逻辑功能可随时进行修改或重构的能力。
2、边界扫描测试(BST)技术:由于器件越来越复杂,表面封装技术和电路板制造技术的进步,使得电路板的变小变密,传统的测试方法很难实现。
(七)PLD产品概述:PLD的发展趋势
p 向大规模、高集成度方向发展;
p 向低电压、低功耗、低价格的方向发展;
p 向高速可预测延时方向发展;
p 在PLD内嵌入多种功能模块;
p 向模数混合可编程的方向发展。
二、ALTERA可编程逻辑器件
(二)MAX7000系列器件
MAX7000系列内部结构:组成模块:
(1)LAB: Logic Array Block,逻辑阵列块,内含16个宏单元,是器件的主要组成部分;
(2)MC:Macrocell,宏单元,由逻辑阵列、乘积项选择矩阵和可编程触发器组成,用于实现各种逻辑;(宏单元结构图)
(3)EPT:Expander Product Term,扩展乘积项,用于辅助逻辑阵列实现复杂的逻辑;
(4)PIA:Programmable Interconnect Array,可编程连线阵列,把LAB相互连接构成所需的逻辑。这个全局总线是可编程通道,它把器件中任何信号源连到其目的地;MAX系列的PIA有固定的布线延时,而FLEX系列的布线延时与路径有关;
(5)I/O Control Block: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引脚为内核和输入缓冲器提供工作电压,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 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[] :输入地址 q[]:存储器输出
Inclock :输入锁存时钟
Outclock :输出锁存时钟
memenab:使能
(六) 小结
(一)基于PLD的数字系统设计的优点
1、系统开发周期短
l 设计输入方法灵活多样;
l 软件仿真,错误自动定位
l 修改方便;
2、系统体积小
3、系统可靠性好
4、系统保密性好
5、价格?可进一步降低价格。
(二)系统的设计思想
1、TOP-DOWN:用于设计性能级:概念-〉产品说明书(性能指标)-〉系统输入输出图(黑匣子);
功能级:系统输入输出图-〉系统框图(功能划分)-〉功能实现-〉仿真-〉网表;
结构级:原理图网表-〉版图布局-〉版图布线-〉后仿真-〉网表
物理级:基本逻辑单元的设计。
重要概念:
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:多路选择器
输入信号: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
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中,状态机是非常好用的工具,可方便地实现各种时间序列,如计数器、序列发生器、地址发生器、波形发生器等。
3.3 设计编译
编译的功能为:逻辑综合、逻辑试配
1、选择一个器件系列,不知具体选用哪个型号时选AUTO;
2、打开Design Doctor,进行错误检测和错误定位;
3、打开保护位:
l 选择是否设置保护位;
l 选择保留资源(reserved sources)的比例;I/O和逻辑单元一般留10%,使器件留有修改的余地。
4、选择全局的项目逻辑综合方式:选择是否自动选全局clock、clear、preset、output enable(缺省);
5、打开FLOOR PLAN 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、通电后器件微微发热,是正常现象;
3、学会一些调试手段和方法;
(三)系统设计的要点
1、概念-〉功能模块的能力训练;
2、熟练运用三种设计输入方法,特别是综合运用原理图输入和文本输入方法;文本输入方法中必须掌握组合逻辑电路和状态机的设计方法;
3、熟练掌握以上数字系统设计的各个环节。
第五部分 Verilog HDL
(一) 硬件描述语言的概念
n 硬件描述语言(Hardware Description Language),是电子系统硬件行为描述、结构描述、数据流描述的语言。
n 硬件描述语言诞生原因:在计算机辅助电子设计的过程中,逻辑图、分立元件作为整个越来越复杂的电子系统的设计已经不适应,需要一种硬件描述语言来作为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}=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(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[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]&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、位拼接运算符:{ }
作用:把两个或多个信号的某些位拼接起来。
例如:全加器的描述
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上来,因此称为连续赋值方式;
2、过程赋值语句(procedural assignments)对寄存器型(reg)变量进行赋值。分为非阻塞赋值语句和阻塞赋值语句。
(1)非阻塞赋值(non-blocking):b<=a;
特点:非阻塞赋值必需在块结束时才完成赋值操作,即b的值不是立刻就变的。
(2)阻塞赋值(blocking):b=a;
特点:赋值语句结束时就完成赋值操作,即b的值在赋值语句结束后立刻就变。
(五)条件语句
1、if –else语句(p144)
语句若为多句,用begin-end括起来。
2、case语句(p145)
要点:敏感表达式一般为一个变量或表达式;一般要列出敏感表达式的所有可能取值,不能穷举时,剩余其它情况执行 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
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.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 voter7(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@(<敏感信号表达式>)
敏感信号表达式:又称敏感表,当该表达式的值改变时,就会执行一遍块内的语句。例如:
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
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(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):用各种语句进行电路描述。
对于设计者而言,采用的描述级别越高,设计越容易。但对综合器而言,有可能无法将某些抽象级别高的描述转化为电路。因此设计者应了解综合器的性能。
第六部分:用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;
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;--------------------注意
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'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);
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) 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,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;
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;
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);
Input[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@(posedge 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
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;
always@(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控制;
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,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
展开阅读全文