verilog. vs vhdl.:通过示例解释

上次,我详细介绍了实际FPGA编程以及如何开始使用FPGA设计。简要历史 verilog. VHDL. 还讨论过。如果您在Verilog和VHDL之间搜索区别,您将看到许多差异页面讨论此HDL语言战争,但其中大多数是促进初学者或学生的理解的例子的短暂且没有很好地解释。

和...之间的不同 verilog.VHDL. 将通过该帖子中的例子详细解释。的优点和弊端 verilog.VHDL. 还将讨论。

verilog. vs vhdl.:通过示例解释

HDL建模能力: verilog. vs. VHDL.

首先,让我们讨论Verilog和VHDL的硬件建模容量,因为它们都是建模硬件的硬件描述语言。

以下图显示了硬件抽象的行为级别的Verilog和VHDL的HDL建模容量。 
verilog.与VHDL建模容量
图表来源:Douglas J. Smith,“VHDL& Verilog Compared & Contrasted Plus 以VHDL,Verilog和C编写的建模示例

低级型号 

如上图所示,Verilog和VHDL都能够建模硬件。然而, 在低级硬件建模方面, verilog. 比这更好 VHDL.。它是合理的,因为最初是为建模和模拟逻辑门创建的Verilog。事实上,Verilog拥有内置的基元或低级逻辑门,以便设计人员可以在VERILOG代码中实例化基元,而VHDL没有它。

verilog.的栅极基元: ,Nand,Or,Nor,XOR,XNOR,BUF,NOT,BUFIF0,NOTIF0,BUFIF1,NotF1,上拉,下拉.
verilog.的交换机基元: PMOS,NMOS,RPMOS,RNMOS,CMOS,RCMO,TRAN,RTRAN,TRANIF0,RTRANIF0,TRANIF1,RTRANIF1.
更重要的是,Verilog支持用户定义的基元(UDP),以便设计人员可以定义自己的细胞基元。此功能尤为必要,适用于Asics设计师。
以下是关于如何在Verilog代码中实例化门基元的Verilog示例:
or #5 u1(x,y,z);
 #10 u2(i1,i2,i3);
ADC_CIRCUIT u3(in1,out1,out2,clock); 
// ADC_CIRCUIT is an User-Defined Primitive for 
// Analog to Digital Converter for example.
可以通过使用逻辑运算符(如NOT,NAND或,NOR,XOR,XNOR)来实现VERILOG中一些低级内置栅极基元的VHDL等效。 
以下是Verilog门基元的VHDL等效代码的示例:
or u1(x,y,z); in Verilog <=> x <= y OR z; in VHDL.
 u2(i1,i2,i3); (Verilog) <=> i3 <= i2 AND i3; in VHDL.
为了支持UNILOG中的UDP功能,FITIT(VHDL对ASIC库的主动)启动了ASIC设计人员在上面的图表中显示的VHDL中创建自己的蜂窝基元或ASIC库。即使,VHDL仍然可能无法实现Verilog可以支持低级硬件建模的内容。因此,如果我是ASIC设计师,我更喜欢VHDL的Verilog。

高级型号

另一方面, 在提到的图表中所示,VHDL比Verilog更好,如提到的图表所示。与Verilog相比,VHDL为高级硬件建模提供了更多的功能和构造。以下是支持的主要功能 使用Verilog比较VHDL时的高级硬件建模:

  • VHDL.中的用户定义数据类型

verilog. 具有非常简单的数据类型,它是由Verilog语言定义的(用户无法在Verilog中定义自己的数据类型)。 Verilog有两种主要数据类型,包括净数据类型(用于将组件连接在一起,例如 电线(最受欢迎),WAN,WAND,TRI,TRIOR等。)和可变数据类型(用于临时存储,例如 reg(最受欢迎的),整数,时间,真实和实时). 

VHDL. 支持许多不同的数据类型,包括预定义的VHDL数据类型和用户定义的数据类型。预定义的VHDL数据类型包括位,Bit_Vector,String,Time,Boolean,Character和Numeric(Real或Integer)。 VHDL允许设计人员根据预定义的VHDL数据类型定义不同类型;这对于复杂和高级系统来说,这是可以使用许多不同数据类型的复杂和高级系统的良好功能。以下是用于定义新数据类型的示例VHDL代码:

type int_8bit is range 0  255 -- define 8-bit unsigned numbers
signal i : int_8bit;
type state_FSM is (Idle, start, calculate , finish, delay) 
-- define symbolic states to represent FSM states.
signal current_state, next_state: state_FSM;

  • VHDL.设计重复使用的包装

VHDL.中的包通常用于数据类型和子程序声明。 VHDL包中声明的子程序或数据类型可以在许多不同的实体或体系结构中使用。例如:
package fsm_type is 
type FSM_states is (IDLE, TRANSMIT, RECEIVE, STOP);
end package
--  use the FSM_states type in an entity or architecture
-- use the following statement on top of the entity
use work.fsm_type.all
entity example is
verilog.中没有包定义。最接近VHDL包的Verilog是 `包括 Verilog编译器指令。功能或定义可以单独保存在另一个文件中,然后使用它在模块中使用 `包括 指示。以下是一个Verilog示例代码:
// Below is the content of "verilog.VsVHDL.h" file
`定义 INPUT_VERILOG “。/test_VerilogvsVHDL.hex" // Input file name 
`定义 OUTPUT_VHDL "VHDL..bmp" // Output file name 
`定义 VERILOG_VHDL_DIFFERENCE

// Then call it in every single module that you want to use the definition above
`包括 "verilog.VsVHDL.h"

  • VHDL.中的配置语句

VHDL.设计可以获得许多具有不同架构的设计实体,用于一个实体。配置语句将确切的设计实体与设计中的组件实例相关联。当实体中有多个架构时,配置语句继续指定所需的设计架构被分配给合成或模拟的实体。当VHDL设计人员需要管理大型高级设计时,此功能非常有用。 
以下是配置语句的VHDL示例代码:
entity BUF is
  generic (DELAY : TIME := 10 ns);
  port ( BUF_IN : in BIT; BUF_OUT : out BIT);
end BUF;
-- The first design architecture for BUF 
architecture STRUCT_BUF1 of BUF is
signal temp: bit;
begin
  BUF_OUT <= not temp after DELAY;
  temp <= not BUF_IN after DELAY;
end STRUCT_BUF1;
-- The second design architecture for BUF 
architecture STRUCT_BUF2 of BUF is
begin
  BUF_OUT <= BUF_IN after 2*DELAY;;
end STRUCT_BUF2;
-- Testbench to simulate BUF entity 
entity BUF_TESTBENCH is 
end BUF_TESTBENCH;
architecture STRUCT_BUF_TEST of BUF_TESTBENCH is
signal TEST1, TEST2 : BIT := '1';
-- BUF_COMP component declaration:
component BUF_COMP is
  generic (TIME_DELAY : TIME);
  port ( IN1 : in BIT; OUT1 : out BIT );
end component;
begin
  -- instantiation of BUF_COMP component:
  DUT:BUF_COMP generic map (10 ns) port map (TEST1,TEST2);
end STRUCT_BUF_TEST;

-- Configuration specify the design entity and architecture
-- for the DUT component instance in the testbench above
configuration CONFIG_BUF of TEST_BUF is
-- Associate BUF_COMP component instance to BUF design entity
-- and STRUCT_BUF1 design architecture for simulation 
for STRUCT_BUF_TEST 
  for DUT : BUF_COMP 
    use entity WORK.BUF (STRUCT_BUF1)
    generic map (DELAY => TIME_DELAY)
    port map (BUF_IN => IN1, BUF_OUT => OUT1);
  end for;
end for ;
end CONFIG_BUF;

配置块也添加到Verilog-2001中。

  • VHDL.中的图书馆管理

当同时查看Verilog和VHDL代码时,最明显的区别差异是Verilog没有库管理,而VHDL在代码顶部则包括设计库。 VHDL库包含已编译的体系结构,实体,包和配置。管理大型设计结构时,此功能非常有用。上面已经给出了VHDL中的包和配置的示例。以下是VHDL中库管理的VHDL示例代码:
-- library management in VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.all;
use work.clock_div.all;

简而言之,VHDL比Verilog高级硬件建模更好。由于FPGA设计流量不需要低级硬件建模,因此如果我是FPGA设计师,我更喜欢VHDL Over Verilog。 

值得一提的是,通过在VHDL中添加高级功能和构造来创建SystemVerilog以增强Verilog语言在高级建模中的弱点。 SystemVerilog现在广泛用于IC验证。

兼表性:Verilog VS VHDL

VHDL.是一个非常强类型的硬件描述语言,因此必须使用匹配和定义的数据类型正确编写VHDL代码。它意味着如果您混合数据类型或不匹配,则会有一个编译器错误 信号 分配VHDL时。另一方面,Verilog是一种松散类型的语言。在Verilog中,您可以在分配时混合数据类型或不匹配信号。以下是用于不匹配信号的VHDL示例代码:
signal test_reg1:  std_logic_vector(3 downto 0); 
signal test_reg2:  std_logic_vector(7 downto 0); 
test_reg2 <= test_reg1;
-- You cannot assign a 4-bit signal to an 8-bit signal 
-- in VHDL, it will introduce a syntax error below:
-- 宽度不匹配。预期宽度8,实际宽度为4 
-- for dimension 1 of test_reg1.
编译上面的VHDL代码时,将有一个语法错误 "宽度不匹配。预期宽度8,实际宽度为4“。 如果VHDL代码已更改为“test_reg2.<= "0000"&test_reg1;" 匹配位宽度, 没有语法错误。 
如果将4位信号分配给Verilog中的8位信号,那么怎么了?
  wire [3:0] test1;
  wire [7:0] test2;
  // In Verilog, you can assign 4-bit signal to 8-bit signal.
  assign test2 = test1;
  // there will be no syntax error during synthesis 
当您将4位信号分配给8位信号时,Verilog编译器不会引入语法错误。在Verilog中,可以彼此分配具有不同位宽度的信号。 Verilog编译器将把源信号的宽度适应目标信号的宽度。在合成期间将优化未使用的比特。
以下是用于在分配信号时混合数据类型的另一VHDL示例:
signal test1: std_logic_vector(7 downto 0);
signal test2: 整数;
test2 <= test1;
-- Syntax Error: type of test2 is incompatile with type of test1 
上面的VHDL代码将引入语法错误 "Test2类型与Test1的类型不兼容“。 你必须转换 test1 在分配之前到整数数据类型 test1 test2 如下:
library IEEE;
USE ieee.numeric_std.ALL;
signal test1: std_logic_vector(3 downto 0);
signal test2: 整数;
-- Use IEEE.NUMBERIC_STD.ALL Library for this conversion
test2 <= to_integer(unsigned(test1));
-- No syntax errors this time
另一方面,当您在分配时混合数据类型时,Verilog就没有问题。以下是一个Verilog示例:
  reg [3:0] test1;
  整数 test2;
  always @(test1) begin
   test2 = test1;
  end
         // NO syntax errors when compiling
verilog编译器在分配信号时不会在VHDL中引入语法错误 reg 数据类型与具有不同数据类型的另一个信号 整数. 

  • VHDL.复杂数据类型VS Verilog简单数据类型

如上所述,VHDL有许多不同的复杂数据类型,用户也可以定义许多 其他复杂数据类型。这也使得VHDL比Verilog更冗长,因为Verilog仅具有2个主要数据类型,并且Verilog不允许使用用户定义的数据类型。
换句话说,为了模拟相同的电路,VHDL代码通常比Verilog代码更详细,因为我们需要在VHDL中的不同复杂数据类型之间执行转换,因此由于其强的打字。它可以是一个优势或缺点。实际上,当您在VHDL代码中分配错误时,VHDL编译器更有可能会引入语法错误。当您成功编译VHDL代码时,与Verilog相比,您的VHDL代码更有可能工作。另一方面,Verilog是松散的打字,更简洁,更简单;但成功编译后,您的Verilog代码中仍有错误更有可能。 
以下是另一个示例代码,使VHDL比Verilog更冗长:
-- VHDL code for ALU 
process(SEL,ABUS,BBUS,tmp1,tmp2)
begin 
case(SEL) is
 when "0000" =>  ALUOUT <= tmp1; -- ADD
 when "0001" =>  ALUOUT <= tmp2;-- SUB 
 when "0010" =>  ALUOUT <= BBUS; -- AND
 when others => ALUOUT <= ABUS; 
 end case;
end process;
// Verilog equivalent to VHDL ALU 
assign ALUOUT=(SEL==0)?tmp1:((SEL==1)?tmp2:((SEL==2)?BBUS:ABUS));
如上例中所示,如果在VHDL中使用/ SELECT语句时/ else / else,则在VHDL中使用/ SELECT语句时,请在VERILOG中表达较少的详细。 

verilog.和VHDL之间的其他差异:

  • verilog.在VHDL不是时区分大小写。这意味着Data1和Data1是Verilog中的两个不同信号,但两者都是VHDL中的相同信号。

  • 在Verilog中,要在模块中使用组件实例,只需在使用正确的端口映射中将其实例化。在VHDL中,在实例化之前,如果使用旧的实例化语句作为以下示例,则需要在架构中或包中声明架构或包中的组件。在VHDL-93中,您可以直接将实体直接类似:“label_name:entity work.component_name端口地图(端口列表);“。

例如,要在VHDL中实例化实体clk_div,将在架构代码中添加组件声明:
architecture Behavioral of digital_clock is
-- component declaration before instantiation below
component clk_div
port (
 clk_50: in std_logic;
 clk_1s : out std_logic
 );
end component;
signal clk, clk_1s: std_logic;
begin
-- component instantiation
create_1s_clock: clk_div port map (clk_50 => clk, clk_1s => clk_1s); 
end
或者在包中声明组件以重用:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
package clock_div_pack is 
component clk_div is
 port (
         clk_50: in std_logic;
         clk_1s : out std_logic
 );
end component clk_div;
end package;
-- Declare the component in a separate package and 
-- reuse by using the following statement:
use work.clock_div_pack.all;
entity clock is
end clock;
architecture Behavioral of clock is
signal clk, clk_1s: std_logic;
begin
create_1s_clock: clk_div port map (clk_50 => clk, clk_1s => clk_1s); 
end

用于直接实例化VHDL-93中实体的示例代码: 

create_1s_clock: entity work.clk_div port map (clk_50 => clk, clk_1s => clk_1s);

  • verilog.有编译器指令,如 `时间尺度 (声明时间单位和延迟精度), `定义 (将文本字符串声明为宏名称), `ifdef,ifndef` else`forew`fenif (条件编译), `包括 (包括可以包含函数或其他声明的文件)等。VHDL没有编译器指令。 

  • VHDL.支持枚举和记录数据类型,允许用户为一个数据类型定义多个信号。 Verilog不支持枚举和记录类型。以下是枚举和记录类型的VHDL代码:

type FSM is (IDLE, TEST, VERILOGvsVHDL, STOP, FPGA4student);
-- enumerated type
type int_4 is range 0  15;
-- record tye in VHDL
type record_example is record
 data1: 整数;
 data2: int_4;
 data3: FSM;
end record;
  • 等等。
尽管Verilog和VHDL之间存在差异,它们是两个最受欢迎的硬件描述语言。如果可以,那么学习他们都很好。 请记住,始终考虑逻辑门或硬件,同时编码以开发硬件编码心态并忘记使用Verilog和VHDL编码的同时忘记软件编程心态。 
你可能喜欢这个:
FPGA4STUDENT上的VERILOG项目
FPGA4STUDENT的VHDL项目
FPGA4STUDENT的FPGA项目
什么是fpga?它是如何工作的?
什么是fpga编程? FPGA VS软件编程
推荐和经济实惠的学生Xilinx FPGA板
推荐和负担得起的Altera FPGA董事会为学生

使用Verilog对FPGA的图像处理
verilog.中的微控制器设计
FPGA Verilog VHDL课程

没意见:

发表评论

趋势FPGA项目