EDA复习比较完整的.docx
- 文档编号:28835565
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:23
- 大小:91.43KB
EDA复习比较完整的.docx
《EDA复习比较完整的.docx》由会员分享,可在线阅读,更多相关《EDA复习比较完整的.docx(23页珍藏版)》请在冰豆网上搜索。
EDA复习比较完整的
“比较完整了”
EDA复习
简答
1.EDA的设计流程
方案设计,系统规划,代码输入,编译器,功能仿真,综合器,时序仿真,适配器,编程文件,硬件测试
2.竞争与冒险产生、判断及如何处理
产生:
由于延迟时间的存在,当一个输入信号经过多条路径传送后又重新会合到某个门上,由于不同路径上门的级数不同,或者门电路延迟时间的差异,导致到达会合点的时间有先有后,从而产生瞬间的错误输出。
判断:
1)代数法:
逻辑函数表达式中,若某个变量同时以原变量和反变量两种形式出现,就具备了竞争条件。
2)卡诺图法:
只要在卡诺图中存在两个相切但不相交的圈(“0”冒险是1构成的圈,“1”冒险是0构成的圈),就会产生冒险。
处理方法:
1)修改设计法:
a、代数法,在产生冒险现象的逻辑表达式上,加上冗余项或乘上冗余因子;b、卡诺图法,将卡诺图中相切的圈用一个多余的圈连接起来。
2)选通法:
在电路中加入选通信号,在输出信号稳定后,选通允许输出,从而产生正确输出;3)滤出法:
由于冒险脉冲是一个非常窄的脉冲,一二可以在输出端接一个几百微法的电容,将其滤出掉。
3、TTL与CMOS兼容问题
由于电路相互之间的电源电压和输入、输出电平及负载能力等参数不同,因此他们之间的连接必须通过电平转换或电流转换电路,使前级器件的输出的逻辑电平满足后级器件对输入电平的要求,并不得对器件造成损坏。
逻辑器件的接口电路主要应注意电平匹配和输出能力两个问题,并与器件的电源电压结合起来考虑。
1)CMOS到TTL的连接需要进行电流匹配。
2)TTL到CMOS的连接需要进行电压匹配。
4、EDA的烧写方式
1)按计算机接口:
串口下载,并口下载,USB口下载等方式
2)按器件:
CPLD编程,FPGA下载,存储器编程EPC1、EPC2等。
5、同步电路与异步电路的判断
1)同步电路是说电路里的时钟相互之间是同步的。
2)异步电路主要是组合逻辑电路,没有统一的时钟。
所以只要判断时钟是否同步,就可分辨同步或者异步。
6、EDA的一些专业名称:
如FPGA、ASIC等
EDA:
ElectronicDesignAutomation电子设计自动化
FPGA:
Field-ProgrammableGateArray现场可编程门阵列
ASIC:
ApplicationSpecificIntegratedCircuit专用集成电路
CPLD:
ComplexProgrammableLogicDevice复杂可编程逻辑器件
7.Verilog与VHDL的区别和使用的范围
区别:
1)Verilog拥有更广泛的设计群体,成熟的资源也比VHDL丰富;2)与VHDL相比,VerilogHDL容易掌握,与C语言类似。
3)2005年以前,Verilog在系统级抽象方面比VHDL略差一些,而在门级开关电路描述方面比VHDL强的多。
2005年后,系统抽象能力得到彻底改变。
使用范围:
进行各种级别的逻辑设计,可用它进行数字逻辑系统的仿真验证、时序分析、逻辑综合。
8.组合电路与时序电路的表达
组合电路:
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在VerilogHDL中,描述组合逻辑时常使用assign结构。
注意equal=(a==b)?
1:
0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码:
//---------------compare.v-----------------
modulecompare(equal,a,b);
inputa,b;
outputequal;
assignequal=(a==b)?
1:
0;//a等于b时,equal输出为1;a不等于b时,
//equal输出为0。
endmodule
时序电路:
在VerilogHDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的VerilogHDL模型,我们通常使用always块和@(posedgeclk)或@(negedgeclk)的结构来表述时序逻辑。
下面是一个1/2分频器的可综合模型。
//half_clk.v:
modulehalf_clk(reset,clk_in,clk_out);
inputclk_in,reset;
outputclk_out;
regclk_out;
always@(posedgeclk_in)
begin
if(!
reset)clk_out=0;
elseclk_out=~clk_out;
end
endmodule
9.同步复位与异步复位的表达
同步复位:
同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。
否则,无法完成对系统的复位工作。
用Verilog描述如下:
always@(posedgeclk)begin
if(!
Rst_n)
...
end
异步复位:
它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
用Verilog描述如下:
always@(posedgeclkornegedgeRst_n)begin
if(!
Rst_n)
...
end
10.时间尺度timescale的用法
用timescale编译器指令将时间单位与实际时间相关联。
该指令用于定义时延的单位和时延精度。
Eg:
:
`timescale1ns/1ps;
在这个命令之后,模块中所有的时间值都表示是1ns的整数倍。
这是因为在·timescale命令中,定义了时间单位为1ns模块中的延迟时间可表示为带3位小数的实型数,因为·timescale命令定义时间精度为1ps。
11.verilog几种数据类型
数据类型是用来表示数字电路硬件中的数据储存和传送元素的VerilogHDL中总共有19种数据类型
常用类型有4种:
Wire线网型变量
Reg寄存器型变量,据有记忆性。
Integer32位有符号整型变量
Parameter在VerilogHDL中为了提高程序的可读性和维护性,用Parameter来定义一个标识符代表一个常量,称为符号常量。
12.initial与always的区别
1)initial语句指定的内容只执行一次,initial语句主要用于仿真测试,不能进行逻辑综合。
而always语句则是不断地重复执行着的,直到仿真过程结束,在仿真和逻辑综合中均可使用。
2)无条件的always语句是不允许的。
13.verilog语言的一些语法
(看课件吧)
14、阻塞与非阻塞(课件)
1)非阻塞(non_blocking)赋值方式“<=”:
(1)在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;
(2)块结束后才完成赋值操作,块结束前被赋值的变量保持上一次所赋的值;
(3)在编写可综合的时序逻辑模块时,这是最常用的赋值方法。
意即,在always块中经常使用。
2)阻塞(blocking)赋值方式“=”:
(1)赋值语句执行完后,块才结束;
(2)b的值在赋值语句执行完后立刻就改变;
(3)在时序逻辑中使用时(在沿触发的always块中使用时),综合后可能会产生意想不到的结果。
14、阻塞与非阻塞(课本)
1)阻塞赋值在该语句结束时就立即完成赋值操作,如果在一个块语句中有多条阻塞赋值语句,那么写在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了一样,因而被称为阻塞赋值。
连续的阻塞赋值操作时顺序完成的。
2)非阻塞赋值在整个过程块结束后才完成赋值操作。
这是一种比较接近真实的电路赋值和输出,以为它从综合的角度考虑到了延时和并行性。
如果在一个块语句中有多条非阻塞赋值语句,在过程块被启动后,当执行某条非阻塞赋值语句是,仅仅计算“<=”右侧的表达式的值,但并不马上执行赋值,然后继续执行后面的操作,这个过程好像没有阻断侧程序的运行,因而被称为非阻塞赋值,连续的非阻塞赋值操作是同时完成的,即在同一个顺序块中,非阻塞赋值表达式的书写顺序,不影响赋值结果。
编程
1.分频器编程
1)偶数分频,更改n的值(问题:
输出存在延时,望求解)
moduleclk_div(clk,reset,clk_out);
inputclk;
inputreset;
outputclk_out;
regclk_out;
reg[3:
0]count;
parametern=6;
always@(posedgeclk)
begin
if(!
reset)
begin
count=0;
end
else
begin
if(count==(n/2)-1)
begin
count=0;
clk_out=~clk_out;
end
else
begin
count=count+1'b1;
end
end
end
endmodule
2)奇数分频,更改n的值
moduleclk_div(clkout,inclk,reset);
outputclkout;
inputinclk;
inputreset;
parametern=5;
wireclkout;
regclk_p,clk_n;
reg[3:
0]count_p,count_n;
always@(posedgeinclk)
begin
if(!
reset)
begin
clk_p=0;
count_p=0;
end
else
begin
if(count_p==n-1)
count_p=0;
else
count_p=count_p+1'b1;
if(count_p<(n-1)/2)
clk_p=1;
else
clk_p=0;
end
end
always@(negedgeinclk)
begin
if(!
reset)
begin
clk_n=0;
count_n=0;
end
else
begin
if(count_n==n-1)
count_n=0;
else
count_n=count_n+1'b1;
if(count_n<(n-1)/2)
clk_n=1;
else
clk_n=0;
end
end
assignclkout=clk_n||clk_p;
endmodule
2.状态机编程(同时区分moore与mealy型)
moore状态机的输出只和当前状态有关,不与当前输入有关,也就是说当前状态的次态唯一,实现了输入与输出的分离,在一个时钟周期内,无论输入变化几次,输出之变化一次;
mealy状态机的输出不仅和当前状态有关,还和当前的输入状态有关,当前状态会根据不同输入而有不同输出,次态不唯一。
(课件中的例子)
modulefsm(Clock,Reset,A,K2,K1);
inputClock,Reset,A;
outputK2,K1;
regK2,K1;
reg[1:
0]state,nextstate;
parameter
Idle=2'b00,
Start=2'b01,
Stop=2'b10,
Clear=2'b11;
//--------每一个时钟沿产生一次可能的状态变化-----------
always@(posedgeClock)
begin
if(!
Reset)
state<=Idle;
else
state<=nextstate;
end
//------产生下一状态的组合逻辑-------------------------
always@(stateorA)
case(state)
Idle:
if(A)
nextstate=Start;
elsenextstate=Idle;
Start:
if(!
A)nextstate=Stop;
elsenextstate=Start;
Stop:
if(A)nextstate=Clear;
elsenextstate=Stop;
Clear:
if(!
A)nextstate=Idle;
elsenextstate=Clear;
default:
nextstate=2'bxx;
endcase
//----产生输出K1的组合逻辑--------------
always@(stateorResetorA)
if(!
Reset)K1=0;
else
if(state==Clear&&!
A)//从Clear转向Idle
K1=1;
elseK1=0;
//---产生输出K2的组合逻辑---------------
always@(stateorResetorA)
if(!
Reset)K2=0;
else
if(state==Stop&&A)//从Stop转向Clear
K2=1;
elseK2=0;
endmodule
3.关于数字锁存器与触发器的编程(XX的)
1)用VerilogHDL描述一个简单的锁存器。
该锁存器在控制信号i_en为高电平时开启,为低电平时锁存当前值。
modulelatch
(
inputi_en,
inputi_din,
outputrego_dout
);
//敏感列表中没有边沿触发的信号
always@(i_dinori_en)
if(i_en)
o_dout<=i_din;
//没有与'if'语句对应的'else'语句,生成锁存器,否则生成组合逻辑。
Endmodule
2)//基本D触发器
moduleD_EF(Q,D,CLK)
inputD,CLK;
outputQ;
regQ;//在always语句中被赋值的信号要声明为reg类型寄存器定义
always@(posedgeCLK)//上升沿,下降沿用negedge表示,^_^需要记忆
beginQ<=D;end
endmodule
jk触发器
module J_K1(clk,j,k,Q);
input clk;
input j,k;
output Q;
reg Q;
always@(posedge clk)
Q<=j&&(~Q)||(~k)&&Q;
endmodule
实验程序
偶数分频:
moduleclk_oushu(reset,clk_in,clk_out);
inputclk_in,reset;
outputclk_out;
regclk_out;
reg[3:
0]count;
parametern=6;设置n为偶数为n分频
always@(posedgeclk_in)
begin
if(!
reset)
count<=1'b0;
else
if(count==n/2-1)
begin
clk_out<=~clk_out;
count<=1'b0;
end
else
count<=count+1'b1;
end
endmodule
奇数分频:
(未设置占空比)
moduleclk_js(reset,clk_in,clk_out);
inputreset,clk_in;
outputclk_out;
regclk_out;
reg[7:
0]count;
parametern=15;设置n为奇数为n分频
always@(posedgeclk_in)
begin
if(!
reset)
begin
clk_out<=1'b0;
count<=1'b0;
end
else
begin
if(count==n-1)
begin
count<=1'b0;
clk_out<=1'b0;
end
else
begin
count<=count+1'b1;
if(count==(n-1)/2)
clk_out<=1'b1;
end
end
end
endmodule
奇数分频(占空比为50%):
moduleclk_jishu(reset,clk_in,clk_out);
inputreset,clk_in;
outputclk_out;
wireclk_out;
regclk_out1,clk_out2;
reg[7:
0]count1,count2;
parametern=7;设置n为奇数为n分频
always@(posedgeclk_in)
begin
if(!
reset)
begin
count1<=1'b0;
clk_out1<=1'b0;
end
else
begin
if(count1==n-1)
begin
count1<=1'b0;
clk_out1<=1'b0;
end
else
begin
count1<=count1+1'b1;
if(count1==0)
clk_out1<=1'b1;
if(count1==(n-1)/2)
clk_out1<=1'b0;
end
end
end
always@(negedgeclk_in)
begin
if(!
reset)
begin
count2<=1'b0;
clk_out2<=1'b0;
end
else
begin
if(count2==n-1)
begin
count2<=1'b0;
clk_out2<=1'b0;
end
else
begin
count2<=count2+1'b1;
if(count2==0)
clk_out2<=1'b1;
if(count2==(n-1)/2)
clk_out2<=1'b0;
end
end
end
assignclk_out=clk_out1|clk_out2;
endmodule
计数器:
modulecount_n(clr,en,clk_in,count,c);
inputclr,en,clk_in;
outputc;
output[7:
0]count;
regc;
reg[7:
0]count;
parametern=60;设置n为模60的计数器
always@(posedgeclk_in)
begin
if(clr)
begin
count<=1'b0;
c<=0;
end
else
begin
if(en)
begin
count<=count+1'b1;
if(count>=n-1)
begin
count<=1'b0;
c<=1'b1;
end
else
c<=1'b0;
end
end
end
endmodule
状态机(moore型即输出只与现态有关,而状态的改变(次态)跟现态和输入条件有关):
串行数据1101检测
modulemoore_fsm(data_in,reset,data_out,clk_in);
inputdata_in,reset,clk_in;
outputdata_out;data_in为输入条件
regdata_out;data_out为输出
reg[4:
0]prse_state,next_state;prse_state为现态,
parameternext_state为下一个状态
s0=5'b00001,s1=5'b00010,s2=5'b00100,s3=5'b01000,s4=5'b10000;
always@(posedgeclk_in)用于复位
begin
if(!
reset)
prse_state=s0;
else
prse_state=next_state;
end
always@(prse_stateordata_in)次态的产生跟现态和输入有关
begin
case(prse_state)
s0:
if(data_in)next_state=s1;
elsenext_state=s0;
s1:
if(data_in)next_state=s2;
elsenext_state=s0;
s2:
if(!
data_in)next_state=s3;
elsenext_state=s2;
s3:
if(data_in)next_state=s4;
elsenext_state=s0;
s4:
if(data_in)next_state=s2;
elsenext_state=s0;
default:
next_state=5'bxxxxx;
endcase
end
always@(prse_state)产生输出:
输出只与现态有关
begin
case(prse_state)
s0:
data_out=1'b0;
s1:
data_out=1'b0;
s2:
data_out=1'b0;
s3:
data_out=1'b0;
s4:
data_out=1'b1;
default:
data_out=1'b0;
endcase
end
endmodule
状态机(mealy型即输出与现态和输入都有关,而状态的改变(次态)跟现态和输入条件也有关):
modulemealy_fsm(reset,A,clk_in,k2,k1);
inputreset,A,clk_in;
outputk2,k1;
regk2,k1;k2,k1为输出
reg[1:
0]prse_state,next_state;prse_state为现态,
parameternext_state为下一个状态
Idle=2'b00,start=2'b01,stop=2'b10,clear=2'b11;
always@(posedgeclk_in)用于复位
begin
if(!
reset)
prse_state=Idle;
else
prse_state=next_state;
end
always@(prse_state
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 复习 比较 完整
![提示](https://static.bdocx.com/images/bang_tan.gif)