打印

verilog HDL 与 VHDL的区别

[复制链接]
11199|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2013-3-6 23:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
梅花望青竹| | 2013-3-6 23:43 | 只看该作者
小析VHDL与Verilog HDL的区别


学习完VHDL后觉得VHDL已非常完善,一次参加培训时需学习Verilog HDL,于是顺便“拜访”了一下Verilog HDL,才发现,原来Verilog HDL也是如此高深,懵懂中发现Verilog HDL好像较之VHDL要多一些语句,是不是Verilog HDL就要比VHDL高级些?

在此先对VHDL与Verilog HDL的发展历程作一个简单的介绍。VHDL诞生于1982年。在1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。而Verilog HDL是由GDA(Gateway Design Automation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得Verilog HDL迅速得到推广应用。1989年CADENCE公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。1990年CADENCE公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995。
由于GDA公司本就偏重于硬件,所以不可避免地Verilog HDL就偏重于硬件一些,故Verilog HDL的底层统合做得非常好。而VHDL的逻辑综合就较之Verilog HDL要出色一些。所以,Verilog HDL作重强调集成电路的综合,而VHDL强调于组合逻辑的综合。所以笔者建议,你作重于集成电路的设计,则只需Verilog HDL就可以了,若你要进行大规模系统设计,则你就必须学习VHDL。
另外,学习过Verilog HDL的朋友应该知道,Verilog HDL很具有C语言的风格,不能说“所以”,但结果差不多,也具有C语言一样的不严密性。所以在硬件电路设计时就得有相应的考虑

使用特权

评论回复
板凳
梅花望青竹| | 2013-3-6 23:43 | 只看该作者
选Verilog还是VHDL学习,这个问题有很多的争论。      这个东西好像蛮重要的,因为刚开始就要选定用什么语言,要比较两种语言的优劣,使用的情况等等,以后才能更好的学习。我只会Verilog,所以不敢乱弹两者之间的优劣,想从另外一个角度来说一下。      这两种语言都是用于数字电子系统设计的硬件描述语言,而且都已经是IEEE的标准。VHDL 1987年成为标准,而Verilog是1995年才成为标准的。这个是因为VHDL是美**方组织开发的,而Verilog是一个公司的私有财产转化而来的。为什么Verilog能成为IEEE标准呢?它一定有其优越性才行,所以说Verilog有更强的生命力。      这两者有其共同的特点:      1.能形式化地抽象表示电路的行为和结构;      2.支持逻辑设计中层次与范围地描述;      3.可借用高级语言地精巧结构来简化电路行为和结构;具有电路仿真与验证机制以保证设计的正确性;      4.支持电路描述由高层到低层的综合转换;      5.硬件描述和实现工艺无关;      6.便于文档管理;      7.易于理解和设计重用——这点很重要啊!      但是两者也各有特点。Verilog HDL推出已经有20年了,拥有广泛的设计群体,成熟的资源也比VHDL丰富(但是好像我在找资料的时候都是VHDL的资料多一些,这个和现在的氛围有关)。Verilog更大的一个优势是:它非常容易掌握,只要有C语言的编程基础,通过比较短的时间,经过一些实际的操作,可以在2~3个月内掌握这种设计技术。而VHDL设计相对要难一点,这个是因为VHDL不是很直观,需要有Ada编程基础(我都不知道是什么,晕了),一般认为至少要半年以上的专业培训才能掌握。      目前版本的Verilog HDL和VHDL在行为级抽象建模的覆盖面范围方面有所不同。一般认为Verilog在系统级抽象方面要比VHDL略差一些,而在门级开关电路描述方面要强的多。

使用特权

评论回复
地板
梅花望青竹| | 2013-3-6 23:44 | 只看该作者
1.设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过
后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对
要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。

  2.代码规范。
  a.设计要参数化。比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我
们可以这么写:
     parameter CLK_PERIOD = 30;
     parameter RST_MUL_TIME = 5;
     parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;
     ...
     rst_n = 1'b0;
     # RST_TIME rst_n = 1'b1;
     ...
     # CLK_PERIOD/2 clk <= ~clk;
  如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重
新例化就行了,从而使得代码更加易于重用。

  b.信号命名要规范化。
  1) 信号名一律小写,参数用大写。
  2) 对于低电平有效的信号结尾要用_n标记,如rst_n。
  3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪
个模块去的关系排列,这样在后期仿真验证找错时后 方便很多。如:
   module a(
        //input
        clk,
        rst_n,  //globle signal
        wren,
        rden,
        avalon_din, //related to avalon bus
        sdi,     //related to serial port input
        //output
        data_ready,
        avalon_dout, //related to avalon bus
        ...
       );
   4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个en
tity。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔
离。这样做可以让综合器综合出更优的结果。
   5) 尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止
出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。
   6) 在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的
,比如配置寄存器就是这种类型。
   7) 一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。
    所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也
是极有好处的。
   9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要
用到门控时钟的地方,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。
        clk_gate_en   --------          ----
       -----------------|D   Q |------------------|   \ gate_clk
_out
                |    |     ---------|   )--------
-
            ------o|>    |     |    |   /
        clk  |    --------      |     ----
       ------------------------------------
   10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式
,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的
复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_
1xclk的速率发送数据。
    不要这样做:
    always (posedge rs232_1xclk or negedge rst_n)
    begin
      ...
    end
    而要这样做:
    always (posedge clk_25m or negedge rst_n)
    begin
      ...
      else if ( rs232_1xclk == 1'b1 )
      ...
    end
   11)状态机要写成3段式的(这是最标准的写法),即
     ...
     always @(posedge clk or negedge rst_n)
     ...
       current_state <= next_state;
     ...
     always @ (current_state ...)
     ...
     case(current_state)
        ...
        s1:
         if ...
          next_state = s2;
        ...
     ...
     always @(posedge clk or negedge rst_n)
     ...
       else
        a <= 1'b0;
        c <= 1'b0;
        c <= 1'b0;      //赋默认值
         case(current_state)
           s1:
             a <= 1'b0;  //由于上面赋了默认值,这里就不用再对b
、c赋值了(b、c在该状态为0,不会产生锁存器,下同)
           s2:
             b <= 1'b1;
           s3:
             c <= 1'b1;
           default:
           ...
    ...

   3.ALTERA参考设计准则
    1) Ensure Clock, Preset, and Clear configurations are free of glitch
es.
    2) Never use Clocks consisting of more than one level of combinatori
al logic.
    3) Carefully calculate setup times and hold times for multi-Clock sy
stems.
    4) Synchronize signals between flipflops in multi-Clock systems when
the setup and hold time requirements cannot be met.
    5) Ensure that Preset and Clear signals do not contain race conditio
ns.
    6) Ensure that no other internal race conditions exist.
    7) Register all glitch-sensitive outputs.
    Synchronize all asynchronous inputs.
    9) Never rely on delay chains for pin-to-pin or internal delays.
    10)Do not rely on Power-On Reset. Use a master Reset pin to clear al
l flipflops.
    11)Remove any stuck states from state machines or synchronous logic.



使用特权

评论回复
5
jlass| | 2013-3-7 10:09 | 只看该作者
本帖最后由 jlass 于 2013-3-8 08:56 编辑

语法上没有本质区别,你学完其中一个之后,另一个自然就会了

使用特权

评论回复
6
forgot| | 2013-3-7 15:21 | 只看该作者

使用特权

评论回复
7
elec921| | 2013-3-21 08:32 | 只看该作者
斑竹很给力

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

535

主题

9629

帖子

23

粉丝