tag 标签: 建模

相关帖子
相关博文
  • 热度 3
    2020-11-21 09:57
    1753 次阅读|
    2 个评论
    如何给一个小狗夜灯建模
    论坛坛友 一篇小猫夜灯建模,记忆精湛,成品精良。看得我心潮澎湃,于是乎萌生我也要学习建模的想法,说干就干。不信你们看 先附上原文链接: https://mbb.eet-china.com/blog/3854317-417931.html 先照猫画虎,划出一个外壳来。 生成一个实体 侧视看一下 修改倒角,美观第一。(前方高能预警。。。。) 忘了把中间抠出来了。改改就行。 哒哒哒哒哒 成了。 截面一看,咋是实芯的啊,这不是弄了个砖头吗,女票还不得拍死我 小改一下,问题不大。 OK了 总共耗时3分半,累死我了。然后弄个基准面出来,看看。 画个托台的截面,为了省事,其实不能这么做,因为尺寸不对头哈。 再看下,能过得去就行。 等下 哪里来的舌头,是嘲讽吗???哦,原来是,旋转搞得鬼,不要慌。切掉就行了。 侧视画个旋转切除,咔嚓一下不用愁,老衲洗头用飘柔。 切掉就行。 一千个人眼里有一千两哈雷摩托,所以我家的狗狗就长这个样子。 然后在画个精修小尾巴,专业人士,有备而来。 再画俩小耳朵,支棱起来。 最后画个小灯泡,注意啊,红点 是点睛之笔,意味着能参加德国红点奖。 打完收工。
  • 热度 8
    2020-11-16 21:25
    6929 次阅读|
    7 个评论
    如何给一个小猫夜灯建模
    上面是实物小猫小夜灯图,下面的是在电脑内建模的出来的模型图 下面是全部建模过程分解图 先画一个这样的整体外形截面的线条,注意是以中间轴旋转对称的 旋转出整体外形 对上面的转折处进行倒圆角处理 画出上面的灯罩用的分界横截面 再次进行旋转得出上分型面 把下面的形体实体化 利用上面的分型面把上面进行切割 让切割出的实体生成一个厚2mm的壳体 在中间的平面处画出切割形状 形状向下拉伸,对下面的形体进行切割 在前面切割出的一个平面上,再次画截面 再次进行拉伸式切割 把切割出的硬角进行倒圆角处理 把空缺的地方进行增加式修补 对转角处进行倒圆角处理 通过画截面,旋转出一个扇形面 在扇形面处画线条,并且拉伸,与扇形相交 把扇形与前面的拉伸面进行组合,并且倒角,再进行增厚,形成一个实体 下面开始画小猫 在前面画出的拉伸面处的平面上,画出猫脸的椭圆形 利用扫描工具,扫扫描出边上的大致形体 把中间不合适的地方进行切除,再进行修补 以同样的方式画出小猫的身体线条 同样扫描出边缘形体 把中间部分进行切除,修补 把头和身体进行合并,并且倒圆角 把身体主体结构实体化,以拉伸和倒角的方式,画出尾巴 画出耳朵线条 通过拉抻,放样,合并,弄出耳朵的形状 把耳朵实体化 画截面,通过旋转,画出上面的灯罩形状 画出人体热电感应器的外形截面,通过旋转,进行切割 再画出人体热电感应器的截面,通过旋转,画出传感器的样子
  • 热度 15
    2014-6-19 22:30
    1015 次阅读|
    1 个评论
    独立咨询与调查公司IDTechEX公司认为,到2025年还没有推出吸引人的电动汽车产品的公司将“注定被淘汰出局。”其实说这话一点也不让人感到惊讶,因为今天混合动力和纯电动汽车(H/EV)市场正经历着空前的增长和创新。 我就职的Magna Electronics公司专注于通过为牵引驱动和控制应用提供工程、集成和创新解决方案支持这个新兴的混合动力/纯电动汽车市场,其中包括设计逆变器、直流直流转换器、电动机、电池管理系统和其它关键元器件(图1)。 图1:用于混合动力/纯电动汽车市场的电动机和逆变器。 功率半导体器件和模块是每个电源逆变器的关键器件。绝缘栅双极型晶体管(IGBT)模块则常被用于中高功率应用,如混合动力/纯电动汽车逆变器,因为它们具有高压大电流能力。IGBT是逆变器设计中的关键器件,因为该器件的特性决定了逆变器的行为和外围电路。 【分页导航】 第1页: IGBT决定逆变器行为和外围电路 第2页: 通过仿真改进设计 第3页: 过冲电压保护 第4页: 传导性电磁干扰(EMI)的预测 第5页: 本文小结 《电子技术设计》网站版权所有,谢绝转载 通过仿真改进设计 一般来说,改变一个设计或在实验室验证电路功能是非常耗时并且代价高昂的一件事。电路仿真为电气工程师提供了一种更高效的设计方式。 我们可以根据相关数据手册用Saber Model Architect建立IGBT模块的静态和动态行为的模型。可以用扫描工具将曲线输入Saber,同时调整定位点以匹配曲线。关键要求是表征IGBT的动态行为,包括结点电容、拖尾电流和续流二极管的反向恢复行为,以匹配导通/关断延时和上升下降时间。通过调整关键参数可以使模型用于不同的电路设计,从而极大地推进产品开发过程。 建模IGBT以便完全匹配测试结果是很难的。主要问题之一是,器件特性非常不线性。此时Saber就很有用了,它能通过提供支持来优化困难的模型。而确认电路中的寄生参数也很难,因为开关行为取决于器件本身和电路的寄生参数。尤其是电源电路中的杂散电感可能在关断时引起电压过冲,而栅极驱动电路中的寄生参数会影响开关速度。不过,通过多次反复调整电路可能取得良好匹配。 下面重点介绍了两种不同的IGBT应用,它们足以说明精确IGBT分析的好处。 【分页导航】 第1页: IGBT决定逆变器行为和外围电路 第2页: 通过仿真改进设计 第3页: 过冲电压保护 第4页: 传导性电磁干扰(EMI)的预测 第5页: 本文小结 《电子技术设计》网站版权所有,谢绝转载 过冲电压保护 对于任何工业产品来说,可靠性是最重要的问题之一。IGBT栅极驱动电路板中有各种保护措施,可防止IGBT受到过压、过流或过温的破坏。这种应用与IGBT模块的电压保护功能有关。当负载出现短路时,电流会瞬时增加到几千安培。电路中的过流保护部分一旦检测到大电流会立即关断IGBT。然而,快速的电流变化率作用于电路中的寄生电感后会在晶体管中产生过冲电压(图2)。这个电压如果没有被钳位将损坏器件。 图2:诸如电机驱动或逆变器等开关应用在IGBT关断时会产生过冲电压(图中的蓝线)。 保护电路通过检测Vce开启反馈电路。保护电路正确工作的关键因素之一是IGBT模块的关断延时和下降时间,这正是精确的IGBT模型之所以重要的原因。其它重要因素是选择保护电路中的元件,确保反馈时间满足要求。在本例中,目标是使Vce保持在550V以下。图3中的红色是在没有保护的情况下IGBT关断时的过冲电压。蓝线和绿线显示了通过改变控制环路和栅极驱动器中的延时而发生的不同行为。使用驱动电路的Saber或Spice模型可以确保整个仿真模型的精度。 图3:利用仿真理解改变保护电路内器件参数而发生的效应。 精确的Saber模型有助于验证所设计的电路的功能、选择正确的元件和调整参数。通过在实现硬件之前使用仿真可以显著节省时间,降低工程成本。 【分页导航】 第1页: IGBT决定逆变器行为和外围电路 第2页: 通过仿真改进设计 第3页: 过冲电压保护 第4页: 传导性电磁干扰(EMI)的预测 第5页: 本文小结 《电子技术设计》网站版权所有,谢绝转载 传导性电磁干扰(EMI)的预测 每个电源电路中都存在传导辐射。他们发生的原因是快速变化的开关电流或电压,这在脉动电路中是很常见的。EMI方面感兴趣的频率范围通常是从100kHz至100MHz。 电源电路中的脉动电流或电压看起来像图4a中的方波。方波的快速傅里叶变换(FFT)分析见图4b。频谱衰减取决于方波的两个因素:与脉冲宽度有关的第一个交越频率,与方波的上升和下降时间有关的第二个角频率。因此我们需要建模IGBT模型的上升和下降时间,因为它们影响分析结果。 图4a:信号被建模为梯形波形。波形持续时间(t0)确定了第一个角频率,上升或下降时间(Tr或Tf)确定了第二个角频率。 图4b:相应的频谱。 图5显示了具有不同开关速度的器件模型分析结果。蓝色波形显示的是开关时间为50ns的理想开关,而红色波形显示的是实际IGBT模型。这两个波形在高频范围内有很明显的差别。 图5:比较理想开关(蓝色)和精确IGBT模型(红色)的频率响应。 【分页导航】 第1页: IGBT决定逆变器行为和外围电路 第2页: 通过仿真改进设计 第3页: 过冲电压保护 第4页: 传导性电磁干扰(EMI)的预测 第5页: 本文小结 《电子技术设计》网站版权所有,谢绝转载 本文小结 用Saber进行精确的IGBT器件建模有助于开发逆变器产品,包括栅极驱动器电路板设计和EMI滤波器设计。搭建硬件一般要花6到12个月时间,但仿真可以在任何原型创建之前达到设计优化的目的。仿真有助于: 发现潜在的问题 理解系统行为 验证解决方案和功能 加快设计进程 降低成本 提高效率 虽然本文只是简单介绍了两种应用,但Saber可以用于仿真许多电路和子系统,分析各种控制电路板的EMI。 原文作者:Shengnan Li 【分页导航】 第1页: IGBT决定逆变器行为和外围电路 第2页: 通过仿真改进设计 第3页: 过冲电压保护 第4页: 传导性电磁干扰(EMI)的预测 第5页: 本文小结 《电子技术设计》网站版权所有,谢绝转载
  • 热度 12
    2012-12-31 02:05
    2233 次阅读|
    0 个评论
    昨晚熬到2点,最后ARAM和NIOS ii 都指向了LED,“她”亮了,自己该研究别的了,今天做起了Modelsim的仿真,就那乘法算法来开刀,一天的算法研究让自己不仅对算法有了小小的认识,同时对建模也有了更进一步的了解,就代码和总结写到这儿,一点总结,一点积累… module Multipiler_Module(          Clk_50m,          Rst_n,          StartSig,          Multiplicand,          Multiplier,          DoneSig,          Product          ); input Clk_50m; input Rst_n; input StartSig; input Multiplicand; input Multiplier; output DoneSig; output Product; reg i_Count; reg isNeg; reg Mcand; reg Mer; reg Temp; reg isDone; always @ (posedge Clk_50m or negedge Rst_n) begin  if(!Rst_n) begin   i_Count = 2'b0;   isNeg   = 1'b0;   Mcand   = 8'd0;   Mer     = 8'd0;   Temp    = 16'd0;   isDone  = 1'b0;  end  else if(StartSig)   case (i_Count)    0: begin     isNeg = Multiplicand ^ Multiplier ;     Mcand = isNeg ? (~ Multiplicand + 1'b1) : Multiplicand;     Mer   = isNeg ? (~ Multiplier + 1'b1) : Multiplier;     Temp  = 16'd0;     i_Count = i_Count + 1'b1;    end //end case 0    1: if(Mer == 1'b0) i_Count = i_Count + 1'b1;     else begin      Temp = Temp + Mcand;      Mer  = Mer - 1'b1;     end //end of case 1    2: begin isDone = 1'b1; i_Count = i_Count + 1'b1; end    3: begin isDone = 1'b0; i_Count = 2'd0; end   endcase end assign DoneSig = isDone; assign Product = isNeg ? (~Temp + 1'b1) : Temp; endmodule 下面是费了很大劲写成的Test Bench!!!   `timescale 1 ns/ 1 ps module Multipiler_Module_vlg_tst(); reg Clk_50m; reg Multiplicand; reg Multiplier; reg Rst_n; reg StartSig; // wires                                               wire DoneSig; wire   Product;                          Multipiler_Module i1 (  .Clk_50m(Clk_50m),  .DoneSig(DoneSig),  .Multiplicand(Multiplicand),  .Multiplier(Multiplier),  .Product(Product),  .Rst_n(Rst_n),  .StartSig(StartSig) ); initial                                                begin  Rst_n = 0; #100; Rst_n = 1;  Clk_50m = 0; forever #10 Clk_50m =~ Clk_50m; end   /* ************************************************************************* */ reg j_Count; always @ (posedge Clk_50m or negedge Rst_n) begin  if(!Rst_n) begin   j_Count = 4'd0;   StartSig = 1'b0;   Multiplicand = 8'd0;   Multiplier   = 8'd0;  end  else case (j_Count)   0: if(DoneSig) begin StartSig = 1'b0; j_Count = j_Count + 1'b1; end    else begin Multiplicand = 8'd3; Multiplier = 8'd20; StartSig = 1'b1; end   1: if(DoneSig) begin StartSig = 1'b0; j_Count = j_Count + 1'b1; end    else begin Multiplicand = 8'd40; Multiplier = 8'd5; StartSig = 1'b1; end   2: if(DoneSig) begin StartSig = 1'b0; j_Count = j_Count + 1'b1; end    //Multiplier   = 8'b10101010(-42)    else begin Multiplicand = 8'd3; Multiplier = 8'b10101010; StartSig = 1'b1; end   3: if(DoneSig) begin StartSig = 1'b0; j_Count = j_Count + 1'b1; end    //Multiplicand = 8'b11001100(-76)    else begin Multiplicand = 8'b11001100; Multiplier = 8'd4; StartSig = 1'b1; end   4: if(DoneSig) begin StartSig = 1'b0; j_Count = j_Count + 1'b1; end    else begin Multiplicand = 8'b11001100; Multiplier = 8'b10101010; StartSig = 1'b1; end   5: j_Count = 4'd5;  endcase end                                                                                                endmodule 之后是其波形: 最后就小总结吧: 1.乘法-判断大小-Booth乘法-P空间。 2.“=”时间沿有效地赋值,以时间点的过去为判断标准。 3.“=”以即时结果为判断标准,会破坏“时间点”的和谐性! 4.取值(正、负):A = A ? ( ~A + 1'b1) : A; 5.两个数运算的符号(正、负):isNeg = A ^ B ; 6.A - B = A + ( ~B + 1'B1); 最后的最后: 建模一定是一个模块一个功能!!!
  • 热度 17
    2012-12-21 16:39
    3081 次阅读|
    5 个评论
      第13章抽象级别的描述        前面我们介绍了这么多Verilog的基本语法,最终目的还是要通过这些语句来描述电路,不管你是用if语句还是case语句,不论你是用always还是assign,这些用Verilog描述的电路设计就是该电路的Verilog模型。一个复杂电路的完整Verilog模型是由若干Verilog模块构成的,每个模块又可以由若干子模块构成,而这些模块可以分别用不同抽象级别的Verilog模块来描述,那么,有人肯定会问,到底什么才是不同抽象级别的Verilog模块呢?这一章,我们将一起探讨这个问题。   13.1 不同抽象级别概述 我们知道,Verilog是一种用于数字逻辑电路设计的语言,而数字逻辑电路对于我们学电子的人来说并不陌生,也十分形象,它无非是对应着各种逻辑门结构,并用这些简单的逻辑门结构构成五花八门的数字电路,然后实现我们需要的功能。然而,Verilog是一种硬件编程语言,它既是一种结构描述的语言也是一种行为描述的语言,也就是说对于同一功能的物理电路,我们可以用Verilog中提供的数字电路中较为形象的门级结构来描述电路,也可以用更为抽象的一些语句来描述电路,于是乎,我们根据抽象的程度不同,将不同的描述方式进行划分,得到以下几种不同抽象级别的描述方式,其中,从上至下,离真相越来越近,也就是说最形象的是开关级,其次是门级,依次类推,最抽象的是系统级。 系统级(system):用高级语言结构实现设计模块的外部性能的模型; 算法级(algorithm):用高级语言结构实现设计算法的模型; RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型; 门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型; 开关级(switch-level):描述器件中三极管和存储节点以及它们之间连接的模型。 换言之,不同级别的抽象,也就是说在不同抽象层次上用Verilog语言来描述一个物理电路,若从行为和功能的角度来描述某一电路,则为行为级描述,系统级、算法级和RTL级属于行为级描述方式;若从电路的结构来描述某一电路,则为结构级描述,门级和开关级属于结构级描述方式。在实际应用中,我们要根据需求对每个Verilog模型进行设计,选用不同抽象级别的描述,才能使我们的设计事半功倍,下面我们就来说说这结构级描述和行为级描述。   13.2 结构级描述    所谓结构级描述就是通过调用逻辑元件并描述它们之间连接的方式来建立逻辑电路的Verilog模型,它包含模块实例和基本元件实例,那何谓实例呢?也就是说在使用模块或元件时对其名字根据需要重新定义,并对输入输出端口按需映射,从而将已有模块或元件连接起来构成系统。门级和开关级都属于结构级描述。其设计更为接近实际电路,是电路中各种基本元件的真实写照。 在Verilog中,有26种结构级关键字,包括多输入门、多输出门、三态门、上拉下拉电阻、MOS开关以及双向开关,其中三态门只有在控制端有效时才能传输数据,否则输出高阻态Z,结构级描述的各种关键字如下: 多输入门:and、nand、or、nor、xor、xnor 多输出门:buf、not 三态门:bufif0、bufif1、notif0、notif1 上拉下拉电阻:pullup、pulldown MOS开关:cmos、nmos、pmos、rcmos、rnmos、rpmos 双向开关:tran、tranif0、tranif1、rtran、rtranif0、rtranif1 其中,多输入门、多输出门、三态门、上拉下拉电阻是门级结构关键字,而MOS开关和双向开关是开关级结构关键字。在本节中,我们主要对门级结构描述进行详细的说明,还是一起来探探究竟吧。   13.2.1 门级结构描述及其说明语法     门级结构描述,就是利用Verilog内置的基本门级元件以及它们之间的连接来构筑逻辑电路的模型,简而言之,即电路是用表示门的术语来描述的。其抽象级别比较低,仅此于开关级,因此用门级结构建模来描述逻辑电路是比较接近实际电路的,就跟老一辈的工程师们用三极管、逻辑芯片等原始元件在面包板上搭电路是一个道理。Verilog提供了一系列逻辑门供大家使用。 在上面提到的各种各样的门元件中,我们常用的门结构为以下几种: 非门:not 与门:and 或门:or 与非门:nand 或非门:nor 异或门:xor 异或非门:xnor 缓冲器:buf 对于多输入门(and、or、nand、nor、xor、xnor),其声明语句的格式如下: 门级元件名(驱动能力延时)门实例名(输出,输入1,输入2,……,输入n) 对于多输出门(not、buf),其声明语句的格式如下: 门级元件名(驱动能力延时)门实例名(输出1,输出2,……,输出n,输入) 其中,表示驱动能力的关键字有:supply(supply drive,电源极驱动)、strong(strong drive,强驱动)、pull(pull drive,上拉级驱动)、large(large capacitor,大容性)、weak(weak drive,弱驱动)、medium(medium capacitor,中级容性)、small(medium capacitor,小容性)、highz(high capacitor,高容性),从前向后其驱动强度依次减小。而驱动能力和延时在程序中是可有可无的,可根据不同的情况选不同的值或不选,对于这种比较特殊的表示,在仿真中是如何呢?又是否能在我们的电路中有所体现呢?且看下例。   and       A1(out1,in1,in2);  //out为输出,in1、in2为输入 and  #20  A2(out2,in1,in2);  //out为输出,in1、in2为输入,输出和输入的延时为20个单位时间 A1对应的逻辑示意图如图所示:   仿真结果如图所示:   A1和A2都是与门的实例,我们在上面提到过实例的概念,现在有了活生生的例子,大家应该不会觉得抽象了吧。其中,A2输出相对于输入in1和in2有20个时钟周期的延迟,A1输出相对于输入没有延迟,图中输入in1和in2每20个时钟周期变化一次,从图中黄线所圈我们不得而知,A2确实比A1晚20个时钟周期输出。 在仿真中我们验证了延时说明的功能,按道理A2应该比A1输出晚20个时钟周期,那在实际电路中结果又是不是如我们所想的那样呢?我们对上述电路进行综合,生成的电路如下所示:   其中红线所圈为A1和A2的输出out1和out2,由图中可见,虽然延时(#20)能进行综合,也就是说能生成电路,但是在实际电路中并没有实现延时的元件,所以图中out1和out2是同时输出的,也就是说延时的描述在实际电路中是无效滴。那对于信号驱动能力的描述,其结果又如何呢?我们还是举例说明。 not                  N1(out1, datain);//out1为输出,datain为输入 not  (strong1,weak0)   N2(out2,datain);  //out1为输出,datain为输入,out2输出0时弱驱动,输出1时强驱动 N1对应的逻辑示意图如图所示:   仿真结果如图所示:   N1和N2是非门的两个实例,结果如上图中红线圈和黄线圈所示,当out2对in2取反得到0时,输出强度为弱驱动,此时输出为虚线0,当out2为1时,输出强度为强驱动,此时输出为实线1。那么在实际电路中是否真的能像我们所描述的那样对信号的强度进行明确的说明呢?这个需要来验证一下。 我们对上面的描述进行综合生成电路,如下图所示,从实际电路来看,虽然我们在程序中能对信号强度进行说明,也能够综合形成电路,但实际电路中的两个非门N1和N2并没有区别,输出信号out1和out2也没有区别的标志,也就是说我们人为规定的信号强度在实际电路中跟延时描述一样也是无效滴。     上面我们对门元件的使用有了初步的认识,当它们成群结队而来时,也就是当我们需要对同一个基本门级元件进行多次调用,此时,可采用下面的元件实例语句格式: 门级元件名实例名1(端口连接表1),                             实例名2(端口连接表2),                             ……                             实例名n(端口连接表n); 需要注意的是,在多次调用门元件时,中间每调用完一次用逗号隔开,只有在最后一个门元件调用时用分号结束。现在有了各种门元件的说明方法,可是怎么才能得到门级结构描述的模型呢?好比是我们有了一堆积木,怎么把这些积木凑在一起搭成我们需要的模型。其实,这个也不难,我们且来看看Verilog门级结构描述模块的基本结构。     具备基本的语法后,我们还是需要通过实际的应用对上面的语法进行消化吸收,下节通过一个二选一的选择器来看看我们到底是如何运用这大大小小的门。   13.2.2 用门级结构描述二选一选择器 二选一选择器,顾名思义,就是在控制信号的控制下对两路输入信号选择性输出,在本例中,控制信号为sl,两路输入信号分别为datain_A和datain_B,输出信号为dataout,程序如下所示: moduleTwoMux(                                      datain_A,                             datain_B,                                      sl,                                      dataout     );   inputdatain_A,datain_B,sl; outputdataout;   not U1(nsl,sl); and U2(slA,datain_A,sl);     //sl为1,输出datain_A and U3(slB,datain_B,nsl);    //sl为0,输出datain_B or  U4(dataout,slA,slB);   endmodule 仿真结果如下图所示:     在上图中,我们可以看到,当sl为为1时(图中红线所圈),输出信号dataout波形与datain_A一致,当sl为0时(图中黄线所圈),输出信号dataout波形与datain_B一致,通过上面一段小小的门级结构建模,我们就轻松地实现了二选一选择器。 所以,在电路规模较小的情况下,由于包含的门数较少,我们可以逐个引用逻辑门实例,把它们互相连接起来,这时使用门级结构描述进行Verilog建模是合适的,然而,随着我们需求的变化,如果电路的功能比较复杂,其中包含的逻辑门个数很多,这时使用门级结构描述不但繁琐而且容易出错,并且门级结构建模描述的是电路结构,看起来比较复杂,很难分析其所描述的功能,尤其对数字逻辑电路学的不好的人来说,要把各种简单的门拼凑到一起还实现复杂的功能,可能光想想就觉得头大了,在这种情况下,我们就需要从更高的抽象层次入手,选用更高抽象级别的描述,如RTL级(寄存器传输级),这样可以大大提高设计的效率,下面我们还是一起看看这更高抽象级别描述是怎么个抽象法吧。   13.3 行为级描述 行为级描述,是从电路的功能出发,采用任何Verilog语法进行描述的方式,像我们前面介绍过的always块儿、initial块儿、if语句、case语句、阻塞赋值语句、非阻塞赋值语句等等都属于行为描述。我们平时编写的代码通常都是在行为级描述这个抽象级别,它大大降低了我们电路设计的复杂度,在实现功能方面,真可谓是手到擒来,小菜一碟。   13.3.1 行为级描述及其与RTL级区别 行为级描述关注逻辑电路输入、输出的因果关系,即在何种输入条件下产生何种输出,描述的是一种行为特性,它与结构级描述所不同的是,结构级描述侧重于表示一个电路由哪些基本元件组成,以及这些基本元件的相互连接关系,而行为级描述并不关心电路的内部结构,注重的是整个电路的功能而不是具体实现,它是用一系列高级编程语言编写的过程块儿来建模的,相比结构级描述更为简洁,并且可读性更强。显然,当电路规模较大或时序关系较复杂时,采用行为描述方式进行设计可谓是明智之举。 要进行行为级建模,我们首先要知道其设计模型,如下图所示:   对于行为级描述中需要的各种语言及其用法,也就是上图中“逻辑功能定义”部分,我们在前面的章节中已经陆续介绍,这里不再赘述。 在行为级描述中包含系统级、算法级和RTL级(寄存器传输级),然而,RTL级与行为级又有所不同, RTL级是用寄存器这一级别的描述方式来描述电路的数据方式,专门针对寄存器级,而行为级指的是仅仅描述电路的功能而可以采用任何Verilog语法的描述方式,因此,RTL级描述的目标是可综合,也就是说能形成最终的逻辑门级网表,能映射到我们芯片中的逻辑资源上,而行为级描述的目标是实现我们需要的功能而没有可综合的限制,例如,initial块儿、forever语句等都是行为描述方式,但我们知道它们只能用于仿真,并不能通过综合形成电路,也就是说RTL级是行为级中可综合的那部分。 对于我们设计者而言,最终还是需要把设计变成能实现功能的电路,所以在我们实现功能的同时,可综合性是必须考虑的,因此RTL级描述在电路设计中是必不可少的。   13.3.2 RTL级描述二选一选择器  在13.2.2节中我们用门级结构建模的方式实现二选一选择器,那用RTL级描述又如何实现这个二选一选择器呢?且看下例。 module ActiveStructure_mux2(                                                                                     datain_A,                                                                                     datain_B,                                                                                     sl,                                                                                     dataout     );   inputdatain_A,datain_B; inputsl; outputdataout;   regdataout;   always @(datain_A or datain_B or sl) begin          if(sl==1)                    dataout = datain_A;          //控制信号sl为1,输出datain_A          else                     dataout = datain_B;          //控制信号sl为0,输出datain_B end   endmodule 仿真结果如下图所示:   上图与13.2.2中仿真结果相同,在sl为为1时(图中红线所圈),输出信号dataout波形与datain_A一致,当sl为0时(图中黄线所圈),输出信号dataout波形与datain_B一致。这也验证了RTL级描述和门级结构描述实现的功能是相同的,只是编程方式不同,真是条条大路通罗马。 然而,前面我们也说到过,门级结构建模是最为接近实际电路的,只是对于实现功能复杂的电路来说,其优势就是小巫见大巫咯,此时RTL级建模就进入了设计者的视线,但是不禁有人会问,RTL级建模是怎么变成我们实际的电路呢?它与实际电路之间又有着怎样的瓜葛呢?“综合工具”就帮大家解决了这个问题。为了将这种较高抽象级别的描述映射到实际电路中,需要将这种较高抽象级别的描述转换为低抽象级别的逻辑门级网表,这一过程就是我们一直提到的“综合”,RTL级描述经过综合工具的综合之后,生成逻辑门网表,也就是我们的电路,我们可以通过RTL级视图来检验我们设计的电路,下图是上例二选一选择器RTL级描述经过综合之后得到的RTL级视图,如图所示:   将上图进一步展开,图中lut3元件又由下图构成,如图所示:     由此图可知,该例中RTL级描述经过综合之后,生成的电路也是由1个非门,2个与门和1个或门构成,与我们13.2.2中门级结构描述的电路相同。所以,综合工具帮我们完成了从功能设计到电路的转换。 尽管如此,我们在设计电路时,还是要想着电路的结构,毕竟Verilog是一种硬件编程语言,虽说RTL级建模给我们带来极大的便利,但程序设计不合理、编写不规范、又或者逻辑结构混乱等等都会使综合之后的电路结构错综复杂甚至漏洞百出,所以电路结构是不容小觑的,只有二者结合,相辅相成,各尽其用,才能充分利用芯片的各种资源,完美的实现我们需要的功能,好比是一场音乐会,只有形形色色的乐器都发挥得淋漓尽致时,才能有那余音绕梁,三日不绝于耳之功效。
相关资源