基于EDA的组合电路设计第5章 55.docx
- 文档编号:15581141
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:12
- 大小:197.23KB
基于EDA的组合电路设计第5章 55.docx
《基于EDA的组合电路设计第5章 55.docx》由会员分享,可在线阅读,更多相关《基于EDA的组合电路设计第5章 55.docx(12页珍藏版)》请在冰点文库上搜索。
基于EDA的组合电路设计第5章55
5.5EDA开发综合实例1:
Modelsim的使用
在此讨论实现1位全加器的多种方法,并使用Modelsim进行功能仿真。
本例与前述4.2讨论的2选1MUX例子相比,增添了更多内容:
●设计难度加大一些,更具代表性;
●列举了多种实现方法,增加了混合风格的内容;
●Modelsim的使用和操作方式与4.2.5中的不同,虽然都可以达到仿真的目的,但此例的操作更详细和规范。
5.5.1门级(结构)风格的描述
在此使用门级风格描述一个全加器电路,该实例基于图5-7所示的结构图。
以下使用内置门原语对一位全加器的结构进行门级风格描述:
moduleFA_struct(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
wireS1,T1,T2,T3;
xorx1(S1,A,B);
//调用一个内置的异或门,器件名称xor,代码实例化名x1;
//S1,A,B表明该器件管脚的实际连接线的名称,A、B是输入,S1是输出。
xorx2(Sum,S1,Cin);
andA1(T3,A,B);
andA2(T2,B,Cin);
andA3(T1,A,Cin);
orO1(Cout,T1,T2,T3);
endmodule
该一位全加器由两个异或门、三个与门、一个或门构成。
S1、T1、T2、T3则是门与门之间的连线;xor、and、or是VerilogHDL内置的门器件。
5.5.2数据流风格的描述
以下使用数据流风格描述一位全加器:
moduleFA_flow1(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
wireS1,T1,T2,T3;
assignS1=A^B;
assignSum=S1^Cin;
/*以上2句可合并为1句:
assignSum=A^B^Cin;*/
assignT1=A&Cin;
assignT2=B&Cin;
assignT3=A&B;
assignCout=T1|T2|T3;
/*以上4句可合并为1句:
assignCout=(A&Cin)|(B&Cin)|(A&B);*/
endmodule
各assign语句是并行执行的,即各语句的执行与语句的编写顺序无关。
如上代码中,当A有变化时,S1、T3、T1将同时变化,S1的变化又会造成Sum的变化。
以上代码中包含6个assign连续赋值,是为了更直观地描述其电路结构,但对于抽象层次更高的数据流风格,可以不按结构的方式进行描述。
以下为第2种描述方法,采用更加高级(更趋于行为逻辑)的描述方式:
moduleFA_flow2(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
wireSum,Cout;
assign{Cout,Sum}=A+B+Cin;
endmodule
5.5.3行为风格的描述
以下使用行为风格描述方式给一位全加器建模:
moduleFA_behav1(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
regSum,Cout;
always@(AorBorCin)//敏感表,A、B、Cin发生变化时触发运行
begin//begin和end之间的语句顺序执行
Sum=(A^B)^Cin;
Cout=(A&Cin)|(B&Cin)|(A&B);
end
endmodule
相对于数据流风格的第2种方法,行为风格的程序如下:
moduleFA_behav2(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
regSum,Cout;
always
@(AorBorCin)begin
{Cout,Sum}=A+B+Cin;//使用拼接运算符
end
endmodule
{Cout,Sum}表示对位数的扩展,两个1bit相加,和有两位,低位放在Sum变量中,进位放在Cout中。
此段代码更接近我们的语言风格,更容易理解,并不需要画出结构图就可以写出实现的代码。
5.5.4混合风格的描述
在模块中,结构的和行为的结构可以自由混合,模块描述中可以包含门的实例引用、模块实例化语句、连续赋值语句、always语句和initial语句的混合。
来自门或连续赋值语句的值能够用于触发always语句和initial语句;来自always语句和initial语句的值能够驱动门或开关。
以下为混合设计方式的一位全加器的描述。
moduleFA_Mix(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
regCout;
regT1,T2,T3;//在always块中被赋值的变量应定义为reg型
wireS1;
xorX1(S1,A,B);//门实例语句。
always
@(AorBorCin)
begin
T1=A&Cin;
T2=B&Cin;
T3=A&B;
Cout=(T1|T2)|T3;
end
assignSum=S1^Cin;//连续赋值语句。
endmodule
只要A或B上有事件发生,门实例语句即被执行。
只要A、B或Cin上有事件发生,就执行always语句,并且只要S1或Cin上有事件发生,就执行连续赋值语句。
5.5.5编写测试平台
moduletestFA;
regpa,pb,pCin;
wireSum,Cout;
FA_behav2fadd(pa,pb,pCin,Sum,Cout);
//调用FA_behav2模块,按端口顺序对应方式连接
initial
begin
pa=0;pb=0;pCin=0;
#5pCin=1;
#5pb=1;
#5pCin=0;
#5pa=1;
#5pCin=1;
#5pb=0;
#5pCin=0;
end
initial
$monitor("time=%t,a=%b,b=%b,Cin=%b,Sum=%b,Cout=%b",$time,pa,pb,pCin,Sum,Cout);
//调用系统任务$monitor,pa、pb、pCin、py当中任一个发生变化时就输出显示
endmodule
代码中所调用模块为“FA_behav2”,是根据实际代码中所定义的全加器模块名称进行调用的;中间从“begin”到“end”部分的代码,实现每过5个单位时间改变一下输入,实现“pa”、“pb”、“pCin”的值按照“000-001-011-010-110-111-101-100”的顺序发生变化。
5.5.6在Modelsim中进行仿真
在此使用前述的代码(1位全加器及测试平台),在Modelsim中进行仿真,验证是否能得到正确的运行结果。
1.新建工程
运行Modelsim软件,选择“File”“New”菜单中的“Project”,在弹出的对话框中输入项目名称和项目保存路径,如图5-8所示。
2.创建程序文件(1位全加器)
在接下来弹出的对话框“AdditemstotheProject”中选择“CreateNewFile”,输入文件名,语言类型选择“Verilog”,如图5-9所示。
在此可继续选择添加其它文件,在本例中选择关闭“AdditemstotheProject”对话框。
可在“Project”窗口看到刚创建的“Fadd1.v”文件,如图5-10所示。
双击打开“FAdd1.v”文件,输入以下代码并保存。
以下代码与前述行为风格描述代码一致,也可使用其它模块,如“FA_behav1”等。
moduleFA_behav2(A,B,Cin,Sum,Cout);
inputA,B,Cin;
outputSum,Cout;
regSum,Cout;
always@(AorBorCin)
begin
{Cout,Sum}=A+B+Cin;
end
endmodule
界面效果如图5-10所示。
3.创建测试平台文件
在4.2.5的例子中,把功能实现的模块和测试用的模块放在同一个文件中,在实际开发中应分为两个不同的文件。
功能实现模块是真正做到电路板的内容,而测试平台只是仿真过程用于检验设计的程序。
点击“Project”窗口,此时菜单中会出现“Project”菜单,选择“Project”“AddtoProject”菜单中的“NewFile”,在弹出的对话框中输入文件名“testFA.v”,语言类型选择“Verilog”。
双击打开“testFA.v”文件,输入5.5.5中的测试平台代码,该段代码调用“FA_behav2”模块,如果使用了其它模块(如数据流风格),则相应的作修改即可。
4.编译
选择“Compile”菜单的“CompileAll”命令,或工具栏的
图标,系统提示编译结果,如正常,则在Transcript窗口中出现如图5-11所示的结果。
如果只需要对部分文件进行编译(如“FAdd1.v”文件被修改过,而其它文件无变化),则可选择需要编译的文件,选择“Compile”菜单的“CompileSelected”命令。
5.创建仿真配置(非必须进行步骤)
一个设计可能包含多个测试平台和仿真过程,可以每次仿真时选择仿真对象,也可以事先把仿真内容配置并保存下来。
选择“Project”“AddtoProject”菜单中的“SimulationConfiguration”,弹出如图5-12所示的对话框,选择“work”库下的“testFA”模块;可以更改仿真配置名称,在此采用默认名称“Simulation1”。
在“Project”窗口中可看到新建的“Simulation1”,如图5-13所示。
“testFA.v”和“FAdd1.v”文件的状态显示绿色的勾,表示已编译。
6.选择仿真对象
可以用以下两种方式选择仿真对象:
●如果在第(5)步创建了仿真配置,可以直接双击“Project”窗口中的仿真配置“Simulation1”,因为该仿真配置已经设置好仿真的启动文件为“testFA.v”,故Modelsim首先执行“testFA.v”模块中的代码,再由“testFA.v”调用“FAdd1.v”文件中的“FA_behav2”模块。
●如果没有创建仿真配置,可选择“Simulate”菜单的“StartSimulation”,或工具栏的
图标,在弹出的对话框中选择“Work”下面的“testFA”模块,点击“OK”,如图5-14所示。
Modelsim界面发生变化,出现“sim”窗口,在“Objects”窗口也显示该模块中的变量,如图5-15所示:
7.配置波形显示内容
点击“Objects”窗口(只有点击该窗口后才会出现后面的菜单内容),选择“Add”“ToWave”菜单中的“SignalsinRegion”命令,可以显示所有的信号;如果要选择性的挑选显示的内容,可选择“Objects”窗口中一个或多个信号后,选择“Add”“ToWave”菜单中的“SelectedSignals”命令(或直接拖拽至“Wave”窗口的“Message”栏)。
“Wave”窗口如图5-16所示。
8.运行仿真并查看结果
选择“Simulate”“Run”菜单中的“Run-All”命令,或工具栏的
图标,Transcript窗口将显示运行结果:
#time=0,a=0,b=0,Cin=0,Sum=0,Cout=0
#time=5,a=0,b=0,Cin=1,Sum=1,Cout=0
#time=10,a=0,b=1,Cin=1,Sum=0,Cout=1
#time=15,a=0,b=1,Cin=0,Sum=1,Cout=0
#time=20,a=1,b=1,Cin=0,Sum=0,Cout=1
#time=25,a=1,b=1,Cin=1,Sum=1,Cout=1
#time=30,a=1,b=0,Cin=1,Sum=0,Cout=1
#time=35,a=1,b=0,Cin=0,Sum=1,Cout=0
Wave窗口将显示波形图,点击Zoom工具栏图标
可调整波形查看效果,如图5-17所示。
说明:
●前面给出了多种1位全加器的实现代码,读者只需把代码中“FA_behav2”模块替换为其它模块代码(如“FA_flow”),并把“testFA”模块中的文本“FA_behav2”改过来,可得到同样的运行结果。
●如果选择“FA_behav2”模块进行仿真,会出现什么结果呢?
仿真将提示正常运行,但没有结果显示。
请读者进行尝试并思考原因。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于EDA的组合电路设计第5章 55 基于 EDA 组合 电路设计