一、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)设计:是在厂家提供的基本单元的基础上的进行的二次设计,又有一下三种方式:
◆门阵列(gate array):在半成品基础上的设计方式。半成品含有加工好的大量的晶体
管和IO焊盘,但没有布线。布线由用户设计,实现特定的功能。
◆标准单元(standard cell):利用厂家的标准单元进行设计的方式。
◆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种结构:
◆宏单元:主要包括与或阵列、触发器和多路选择器
等电路,可独立配置为组合逻辑或时序逻辑;
◆可编程IO单元:可独立配置为输入、输出和双向
IO;
◆可编程内部连线(PIA):其作用是在各逻辑宏单
元之间以及宏单元和IO之间提供互连网络。
(五)FPGA的结构与特点(FLEX10K10内部结构图)
与CPLD相比,FPGA具有更高的集成度、更强的逻辑功能和更大的灵活性。一般由3部分组成:
?可配置逻辑块(CLB,Configurable Logic Block )
?输入输出模块(IOB)
?可编程互连线(PI)
?片内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的发展趋势
?向大规模、高集成度方向发展;
?向低电压、低功耗、低价格的方向发展;
?向高速可预测延时方向发展;
?在PLD内嵌入多种功能模块;
?向模数混合可编程的方向发展。
二、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)输入信号选择
?data[]:数据输入,用于预置数;
?clock:输入时钟;
?clk_en:输入时钟使能;
?cnt_en:计数器使能;
?updown:加(1)减(0)法选择;
?aclr:异步清零;
?aset:异步置数(A V ALUE);
?aload:异步置数(data[]);
?sclr:同步清零;
?sload:同步置数(data[]);
?sset:同步置数(SV ALUE)。
2)输出信号选择
◆q[]:计数值输出;
◆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、系统开发周期短
●设计输入方法灵活多样;
●软件仿真,错误自动定位
●修改方便;
2、系统体积小
3、系统可靠性好
4、系统保密性好
5、价格?可进一步降低价格。
(二)系统的设计思想
1、TOP-DOWN:用于设计性能级:概念-〉产品说明书(性能指标)-〉系统输入输出图(黑匣子);
功能级:系统输入输出图-〉系统框图(功能划分)-〉功能实现-〉仿真-〉网表;
结构级:原理图网表-〉版图布局-〉版图布线-〉后仿真-〉网表
物理级:基本逻辑单元的设计。
重要概念:
●from concept to netlist;
●from concept to layout;
●from concept to product;
2、bottom-up:用于实现基本逻辑单元-〉子功能模块-〉子系统-〉系统
(三)基于MAXPLUS II的系统设计流程
3.1概念-〉功能模块
3.2设计输入
1、原理图输入方法
●最基本的方法;
●充分利用已有基本单元,74XX等;
缺点:不够灵活(虽然编译时可自动消除冗余电路),如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、打开保护位:
●选择是否设置保护位;
●选择保留资源(reserved sources)的比例;I/O和逻辑单元一般留10%,使器件留有
修改的余地。
4、选择全局的项目逻辑综合方式:选择是否自动选全局clock、clear、preset、output enable (缺省);
5、打开FLOOR PLAN EDITOR观察试配结果
●可以为某些型号指定引脚号;
●一般不能全部指定,否则影响试配的成功;
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
(一) 硬件描述语言的概念
?硬件描述语言(Hardware Description Language),是电子系统硬件行为描述、结构描
述、数据流描述的语言。
?硬件描述语言诞生原因:在计算机辅助电子设计的过程中,逻辑图、分立元件作为
整个越来越复杂的电子系统的设计已经不适应,需要一种硬件描述语言来作为EDA 工具的工作语言。
二、V erilog HDL语言介绍
1、V erilog 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]
变量小结:
https://www.wendangku.net/doc/c310762924.html,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: next=ST1;
endcase
end
current=next;
End
endmodule
4、状态机的应用
?实现各种计数器;
?实现各种序列发生器;
?实现序列检测;
?其它时序电路。
例1:用状态机实现模7计数器模7计数器状态图
module counter_fsm(clk,clear,co,q);
input clk,clear;
output co;
output[3:0] q;
reg co;
reg[3:0] current,next,q;
parameter
ST0=0,ST1=1,ST2=2,ST3=3,ST4=4,ST5=5,S T6=6;
always@(posedge clk)
begin
if(!clear) begin q=0;co=0;next=ST1;end
else begin
case(current)
ST0:begin
q=current;co=0;next=ST1;end
ST1:begin q=current;co=0;next=ST2;end
ST2:begin
q=current;co=0;next=ST3;end
ST3:begin
q=current;co=0;next=ST4;end
ST4:begin
q=current;co=0;next=ST5;end
ST5:begin
q=current;co=0;next=ST6;end
ST6:begin
q=current;co=1;next=ST0;end
default: next=ST0;
endcase
end
current=next; end
endmodule
四、层次化设计的实现
设计思想:分析采用自上而下的方法;实现采用自下而上的方法。
层次化设计的实现方法:
?原理图输入设计方法;
?原理图输入与文本输入混合设计方法;
?文本输入设计方法
(一)原理图输入与文本输入混合设计方法
1、设计要点:
?把系统细分为小的功能模块,直到划分出来的功能模块易于实现;
?功能模块若用原理图输入设计方法方便就用原理图输入法;若用文本输入设计方法方便就用文本输入法;
?顶层用原理图输入设计方法比较方便。
2、文本输入设计生成Symbol的方法:
用File\Create Default Symbol命令
层次化设计实现方法1:复制法
脉冲发生器实例
module pulse2(in,clk,out); //
input in,clk;
output out;
reg out1,out;
pulse1 mypulse1(in,clk,out1); //调用pulse1 pulse1 mypulse2(!out1,clk,out); endmodule
module pulse1(in,clk,out); //被调用模块input in,clk;
output out;
…
endmodule
五、利用纯Verilog HDL语言单层数字电路或系统的设计
实例1:数字跑表的设计
always@(posedge CLK or posedge CLR) //该块用于对百分秒进行计数,满100,cn1产生一个进位;
always@(posedge cn1 or posedge CLR) //该块对秒进行计数,计满60,cn2产生一个进位;always@(posedge cn2 or posedge CLR) //该块对分钟进行计数,计满60,系统自动清零;特点:1)每个块相当于一个计数器,每个计数器之间巧妙用进位信号连接起来。2)计数值分别在每个模块直接输出。
实例2:频率计的设计:用单层语言描述法
实例3:交通灯控制器
实例4:多功能数字钟
习题:
1.5 IP在EDA技术的应用和发展中的意义是什么?
答:IP核具有规范的接口协议,良好的可移植与可测试性,为系统开发提供了可靠的保证1.11FPGA和ASIC的概念,他们的区别?
答案:FPGA是可编程ASIC。
ASIC:专用集成电路,它是面向专门用途的电路,专门为一个用户设计和制造的。根据一个用户的特定要求,能以低研
制成本,短、交货周期供货的全定制,半定制集成电路。与门阵列等其它ASIC(Application Specific IC)相比,它们
又具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以
及可实时在线检验等优点。