从Verilog到VHDL(上)基本语法

合集下载

vhdl转verilog hdl的规则

vhdl转verilog hdl的规则

vhdl转verilog hdl的规则VHDL转Verilog HDL的规则引言:VHDL(VHSIC Hardware Description Language)和Verilog HDL 都是硬件描述语言,用于描述数字电路的功能和结构。

在实际的工程中,经常会遇到需要将VHDL代码转换为Verilog HDL的情况。

这篇文章将介绍VHDL转Verilog HDL的规则,以帮助读者成功完成转换过程。

一、了解VHDL和Verilog HDL的语法差异在进行VHDL转Verilog HDL之前,我们需要了解这两种语言的语法差异。

以下是一些常见差异的例子:1. 信号声明:- VHDL: signal a, b, c: std_logic;- Verilog HDL: reg a, b, c;2. 过程和行为描述- VHDL: process (a, b) is begin ... end process;- Verilog HDL: always @(a or b) begin ... end3. 选择结构- VHDL: case (a) is when "00" => ... end case;- Verilog HDL: case (a) "00": ... endcase;二、代码整理准备在进行VHDL转Verilog HDL之前,我们需要对VHDL代码进行整理和准备。

以下是一些常见的准备步骤:1. 删除VHDL中不支持的语法Verilog HDL不支持VHDL中的某些特性,如非标准包等。

在转换过程中,我们应该删除这些不支持的语法。

2. 替换数据类型VHDL中的数据类型和Verilog HDL有所不同,我们需要逐一替换VHDL数据类型为对应的Verilog HDL数据类型。

3. 检查命名规范VHDL和Verilog HDL在命名规范上有所不同。

在进行转换之前,我们需要检查VHDL代码中的命名规范是否符合Verilog HDL的要求,并进行相应的修改。

verilog vhdl知识点

verilog vhdl知识点

Verilog HDL在系统级抽象方面比VHDL略差一些,而在门级开关电路描述方面比VHDL要强的多写了第一个verilog程序,是一个加法器内容如下module adder(count,sum,a,b,cin);input[2:0] a,b;input cin;output count;output [2:0] sum;assign{count,sum}=a+b+cin;endmodule开始编译出现了几次错误,后来发现给实体的命名和程序中实体要一致而且大小写要一样,整个程序是嵌套再module和endmodule当中的而其中的注释和C/C++类似,用//和/*…*/来标明module compare(equal,a,b);output equal;input [1:0] a,b;assign equal=(a==b)?1:0;//和C语言中的相同endmoduleverilog的基本设计单元是“模块(BLOCK)”。

一个模块由两个部分组成,一部分描述端口,一部分描述逻辑功能,即定义输入是如何影响输出的。

如下module block(a,b,c,d);input a,b;output c,d;assign c=a|b;assign d=a&b;endmodule模块中最重要的部分是逻辑功能定义。

有三种方法可以再模块中产生逻辑。

1、用“assign”声明语句如:assign a=b&c;2、用实例元件,如同调入库元件一样如:and and_inst(q,a,b);3、用“always”块如:always @(posedge clk or posedge clr) //always块生成了一个带有异步清除端的D触发器。

beginif(clr) q<=0;else if(en) q<=d;采用assign语句是最常用的方法之一。

“always”块可以用于产生各种逻辑,常用于描述时序逻辑。

了解VerilogHDL语法规则吗,看完这篇就知道了

了解VerilogHDL语法规则吗,看完这篇就知道了

了解VerilogHDL语法规则吗,看完这篇就知道了本节介绍Verilog HDL语法规则,包括文字规则、数据对象及运算符的使用等。

Verilog HDL文字规则1.关键词与标识符关键词是Verilog HDL中预先定义的单词,它们在程序中有特别的使用目的。

已经被用作关键词的单词不可以在程序中另作他用,见表3-1。

不同版本的Verilog HDL硬件描述语言中定义的关键词数目略有变化,Verilog 1995的关键词有97个,Verilog 2001共102个。

标识符是用户编程时给对象定义的名称,对象包括:常量、变量、模块、寄存器、端口、连线、示例和beginend块等元素。

定义标识符时应遵循如下规则:只能由26个大小写英文字母、数字和下划线组成。

标识符的第一个字符必须是英文字母或下划线。

字符中的英文字母区分大小写。

【例3-7】判断下面标识符是否合法。

2.注释与C语言一样,硬件描述语言中的注释也不会被编译。

在Verilog HDL中有两种形式的注释方式:采用/* */,多用于多行注释。

采用//,用于单行注释。

【例3-8】注释举例。

在实际使用中,很多公司的编程规范明确表明,注释行中不提倡采用第一种/**/的注释方式,不允许使用中文注释。

3.常数的表示在Verilog HDL中,常数用来表示在程序中不随意变化的量,常数分为整数、实数及字符串三大类型。

(1)整数型常数是数字电路中最常用到的类型,在Verilog HDL中有两种表示方法:简单的十进制格式,例如-50、6等。

基数格式,其表达方式一般如下:〈位宽〉是十进制数值表示的常数化成二进制时对应的宽度,〈进制符号〉用进制符号b或B(二进制)、o或O(八进制)、d或D(十进制)、h或H(十六进制)表示常数的进制格式,即二进制、八进制、十进制、十六进制这4种进制表示。

数字的位宽可以默认,如果没有定义长度,数的长度由具体机器系统决定(至少是32位)。

【例3-9】常数表示方法举例。

FPGA笔记之verilog语言(基础语法篇)

FPGA笔记之verilog语言(基础语法篇)

FPGA笔记之verilog语言(基础语法篇)笔记之verilog语言(基础语法篇)写在前面:verilogHDL语言是面对硬件的语言,换句话说,就是用语言的形式来描述硬件线路。

因此与等软件语言不同,假如想要在实际的中实现,那么在举行verilog语言编写时,就需要提前有个硬件电路的构思和主意,同时,在编写verilog语言时,应当采纳可综合的语句和结构。

1. verilog 的基础结构1.1 verilog设计的基本单元——module在数字电路中,我们经常把一些复杂的电路或者具有特定功能的电路封装起来作为一个模块用法。

以后在运用这种模块化的封装时,我们只需要知道:1.模块的输入是什么;2.模块的输出是什么;3.什么样的输入对应什么样的输出。

而中间输入是经过什么样的电路转化为输出就不是我们在用法时需要特殊重视的问题。

当无数个这样的模块互相组合,就能构成一个系统,解决一些复杂的问题。

verilog语言的基础结构就是基于这种思想。

verilog中最基本的模块是module,就可以看做是一个封装好的模块,我们用verilog来写无数个基本模块,然后再用verilog描述多个模块之间的接线方式等,将多个模块组合得到一个系统。

那么一个module应当具有哪些要素呢?首先对于一个module,我们应当设计好其各个I/O,以及每个I/O的性质,用于与模块外部的信号相联系,让用法者知道如何连线。

第二,作为开发者,我们需要自己设计模块内部的线路来实现所需要的功能。

因此需要对模块内部浮现的变量举行声明,同时通过语句、代码块等实现模块的功能。

综上所述,我们把一个module分成以下五个部分:模块名端口定义I/O解释第1页共9页。

VHDL与Verilog语言

VHDL与Verilog语言

VHDL与Verilog语言VHDL(VHSIC hardware description language)和Verilog是用于电子系统设计的硬件描述语言(HDL)。

这两种语言被广泛应用于数字逻辑设计和仿真,以及硬件描述、验证和综合。

1. VHDL(VHSIC hardware description language)VHDL是一种结构化的硬件描述语言,最初由美国国防部高速集成电路计划办公室(VHSIC,Very High Speed Integrated Circuits)开发。

VHDL以其强大的功能和灵活性而闻名,并被广泛用于数字系统的设计和验证。

VHDL的编写包括实体(Entity)和体(Architecture)两个主要部分。

实体部分描述了数字系统的输入输出接口、信号和组件的声明,而体部分描述了实体的内部结构、信号处理和逻辑功能。

VHDL具有丰富的数据类型、运算符和控制结构,可以方便地描述数字电路的行为和结构。

它还提供了强大的仿真和验证功能,使设计人员能够在开发和测试阶段快速迭代和调试设计。

2. VerilogVerilog是一种硬件描述语言,最初由Gateway Design Automation公司(现在是Cadence Design Systems的一部分)开发。

Verilog以其简洁的语法和易学易用的特性而受到广泛欢迎,并成为工业界标准。

Verilog的设计由模块(Module)组成,每个模块描述了一个黑盒子,包含输入和输出端口以及内部的逻辑功能。

模块可以进行层次化组合,从而实现较复杂的系统级设计。

Verilog的语法类似于C语言,具有类似的数据类型、运算符和控制结构。

它还提供了时序建模的能力,使设计人员能够描述数字电路的时序行为。

3. VHDL与Verilog的比较VHDL和Verilog在语法和功能上有一些区别,但它们都可以用于数字电路的设计和仿真。

以下是它们之间的一些比较:3.1 语法风格VHDL采用结构化的编程风格,需要明确的体、过程和信号声明,可以更好地控制和描述系统的结构和行为。

VHDL语法简单情况总结

VHDL语法简单情况总结

VHDL语法简单总结一个VHDL程序代码包含实体(entity)、结构体(architecture)、配置(configuration)、程序包(package)、库(library)等。

一、数据类型1.用户自定义数据类型使用关键字TYPE,例如:TYPE my_integer IS RANGE -32 TO 32;–用户自定义的整数类型的子集TYPE student_grade IS RANGE 0 TO 100;–用户自定义的自然数类型的子集TYPE state IS (idle, forward, backward, stop);–枚举数据类型,常用于有限状态机的状态定义一般来说,枚举类型的数据自动按顺序依次编码。

2.子类型在原有已定义数据类型上加一些约束条件,可以定义该数据类型的子类型。

VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。

子类型定义使用SUBTYPE关键字。

3.数组(ARRAY)ARRAY是将相同数据类型的数据集合在一起形成的一种新的数据类型。

TYPE type_name IS ARRAY (specification) OF data_type;–定义新的数组类型语法结构SIGNAL signal_name: type_name [:= initial_value];–使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明例如:TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0);–滤波器输入延迟链类型定义TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0);–滤波器系数类型定义SIGNAL delay_regs: delay_lines; –信号延迟寄存器声明CONSTANT coef: coeffs := ( ); –常量系数声明并赋初值4.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。

VHDL语法简单总结

VHDL语法简单总结

VHDL语法(yǔfǎ)简单总结VHDL语法简单(jiǎndān)总结VHDL语法(yǔfǎ)简单总结一个(yī ɡè)VHDL程序代码包含实体(shítǐ)(entity)、结构(jiégòu)体(architecture)、配置(pèizhì)(configuration)、程序包(package)、库(library)等。

一、数据类型1.用户自定义数据类型使用关键字TYPE,例如:TYPE my_integer IS RANGE -32 TO 32;–用户自定义的整数类型的子集TYPE student_grade IS RANGE 0 TO 100;–用户自定义的自然数类型的子集TYPE state IS (idle, forward, backward, stop);–枚举数据类型,常用于有限状态机的状态定义一般来说,枚举类型的数据自动按顺序依次编码。

2.子类型在原有已定义数据类型(lèixíng)上加一些约束条件,可以定义(dìngyì)该数据类型的子类型。

VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。

子类型定义使用(shǐyòng)SUBTYPE关键字。

3.数组(ARRAY)ARRAY是将相同数据类型的数据集合在一起(yīqǐ)形成的一种新的数据类型。

TYPE type_name IS ARRAY (specification) OF data_type;–定义新的数组类型(lèixíng)语法结构SIGNAL signal_name: type_name [:=initial_value];–使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明例如:TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0);–滤波器输入延迟链类型定义TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0);–滤波器系数(xìshù)类型定义SIGNAL delay_regs: delay_lines; –信号延迟(yánchí)寄存器声明CONSTANT coef: coeffs := ( ); –常量(chángliàng)系数声明并赋初值4.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以(suǒyǐ)必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。

fpga语法知识点总结

fpga语法知识点总结

fpga语法知识点总结一、Verilog语言Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统级设计。

在FPGA设计中,Verilog语言常常用于描述逻辑功能和时序控制。

Verilog语言包括模块、端口、信号声明、组合逻辑、时序逻辑、行为模拟等部分。

1. 模块:Verilog中的模块是一个最基本的组织单位,它类似于面向对象编程中的类。

每个模块都有自己的输入输出端口和内部逻辑实现。

在FPGA设计中,通常会设计多个模块来实现不同的功能,然后将这些模块连接起来,构成一个完整的系统。

2. 端口:在Verilog中,端口用于定义模块与外部环境的接口。

端口可以被定义为输入端口(input)、输出端口(output)、双向端口(inout)等,用于进行与外部信号的通信。

3. 信号声明:在Verilog中,信号用于传递逻辑信息。

信号可以是单个的位(bit)信号,也可以是多位(bus)信号。

在FPGA设计中,对信号的声明和使用是非常重要的,可以影响到设计的性能和资源占用。

4. 组合逻辑:组合逻辑是一种不含时钟的逻辑电路,其输出仅由输入决定。

在Verilog中,组合逻辑常常使用逻辑运算符和条件语句来描述。

5. 时序逻辑:时序逻辑是一种包含时钟信号的逻辑电路,其输出由时钟信号和输入信号共同决定。

在FPGA设计中,时序逻辑和时序约束非常重要,可以影响到设计的时序性能。

6. 行为模拟:行为模拟是一种用于验证设计功能和性能的技术。

在Verilog中,可以使用行为模拟语句来描述设计的行为,并进行仿真验证。

二、VHDL语言VHDL(VHSIC Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统级设计。

在FPGA设计中,VHDL语言和Verilog语言一样,用于描述逻辑功能和时序控制。

VHDL语言包括实体、端口、信号声明、组合逻辑、时序逻辑、行为模拟等部分。

1. 实体:在VHDL中,实体是描述一个硬件单元的基本描述。

VHDL和Verilog的混合编程

VHDL和Verilog的混合编程

VHDL调用Verilog模块的时候,要在实例化模块前,加上“verilogmodelGM:”VHDL调用verlogverilog module:module m(a,b,c);input a,b;output c;...endmodule调用如下:compoent mport( a: in std_logic;b: in std_logic;c: out std_logic);end compoentbeginverilogmodelGE: mport map(...)...end在VHDL里调用Verilog的话:例化+映射在Verilog里调用VHDL的话:只要映射看的别人的。

被骗了,所以发点实在的,VHDL与verilog调用这里用VHDL调用VERILOG写好的模块.先按VHDL的语法声明实体(也就是你用Verilog写的模块),然后按VHDL的语法例化实体就行了 .这样就不用转换了,或者可以少用转换了.例子.library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.dt16_pkg.all;entity clk_alm isport (reset : in std_logic;fck32m : in std_logic; --来自背板的32M帧头clk32m : in std_logic; --来自背板的32M时钟refclk2m : in std_logic; --2M参考时钟clklos : out std_logic --时钟告警输出);end clk_alm;architecture arch_clk_alm of clk_alm iscomponent clk_dogport(reset : in std_logic;clock : in std_logic;--work clockrefclk : in std_logic;--reference clockalm : out std_logic);end component;component ALM --声明port(XMCLK : in std_logic;RST : in std_logic;M_CLK : in std_logic;LOST_ALM : out std_logic);end component;signal alm_clk: std_logic;signal alm_fck: std_logic;signal refclk2m_div: std_logic;signal count: std_logic_vector(2 downto 0); signal delay_los: std_logic;beginclk_dog0: clk_dogport map (reset => reset ,clock=>clk32m ,refclk =>refclk2m ,alm =>alm_clk);fck_dog0: ALM --例化PORT MAP(XMCLK => fck32m ,RST => reset ,M_CLK => refclk2m_div ,LOST_ALM => alm_fck);process(reset,refclk2m)beginif reset='1' thencount<=(others=>'0');elsif refclk2m'event and refclk2m='1' thencount<=count+1;end if;end process;refclk2m_div<=count(2);clklos<=not(alm_clk and alm_fck);end arch_clk_alm;-----------------以下是verilog写的module----------------- module ALM (XMCLK, RST, M_CLK, LOST_ALM);input XMCLK ;input RST ;input M_CLK ;output LOST_ALM ;reg LOST_ALM;reg [2:0]ALM_STATE;reg [2:0]COUNTA;reg [2:0]COUNTB;reg [2:0]COUNTC;always @(negedge RST or posedge XMCLK)beginif (!RST)COUNTA <= 0;else if (COUNTA == 7)COUNTA <= 0;else COUNTA <= COUNTA + 1;endalways @(posedge M_CLK) beginif (!RST)beginCOUNTB <= 0;COUNTC <= 0;endelsebeginCOUNTC <= COUNTB;COUNTB <= COUNTA;endendalways @(negedge M_CLK) beginif (!RST)ALM_STATE <= 0;else if (ALM_STATE == 7) ALM_STATE <= 0;else if (COUNTC == COUNTB) ALM_STATE <= ALM_STATE + 1; else ALM_STATE <= 0;endalways @(posedge M_CLK) beginif (!RST)LOST_ALM <= 1;else if (ALM_STATE == 7) LOST_ALM <= 0;else LOST_ALM <= 1;endendmodule。

VerilogHDL基本语法

VerilogHDL基本语法

c a b
源程序如下
1
&
&
&
out
module example_2_3 out,a,b,c ;
input
a,b,c;
output out;
assign out = a b:c;
endmodule
ห้องสมุดไป่ตู้
9. 位并接操作符 Concatenation operators 并接操作符为:{} 并接操作符的使用格式: {操作数1的某些位,操作数2的某些位,…,操作数n的某 些位};
⑤ 可以用/*……*/或//……对Verilog HDL程序的任 何部分作注释。
一个完整的源程序都应当加上需要的注释,以 加强程序的可读性。
2.2 Verilog HDL的词法
2.2.1 空白符和注释
Verilog HDL的空白符包括空格、tab符号、换行 和换页。
空白符如果不是出现在字符串中,编译源程序时 将被忽略。
input
端口1,端口2,端口3,…;
output
端口1,端口2,端口3,…;
例如
input
ina,inb,cin;
output
sum,cont;
2. 信号类型声明
信号类型声明用来说明设计电路的功能描述中,所用的 信号的数据类型以及函数声明。
信号的数据类型主要有连线 wire 、寄存器 reg 、整型 integer 、实型 real 和时间 time 等类型。
8. 条件操作符 Conditional operators 条件操作符为: :
条件操作符的操作数有3个,其使用格式为 操作数 = 条件 表达式1:表达式2;
即当条件为真 条件结果值为1 时,操作数 = 表达 式1;为假 条件结果值为0 时,操作数 = 表达式2。

VHDL语言入门教程

VHDL语言入门教程

VHDL语言入门教程VHDL是一种硬件描述语言,主要用于设计数字电路和系统。

它是由美国国防部门于1980年代初开发的,目的是为了改进电子设计自动化(EDA)工具的开发效率和设计文档的可重复性。

VHDL广泛应用于数字信号处理(DSP)、嵌入式系统、通信系统和各种ASIC(专用集成电路)和FPGA(现场可编程门阵列)的设计。

本教程将介绍VHDL的基础知识,包括语法、数据类型和常见的建模技术。

一、VHDL的语法VHDL的语法由标识符、关键字、运算符和分隔符组成。

其中,标识符用于给变量、信号和实体命名,关键字用于定义语言特定的操作,运算符用于数学和逻辑运算,分隔符用于分隔语句。

VHDL中的代码以一个实体(entity)的声明开始,然后是体(architecture)的声明,最后是信号声明和进程(process)的描述。

以下是一个简单的例子:```vhdlentity AND_gate isportA, B: in std_logic;C: out std_logicend entity AND_gate;architecture Behavior of AND_gate isbeginC <= A and B;end architecture Behavior;```在这个例子中,我们声明了一个名为AND_gate的实体,它有两个输入信号A和B,一个输出信号C。

然后我们定义了一个名为Behavior的体,它描述了AND门的行为:C等于A与B的逻辑与运算结果。

二、VHDL的数据类型VHDL支持许多数据类型,包括标量类型、数据类型、自定义类型和引用类型。

标量类型包括bit、bit_vector、integer、real、std_logic和std_ulogic等。

其中,bit_vector是一组连续的位,std_logic和std_ulogic用于表示单个信号。

数据类型是由标量类型和数组类型组成的。

数组类型可以是一维、二维或更高维的,用于存储多个数据。

verilog语法基础

verilog语法基础

verilog语法基础Verilog语法基础Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统。

它是一种基于事件的语言,能够描述电路的结构和行为。

本文将介绍Verilog语法的基础知识,包括模块、端口、信号、赋值和运算等。

一、模块(Module)在Verilog中,模块是描述电路的基本单元。

一个模块可以包含多个端口和信号,并定义了电路的功能和结构。

模块的定义使用关键字module,后跟模块的名称和端口列表。

二、端口(Port)Verilog中的端口是模块与外部环境进行通信的接口。

端口可以是输入端口、输出端口或双向端口。

输入端口用于接收外部信号,输出端口用于输出信号至外部,而双向端口则可同时进行输入和输出。

端口的定义使用关键字input、output或inout,后跟端口的类型和名称。

三、信号(Signal)Verilog中的信号用于在模块内部传递和存储数据。

信号可以是寄存器类型或线网类型。

寄存器类型信号用于存储数据,线网类型信号用于传递数据。

信号的定义使用关键字reg或wire,后跟信号的宽度和名称。

四、赋值(Assignment)在Verilog中,使用赋值语句将值分配给信号或变量。

赋值语句可以是阻塞式赋值或非阻塞式赋值。

阻塞式赋值使用等号(=)将右侧的值赋给左侧的信号,而非阻塞式赋值使用双等号(<=)进行赋值。

赋值语句的左侧可以是信号或变量,右侧可以是常数、信号、变量或表达式。

五、运算(Operator)Verilog中支持多种运算,包括算术运算、逻辑运算、位运算和比较运算等。

算术运算包括加法、减法、乘法和除法等;逻辑运算包括与、或、非和异或等;位运算包括位与、位或、位非和位异或等;比较运算包括等于、不等于、大于、小于等。

运算符可以用于常数、信号、变量或表达式之间的运算。

六、条件语句(Conditional Statement)Verilog中的条件语句用于根据条件选择执行不同的操作。

vhdl基本语法

vhdl基本语法

Testbench文件的编写
时间标度指令`timescale 用于说明程序中 的时间单位和仿真精度。
`timescale module reg test; set; 10ns/1ns
编译指令
程序示例

仿真和延迟时间值度量单位参数 时间单位精度参数
parameter d = 1.55; initial begin
编译指令
是被包含进当前源文件的其他文件名
条件编译指令包括`ifdef,`else,`endif
这些指令用来控制源代码程序是否参与编译:
`define a; ……… `Ifdef a: 程序段1 `else 程序段2 `endif
版板所有 © 广州周立功单片机发展有限公司 2007
//`define a; ……… `Ifdef a: 程序段1 `else 程序段2 `endif
版板所有 © 广州周立功单片机发展有限公司 2007
广州周立功单片机发展有限公司
版板所有 © 广州周立功单片机发展有限公司 2007

系统任务和编译预处理语句 仿真控制任务
系统任务
主要用在测试文件的initial模块内,配合时间延时控制仿真时间 $finish $stop
$finish: 退出仿真器,返回操作系统

$stop: 把EDA工具置成暂停模式,可以通过相应的命令使仿真继续;
$stop和$finish可以带参数,如$finish(0),根据参数的不同,
编译预处理
编译指令
同C语言的编译预处理指令一样,Verilog HDL也提供了大量的 编译语句。通过编译语句,EDA工具开发商使得用他们的工具解释 Verilog HDL 模型变得相当容易。

从Verilog到VHDL(上)基本语法

从Verilog到VHDL(上)基本语法

从Verilog到VHDL(上)基本语法16六从学校里开始,我所接触的就一直是VerilogHDL而非更老牌的VHDL,而且后续接触的项目中也多半是Verilog的用户,坦白的讲,Verilog的活力也确实更足一些,从IEEE1800-2005开始的SystemVerilog的标准化,将Verification和Design的一体化的尝试,我个人认为,是走在正确的道路上。

所以,我确实想不到,我竟然也要回头学起VHDL来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL,看来终究是绕不过去的了——正如一个Design Verification工程师在目前想完全的不和SpecmanE 打交道是很难的一样。

下面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来没有接触过VHDL,当然会存在很多非常初级的东西。

而在本文之后,打算再写一篇简单阐述下结合Cadence的IUS工具,使用SystemVerilog对VHDL进行验证的基本方法。

起手式从Verilog撞进VHDL的世界,有些东西要先搞清楚,否则会一头雾水:1. 大小写敏感:Verilog是大小写敏感的,VHDL则非;2. 注释:Verilog的行注释为//,块注释为/**/;VHDL只支持行注释&#8211;;[1. 这个算是不方便的一个地方了,不过不论是在Vim还是Emacs当中,批量做行注释也很容易实现;] 基本结构VHDL被认为是要求更严格,更多讲究的语言,相比和C类似的Verilog,架构上更严谨一些:1. 基本结构:从上往下为USE定义区(调用库和包);Package定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规格);[2. Entity感觉像是C的头文件定义之类的东西,而在Verilog 当中,这些其实都是被整合在Module里头一起完成了。

(完整word版)vhdl基本语法

(完整word版)vhdl基本语法

VHDL 基础语法篇——VHDLVHDL硬件描述语言1。

1 VHDL概述1。

1。

1 VHDL的特点VHDL语言作为一种标准的硬件描述语言,具有结构严谨、描述能力强的特点,由于VHDL语言来源于C、Fortran等计算机高级语言,在VHDL语言中保留了部分高级语言的原语句,如if语句、子程序和函数等,便于阅读和应用。

具体特点如下:1。

支持从系统级到门级电路的描述,既支持自底向上(bottom-up)的设计也支持从顶向下(top—down)的设计,同时也支持结构、行为和数据流三种形式的混合描述。

2. VHDL的设计单元的基本组成部分是实体(entity)和结构体(architecture),实体包含设计系统单元的输入和输出端口信息,结构体描述设计单元的组成和行为,便于各模块之间数据传送.利用单元(componet)、块(block)、过程(procure)和函数(function)等语句,用结构化层次化的描述方法,使复杂电路的设计更加简便。

采用包的概念,便于标准设计文档资料的保存和广泛使用。

3. VHDL语言有常数、信号和变量三种数据对象,每一个数据对象都要指定数据类型,VHDL的数据类型丰富,有数值数据类型和逻辑数据类型,有位型和位向量型。

既支持预定义的数据类型,又支持自定义的数据类型,其定义的数据类型具有明确的物理意义,VHDL是强类型语言。

4. 数字系统有组合电路和时序电路,时序电路又分为同步和异步,电路的动作行为有并行和串行动作,VHDL语言常用语句分为并行语句和顺序语句,完全能够描述复杂的电路结构和行为状态。

1.1.2 VHDL语言的基本结构VHDL语言是数字电路的硬件描述语言,在语句结构上吸取了Fortran和C等计算机高级语言的语句,如IF语句、循环语句、函数和子程序等,只要具备高级语言的编程技能和数字逻辑电路的设计基础,就可以在较短的时间内学会VHDL语言。

但是VHDL毕竟是一种描述数字电路的工业标准语言,该种语言的标识符号、数据类型、数据对象以及描述各种电路的语句形式和程序结构等方面具有特殊的规定,如果一开始就介绍它的语法规定,会使初学者感到枯燥无味,不得要领.较好的办法是选取几个具有代表性的VHDL程序实例,先介绍整体的程序结构,再逐步介绍程序中的语法概念。

第七章VHDL语言简介

第七章VHDL语言简介
加、减、并,关系,逻辑运算符。
括号可改变运算次序
下面以加法器为例说明并置运算符的用法:
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY addition IS PORT (A,B:IN STD_LOGIC_VECTOR( 3 DOWNTO 0); Q1: OUT STD_LOGIC_VECTOR( 4 DOWNTO 0)); END addition; ARCHITECTURE behav OF addition IS BEGIN PROCESS (A,B) BEGIN Q1 <= (‘0’ & A) + (‘0’ & B); END PROCESS; END behav;
二选一电路的实体说明: entity mux is port ( a: in std_logic; b: in std_logic; s: in std_logic; f: out std_logic ) end mux;
A B S
F
实体举例3
带类属参数说明的实体: entity adder is generic (width: integer := 2); port ( in_a : in std_logic_vector(width-1 downto 0); in_b : in std_logic_vector(width-1 downto 0); z : out std_logic_vector(width-1 downto 0); carry: out std_logic) ); end entity adder;

veriloghdl语法

veriloghdl语法

veriloghdl语法Verilog HDL(硬件描述语言)是一种硬件描述和设计语言,用于描述和设计数字电路和系统。

以下是Verilog HDL的基本语法:1. 模块声明:module module_name (input declaration, output declaration, inout declaration);// 逻辑和/或数据声明// 逻辑和/或数据操作endmodule2. 输入和输出声明:input [width-1:0] input_name;output [width-1:0] output_name;3. 内部信号声明:reg [width-1:0] signal_name;wire [width-1:0] signal_name;4. 运算符:- 逻辑运算符: &&(与)、 ||(或)、 !(非)- 比较运算符: ==(等于)、 !=(不等于)、 <(小于)、 >(大于)- 算术运算符: +(加)、 -(减)、 *(乘)、 /(除)5. 过程块:always @(sensitivity_list)// 过程块中的语句6. 过程块敏感列表:- posedge clk:时钟的上升沿- negedge clk:时钟的下降沿- expression:表达式更新时7.条件语句:if (condition)// 如果条件为真执行的语句else if (condition)// 如果第一个条件不为真,检查第二个条件是否为真else// 如果以上条件均不为真执行的语句8. 选择语句:case (expression)value1: // 如果expression等于value1执行的语句value2: // 如果expression等于value2执行的语句default: // 如果expression不等于任何值执行的语句endcase9. 迭代语句:for (initialization; condition; increment)// 循环体内的语句以上是Verilog HDL的一些基本语法,可以用于描述和设计数字电路和系统。

Verilog中的一些语法和技巧

Verilog中的一些语法和技巧

1、.2、.3、Reg型的数据类型默认初始值为X;reg型数据可以赋正值也可以赋负值,但是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值;4、在数据类型中和Z均表示高阻态;5、Reg型只表示被定义的信号将用在“always”模块内,并不是说reg型一定是寄存器或触发器的输出;虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样;6、Verilog语言中没有多维数组的存在;Memory型数据类型是通过扩展reg型数据的弟子和范围来生成的;其格式如下regn-1:0存储器名m-1:0;7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的;8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作;9、= = =与= = =和= =与= =的区别:后者称为逻辑等是运算符,其结果是2个操作数的值决定的;由于操作书中某些位可能不定值x和高阻态z结果可能是不定值x;而 = = =和= = =运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0.10、非阻塞和阻塞赋值方式:非阻塞赋值方式如a<=b上面语句所赋得变量值不能立即被下面语句所用,2快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常用的赋值方法; 阻塞赋值如a=b 赋值语句执行完后,块才结束 2 b 的值在赋值语句完成后立即执行 3在时序逻辑使用中,可能产生意想不到的结果;11、模块的描述方式:RTL为寄存器传输级描述“1数据流描述方式:数据流行描述主要用来描述组合功能,具体用“assign”连续赋值语句来实现;分为两种a、显式连续赋值语句;连线型变量类型连线型变量为快连线型变量名Assign 延时量连线型变量名=赋值表达式;显式连续赋值语句包含了两条语句;第一条是对连线型变量的进行类型说明的说明语句;第二句是对这个已得到声明的连线型变量进行连续赋值语句;影视赋值语句:连线型变量类型复制驱动强度连线型变量位宽延时量连线性变量名=赋值表达式;隐式连续赋值语句是把连线性变量说明语句和连线性变量连续赋值语句结合在一条语句中;他可以对连线型变量进行说明的同时进行连续赋值 ;Assign 连续赋值语句的功能是:当赋值表达式中的变量的只发生变化时,重新计算赋值表达式的值,并在指定的时延后将得到的结果赋给左端的连线性变量;Assign只能实现组合功能;而reg型数据可以可以存储过程赋值的最终结果;端口默认为连线性的不用定义一般,只要输入发生变化输出马上发生变化;2行为描述方式:A、initial语句:此语句只执行一次;B、always语句:次语句循环执行;只有寄存器类型数据能够在这两种语句中被赋值;寄存器类型数据在被赋新值前保持所有值不变;以上两种语句在0时刻并发执行;3、结构描述方式结构描述是通过实例进行描述的方法,他将verilog中预定义的基本元件实例嵌入到语言中,监控实力的舒服,一旦其中任何一个发生变化,便重新运算并输出;在verilog HDL中可以使用如下结构描述部件:A、用户自己定义的模块b、用用户自定义元件UDP c、内置门级元件 d、内置开关级元件4混合型描述11、连续赋值语句与过程赋值语句的区别:我觉得这个在刚开始学习verilog时,是会有一些疑问的a、从语法上来看,连续赋值语句由“assign”关键词来表示,而过程赋值语句中则不包含b、连续赋值语句中左侧的被赋值数据类型必须是线网型数据,而过程赋值语句中的被赋值数据类型则必须是寄存器类型的变量c、连续赋值语句不能出现在过程快initial 过程快或者always过程块中,而过程赋值语句则只能出现在过程快中d、连续复制语句主要用来对组合逻辑电路进行建模以及对线网型数据间的连接进行描述,而过程赋值语句主要用来对时序逻辑电路进行行为描述e、连续赋值语句对被赋值线网型数据的赋值是“连续的”即连续复制语句产生作用后,赋值表达式中的信号的任何变换都将立即反映到被赋值线网型数据的取值上,这也是我们有时会使用“连续驱动”这个术语的原因,而在过程赋值语句情况下,只有在过程赋值语句被执行时才执行赋值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响.12、间隔符和注释符:verilog HDL中的间隔符包括空格\b、tab\t、换行符\n以及换页符;注释符有2种:/ 后为多行注释符用于对多行语句注释;前者为单行注释符,只对注释符所在的行有效;13、数值:下划线除了不可以放于数值的首位意外,可以随意用在整型数和实型数之间,他们对数值的大小没有任何的影响,只是为了提高可读性;在verilog中有二进制b或者B、十进制d或者D、八进制o或者O、十六进制h或者H 格式:<size>’<base-format><number> <size>用于指定所表示数的位宽,在数值的表示中式可以缺省的.位宽小于数值的实际位数时,相应的高位部分被忽略;当位宽大于实际的位数,且数值的最高位是0或者1时,相应的高位补零;当位宽高于数值的实际位数,但数值的最高位是x或者z时相应的高位部分补x或者z;二进制中的x或者z表示一位处于x或者z,八进制的表示三位,十六进制的表示4位;14、实型数及其表示方法Verilog HDL中的实数可以用十进制与科学计数法两种格式来表示,如果采用十进制数格式,小数点两边必须有数字,否则为非法字符;如;15、字符串字符串是用双引号括起来的字符序列,他必须包含在同一行中,不能分成多行书写;如字符串用作verilog HDL表达式或赋值语句中的操作数,则字符串被看做8位的ASCII值序列 ,即一个对应8位的ASCII码;在verilog中采用寄存器变量来存储字符串,寄存器变量的位数要大于字符串的最大长度;需要注意的是,verilog HDL中并不需要特殊位来存储终止符;可以采用标准操作符对字符串进行诸如连接类的操作;在操作过程中字符串变量位数大于字符串的实际长度,则字符串变量的高位补零;Reg812:1stringvarInitialBegin string=“hello woeld”;End特殊字符:\n 换行符\t tab键 \\ 符号\\符号 \ddd三位八进制数表示的ASCII值 %%符号%16、数据类型1、物理数据类型:分为连线性和寄存器型变量可以取0、1、x、z,中的认可一个;X 表示一个位置初始状态的变量,或者由于多个驱动源试图将其设定为不同的值而引起的冲突性连线性变量,z表示高祖状态或浮空量;物理类型数据分为连线型和寄存器型亮中连线型数据对应的是硬件电路的物理信号连线,没有电荷的保持作用trireg除外;连线型数据必须有去动员驱动,有两种方式对他进行驱动:一种是结构描述中把它连接到一个们或者模块的输出端;二是用连续赋值语句assign对其进行复制;当没有驱动源对其驱动时,他将保持高阻态Verilog HDL中的连线型数据及其功能描述寄存器数据对应的是具有保持作用的硬件电路与元件,如触发器、锁存器等;如reg没初始化则将为x缺省为一位;两种数据的区别:寄存器型数据保持最后一次的赋值,而连线型数据需要有持续的驱动;寄存器数据的驱动刻意通过过程赋值语句实现,过程赋值语句只能出现在过程语句后面的过程块语句中;存储区:verilog中采用寄存器数组来表示存储器,用来对ROM,RAM或寄存器文件进行建模;数组中的每一个寄存器均称为一个元素,用不同的索引来寻址;Reg16:1 mem5:1 申明16位5字的存储器与寄存器;2、抽象数据类项有整型integer 时间型time 实型real 参数性parameter17、运算符算术运算符:包括+ - / %是二元运算符;如果操作数为寄存器或者连线型则为无符号数;如果为整型或者实型,则刻意是有符号数;当用基数格式表示整数时,一定是无符号数;两个操作数中的一个为x则记过为x;18、按位运算符和逻辑运算符:是逻辑非而~是按位操作的非即按位取反;例如:对于3==2的结果是1;而后者对为进行操作~0、0、1、0=1101;19、归约运算符:归约运算是对单个的操作数进行归约的递推运算,最后的结果是一位的二进制数;具体过程:先讲操作数的第一位和第二位进行归约运算,然后将运算结果与第三位进行归约运算,以此类推,直到最后一位;格式&b19、移位运算不会20、条件运算符:verilog HDL中只有唯一的一种三目运算符,及条件运算符有三个操作数;如第一个操作数为逻辑1,则算子返回第二个操作数;如第一个操作数为逻辑0,则返回第三个操作数;如第一个操作数为高阻态或未知态则按下表给出的逻辑,将第二个和第三个操作数按位比较得到结果;21、连接和复制:连接运算是将多个小的表达式合并成一个大的表达式;Verilog HDL中用符号{, ,}实现多个表达式的链接运算,各个表达式之间用“,”隔开;复制运算符{{}}将一个表达式放入双重花括号内,而复制因子放在第一个括号内,用来指定复制的次数;二、模块的基本结构1、行为描述的结构:Module<模块名><端口列表>模块端口说明参数定义可选数据类型说明过程快initial过程块或always快,可有一个或多个连续赋值语句任务定义tast可选函数定义function可选其中:数据类型说明用来对模块中用到的各类变量类型进行说明,如果某个变量没有进行数据类型说明,则他的类型缺省为连线类型wire;上面列出的各个模块组成项可以是任意次序出现,但是端口说明和数据类型说明必须出现在端口和数据被引用之前;2、1在行为描述模块中出现的每个过程块always过程块或者initial过程块都代表一个独立的进程;2在进行仿真时,所有的过程块的执行都是从0时刻开始并行的执行;3每一个过程块内部的多条语句的执行方式可以是顺序执行的当快定义语句为begin——end时的情况,也可以是并行执行的块定义语句是fork-join时的情况;4always和initial过程块都是不能嵌套使用的;3、initial过程块:Initial语句块而语句块的格式为:<块定义语句>:<块名>块内局部变量;时间控制1 行为语句;;;;;;;;;时间控制n 行为语句;<块定义语句2>其中:块定义语句刻意是“begin end”语句组,或者时“fork,join”语句组;<块名>为可选项,块名可以乘早一个局部作用域;定义块名的过程快成为“有名块”,在有名块下可以定义局部变量,有名块内部语句的执行刻意被disable语句中断;块内局部变量说明也是可选项,只有在有名块中才能定义局部变量,并且块内局部变量只能是寄存器类数据类型;行为语句可以是如下语句中的一种:过程赋值语句阻塞型或非阻塞型过程赋值语句过程连续赋值语句assign/deassign或force/release语句组 if条件分支语句 case条件分支语句循环控制语句forever、repeat、while、for循环语句 wait等待语句disable终端语句事件触发语句event——trigger 任务调用语句用户自定义的任务或系统任务;Initial过程块的使用只要是面向功能模拟的,他通常不具有可综合性;Initial过程块通常来描述测试模块的初始化、监视、波形生成等功能行为;而对硬件功能模块的行为描述中,initial过程块常常用来对只需执行一次的过程进行描述,例如刻意用来寄存器的初始化4、always过程块:Always过程块是由“always”过程语句和语句块组成的,他的格式为:Always敏感事件列表语句块其中语句块的格式为:<块定义语句1 这里一般是begin或者fork>:<块名>块内局部变量说明;时间控制1 行为语句1;;;;;;;时间控制n 行为语句n;<块定义语句2 这里一般是end>说明:敏感事件列表是可选项,带有敏感事件列表的语句块被称为“由事件控制的语句块”他的执行守敏感事件的控制;敏感事件是有OR连接起来的一个或者多个表达式,只要发生了敏感事件列表所列出的多个事件中的任何一个,就启动后面语句块的执行;敏感事件列表实际上代表了一个事件控制类型的时间控制;他的块内定义语句也分为串行块和并行块;5、always和initial语句的区别:always语句过程语句后面可以有一个敏感事件列表,该敏感事件列表的作用是来激活always过程块语句的执行,而initial语句后面则不允许有敏感事件列表;如果always的敏感事件列表是缺省的则认为触发条件始终被满足;6、always过程块的使用只要是对硬件功能模块的行为进行描述,他可以是在测试模块中用来对视中进行描述;利用always过程块可以实现锁存器和触发器他也可以用来实现组合逻辑;在用always过程块视线组合逻辑时要注意将所有的输入信号都列入敏感事件列表中,而在使用always过程块实现时序逻辑时却不一定要将所有的输入信号都列入敏感事件列表;7、串行块:begin:<块名>快内局部变量时间控制1 行为语句1;;;;;;;时间控制n 行为语句nEnd其中:块内局部变量刻意是reg型声明语句、integer型变量声明语句及real型变量声明语句;他的语句是顺序执行的;8、并行块和串行块的格式是相同的,只是它的关键字是fork-join,而且他的语句是并行执行的;而且并行块和串行块是可以嵌套使用的;三、行为描述:时间控制和赋值控制1、时间控制可以用来对过程块中各条语句的执行时间进行控制,时间控制分为两类:1、延时控制:为行为语句的执行指定一个延时时间的控制方式2、事件控制:为行为语句的执行指定触发事件的时间控制方式其中时事件控制方式又可以分为两类:边沿触发事件控制和电平敏感事件控制2、延时控制格式为:<延迟时间> 行为语句;或者<延迟时间>;其中:是延时控制的标识符,“<延迟时间>”是一个直接指定的延迟时间量,他是以多少个仿真时间单位的形式给出的,可以是一个立即数、变量和表达式;如延迟时间为x或者z那么延迟控制等小于零延迟控制;如果为负值,是以该负值的二进制补码值作为实际的延时量;3、边沿触发控制分为四种格式:第一种:<事件表达式> 行为语句;第二种:<事件表达式>;第三种:<事件表达式1>or<事件表达式2>;;;or<事件表达式n>行为语句;第四种:<事件表达式1>or<事件表达式2>;;;or<事件表达式n>;其中事件表达式有三种形式:<信号名>Posedge<信号名>Negedge<信号名>信号名可以是任意数据类型的标量或矢量;第一种事件表达式形式:代表的触发事件是<信号名>所指定的信号发生了某种逻辑变化不论是整条便还是负跳变;它是信号出了保持稳定太意外的任意一种变化过程;第二种表示正跳变可以是下列中的一种:0——x 0——z 0——1 x——1 z——1 第三种表示负跳变可以是写列中的一种:1——x 1——z 1——0 x——0 Z——0.4、用always过程块实现组合逻辑功能1事件表达式内不能能包含“posedge”和“negedge”关键词,也就是说敏感事件列表中的事件表达式智能是前面所述的第一种现在敏感时间列表中;5、电平敏感事件控制wait语句与边沿触发事件控制不同,在电平敏感事件控制方式下启动语句执行的触发条件是某一个指定的条件为真;有三种形式:第一种:wait条件表达式语句块;第二种:wait条件表达式行为语句;第三种:wait条件表达式;6、过程赋值语句:过程赋值语句是使用于两种结构化过程块initial和always过程块中的赋值语句;在过程块中智能使用过程赋值语句不能在过程块中出现连续赋值语句,同时过程赋值语句也只能用在过程块中;过程赋值语句的基本格式为:<被赋值变量><赋值操作符><赋值表达式>其中赋值操作符是“=”或者“=”之一,他们分别代表了阻塞型赋值和非阻塞性赋值类型;7、过程赋值语句智能对于对寄存器类的变量reg、integer、real、time进行赋值8、过程赋值的两种延时方式:1、外部延时控制方式:如果时间控制部分出现在整个过程赋值语句的最左端,也就是出现在赋值目标变量的左边,那么这种时间控制就是外部时间控制方式;在这种控制方式下,过程赋值语句在仿真时是这样执行的:仿真进程晕倒这条带有时间控制的过程赋值语句后,首先要延迟等待有时间控制部分指定的延时时间量,或者等待到指定触发事件发生后,才开始计算有短的赋值表达式并将其值赋予左端被赋变量;例如5 a=b;相当于延时5在把b的值赋给a;2、内部时间控制当赋值语句中的时间控制部分出现在“赋值操作符”和“赋值表达式”之间这种情况下的时间控制成为“内部时间控制”;格式为:a=5 b;先计算b的值,当延迟时间过后把b的值赋给a;可见,在内部时间控制方式下,时间控制所“控制”的是赋值表达式被计算时刻到赋值操作被执行时刻之间的时间差,赋值表达式被计算时刻和赋值变量被复制的时刻是不同的,他们之间的时间差是有时间控制部分决定的;注意:这里赋给a的值是b在零时刻的值,要是b在以后的时刻发生了变化,则a在延时时间过后得到的值依然是b零时刻的取值;格式例子:b=5 a;c=posedge clka;d=waitenablea;9、“显式零延时”控制即延时时间为零;0 a=b;上面的这条语句的执行过程与不具有延时控制的赋值语句“a=b”的执行过程是很相似的;在语句开始执行后他们都是首先计算表达是b的值,在对变量a进行赋值;同时这两条语句的开始执行时刻、表达式计算时刻和变量赋值时刻都是相同的;但是两种赋值有这微妙的差别:在显示零延时控制下,赋值语句内赋值表达式的计算以及变量的赋值操作是在当前的仿真时刻的末位进行的,也就是说要等到这一时刻其他正常操作完成后才进行的;而赋值语句“a=b”内的表达式计算和变量赋值操作则是在赋值开始执行后立即进行的,不需要等待同一时刻的其他操作完成后才进行;如initialBeginA=0;B=0;EndInitialBegin0 a=1;0 b=1;End其中四条赋值语句的操作都是在零时刻得到执行;但是后两条赋值语句的左端加上了显示零延时控制0,所以后两条语句在前两条语句执行完后才执行;也就是先给a,b赋值0,然后再仿真时刻0 的末尾执行对a,b赋值1的操作,a、b的最终取值是1;10、阻塞和非阻塞赋值:阻塞型————符号为“=”非阻塞型——符号为“<=”区别:阻塞型在串行快中的个跳阻塞型过程赋值语句将以他们在顺序快中的先后排列次序依次得到执行;而并行块中的各条阻塞型过程赋值语句则是同事得到执行的;阻塞性过程赋值语句的执行过程是:先计算右端赋值表达式的取值,然后立即将计算结果赋值给“=”左端的被复制变量;这两个特点表明:仿真进程在遇到阻塞型过程赋值语句时将计算表达是的值并立即将其结果付给等式左边的被赋值变量;在串行语句块中,下一条语句的执行会被本条阻塞型过程赋值语句阻塞,只有当前这条阻塞型过程赋值语句所对应的赋值操作执行完毕后下一条语句才能开始执行;也就是说“=”时,语句是一条一条执行的,第一条语句执行完毕后,第二条语句才开始执行;非阻塞和阻塞是不同的,他的语句是同时执行的,在零时刻中他的赋值是同时进行的,在begin-end串行语句块中,一条非阻塞型过程赋值语句的执行不会阻塞下一条语句的执行,也就是说本条非阻塞型过程赋值语句对应的赋值操作执行完毕之前,下一条语句也是可以执行的;12、连续赋值语句:主要对组合逻辑电路进行描述;连线性赋值语句智能用来对连星星变量进行驱动赋值,而不能对寄存器型变量进行赋值他可以采用如下两种格式:1、显示连续复制语句:连线型变量类型连线型变量位宽连线型变量名;Assign 延时量连线型变量名=赋值表达式;2、隐式连续赋值语句:连线型变量类型赋值驱动强度连线型变量位宽延时量连线型变量名=赋值表达式;在以上两种格式中:“连线型变量类型”可以是出了trireg类型外的任何一种连线型数据类型;驱动强度默认为strong1,weak0即赋1值时的驱动强度为strong,赋0值时的驱动强度是weak;例如语句wire weak1,strong0a=b&c;“延时量”也是可选的格式如下:delay1,delay2,delay3其中delay1、2、3都是数值,“delay1”表示连线性变量转移到“1”时的延时量称为上升延时;delay2为下降延时,delay3致命了连线性变量转移到“高阻z”状态的延时称之为关断延时;在实际使用中上三个值是可以省略其中一个或者两个的:如值给出了一个延时值,则这个延时值同时带表“上升延时”、“下降延时”、“关断延时”;如给出了两个延时值,则分别代表“上升延时”和“下降延时”,而“关断延时:将由给出的两个延时值中的较小的哪一个指定;如果延时值这一项缺省,则默认所有的延时值为零;“赋值表达式”可以包含连线型、寄存器型或函数调用等任何数据类型的操作数,同时也可以包含任何操作符;13、在实际中,连续赋值语句的赋值目标可以是如下几种:1、标量连线型变量Wire a,b;Assign a=b;2、向量连线性变量Wire7:0a,b;Assign a=b;3、向量连线型中变量的一位Wire7:0a,b;Assign a3=b3;4、向量连线性变量中的几位Wire7:0a,b;Assign a3:2=b3:2;5、上面几种类型的任意凭借运算结果Wire a,c;Wire2:1b;Assign{a,c}=b;在需要对多个连线型变量进行连续赋值时还可以采用下列形势的连续复制语句,他可以实现对多个变量进行连续赋值;Assign a=b;C=d;D=f;就等同于Assign a=b;Assign c=d;Assign d=f;连续赋值语句是对连线型变量进行连续的驱动;14、注意:与寄存器型变量类型不同,连线性变量没有数据保持能力;只有在被连续驱动后才能去的确定值而寄存器型变量只奥在某一时刻得到一次过程赋值后就能一直保持其取值,弱一个连线性变量没有得到认可连续驱动则它的取值将为不定态“x”;连续复制就是实现对连线型变量进行连续驱动的一种方法;一个连线型变量一单被连续复制语句赋值后,赋值语句右端赋值表达式的值将始终对被复制连线性变量产生驱动连续驱动; 15、如果在一个模块内包含了多条连续赋值语句,或者在一个模块中同时包含了连续赋值语句、过程块、模块实例或原语实例时,他们之间都是并行执行的;.16、过程连续赋值语句:与过程赋值语句一样,过程连续复制语句也是一种过程性赋值语句,它用来过程连续赋值;正如他的名称表示的那样,过程连续赋值是在过程块内对变量进行连续赋值的;过程连续赋值语句和连续赋值语句的不同之处在于:1、过程连续赋值语句智能用在过程块initial块和always块中,而连续赋值语句则不能出现在过程块中;2、过程连续赋值语句刻意对寄存器类变量进行连续复制force-release语句组还可以对连线性变量进行连续赋值,他的赋值目标不可以是变量的某一位或者某几位;过程连续赋值语句执行的是一种“连续赋值”:一旦对某个变量进行了过程连续赋值,则改变量将一直受到过程连续赋值语句内“赋值表达式”的连续驱动,“赋值表达式”内操作数的任何变化都会引起被赋值变量取值的更新,直到对该变量执行了“撤销过程连续赋值操作”;17、assign和deassign语句assign和deassign语句构成了一组连续赋值语句;他们只能用于对集训期类变量的连续赋值操作,而不能用来对连线型变量进行连续赋值操作;前者是对寄存器类变量的连续复制,而后者则是一条撤连续赋值的语句;Assign语句的使用语法是:Assign<寄存器变量>=<赋值表达式>;其中“寄存器类变量”致命了连续赋值操作的目标变量,热“赋值表达式”则致命了连续赋值的“驱动信号”;一旦assign语句得到执行,寄存器累变量将由赋值表达式进行连续驱动,他将进入被连续。

VHDL详细语法教程

VHDL详细语法教程

VHDL详细语法教程VHDL(Very High Speed Integrated Circuit HardwareDescription Language)是一种硬件描述语言,用于对数字电路进行描述、建模和仿真。

它是一种用于描述数字系统结构和行为的语言,广泛用于FPGA(Field Programmable Gate Array)和ASIC(ApplicationSpecific Integrated Circuit)设计中。

VHDL语言具有丰富的语法结构,可以描述数字系统的结构和行为,并可以进行仿真和综合。

下面是VHDL语言的详细语法教程:1. 实体声明(Entity Declaration):VHDL代码的第一部分是实体声明,用于定义设计的接口和名称。

实体声明是设计的顶级结构,它包含输入输出端口的定义。

语法格式如下:```vhdlentity entity_name isportport_name : in/out type;port_name : in/out type;...end entity_name;```其中,entity_name为实体名称,port_name为端口名称,type为端口类型,in表示输入端口,out表示输出端口。

2. 结构体声明(Architecture declaration):在实体声明后,需要定义该实体的结构和行为。

这一部分被称为结构体声明。

语法格式如下:```vhdlarchitecture architecture_name of entity_name issignal signal_name : type;...begin...end architecture_name;```3. 信号声明(Signal declaration):信号用于在VHDL代码中传输数据。

通过信号声明,可以定义存储或传输数据的变量。

信号声明需要在结构体声明的前面进行。

语法格式如下:```vhdlsignal signal_name : type;```其中,signal_name为信号名称,type为信号类型。

从Verilog到VHDL(上):基本语法

从Verilog到VHDL(上):基本语法

从Verilog到VHDL(上):基本语法16六从学校里开始,我所接触的就一直是VerilogHDL而非更老牌的VHDL,而且后续接触的项目中也多半是Verilog的用户,坦白的讲,Verilog的活力也确实更足一些,从IEEE1800-2005开始的SystemVerilog的标准化,将Verification和Design的一体化的尝试,我个人认为,是走在正确的道路上。

所以,我确实想不到,我竟然也要回头学起VHDL来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL,看来终究是绕不过去的了——正如一个Design Verification 工程师在目前想完全的不和SpecmanE打交道是很难的一样。

下面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来没有接触过VHDL,当然会存在很多非常初级的东西。

而在本文之后,打算再写一篇简单阐述下结合Cadence的IUS工具,使用SystemVerilog对VHDL进行验证的基本方法。

起手式从Verilog撞进VHDL的世界,有些东西要先搞清楚,否则会一头雾水:1. 大小写敏感: Verilog是大小写敏感的,VHDL则非;2. 注释:Verilog的行注释为//,块注释为/**/;VHDL只支持行注释–;[1. 这个算是不方便的一个地方了,不过不论是在Vim还是Emacs当中,批量做行注释也很容易实现;]基本结构VHDL被认为是要求更严格,更多讲究的语言,相比和C类似的Verilog,架构上更严谨一些:1. 基本结构:从上往下为USE定义区(调用库和包);Package定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规格);[2. Entity感觉像是C的头文件定义之类的东西,而在Verilog当中,这些其实都是被整合在Module里头一起完成了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从Verilog 到VHDL(上)基本语法
16 六
从学校里开始,我所接触的就一直是VerilogHDL 而非更老牌的VHDL, 而且后续接触的项目中也多半是Verilog 的用户,坦白的讲,Verilog 的活力也确实更足一些,从
IEEE1800-2005 开始的SystemVerilog 的标准化,将
Verification 和Design 的一体化的尝试,我个人认为,是走在正确的道路上。

所以,我确实想不到,我竟然也要回头学起VHDL 来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL ,看来终究是绕不过去的了正如一个Design Verification 工程师在目前想完全的不和SpecmanE 打交道是很难的一样。

面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来
没有接触过VHDL ,当然会存在很多非常初级的东西。

而在本文之后,打算再写一篇简单阐述下结合Cadence 的IUS 工具,使用SystemVerilog 对VHDL 进行验证的基本方
法。

起手式从Verilog 撞进VHDL 的世界,有些东西要先搞清
楚,否则会一头雾水:
1. 大小写敏感:Verilog 是大小写敏感的,VHDL 则非;
2.注释:Verilog 的行注释为// ,块注释为/**/;VHDL 只
支持
行注释&#8211;;[1. 这个算是不方便的一个地方了,不过不
基本结构
论是在Vim 还是Emacs 当中,批量做行注释也很容易实现;] VHDL 被认为是要求更严格,更多讲究的语言,相比和 C 类
似的Verilog ,架构上更严谨一些:
1.基本结构:从上往下为
USE 定义区(调用库和包);Package 定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规
格);
[2. Entity 感觉像是 C 的头文件定义之类的东西,而在Verilog
当中,这些其实都是被整合在Module 里头一起完成
了。

]Architecture 定义区(描述内部功能);[3. 同
上,相当于Verilog 的Module 内部实现。

]Configuration 定义区(决定那个Architecture 被使用)[4. 这也许就是
之所以要分开
Arch 和Entity 的原因,类似的效果在Verilog 里实现,则
要使用那个configuration blocks/library map files这需
些在
要使用那个 configuration blocks/library map files 这些在 Verilog 2001 当中增加的 features ,不过这些部分在 Verilog
当中属于 Beyond language ,更多的是位于语言之上的
2. 并行与串行: 在这一点上, VHDL 和 Verilog 有些类似,书写在 Architecture
内的语句,直接被认为是并行执行,无论书写顺序的(就如 中的并列的 Always 语句块);而顺序执行的串
行 语句必须放置在进程语句 (process )当
中,正如 Verilog 的
begin&#8230;end 。

3. process :
和 Verilog 不同的是这里的 Process 是要求有敏感变量列表 逻辑时类似。

所以当写这样的语句,不妨多回想 Verilog 中 对于敏感变量列表的要求。

4. 例化: 在 VHDL 当中尝试例化一个 entity ,比起 Verilog 要麻烦不少。

首先,必须在 Architecture 当中用 Component 语法来声明 这个实体的 Port 和 Generic (参数);然后才可在后续内容 当中例化实体, 并且用 generic map 和 port map 来进行参数
scope 中了。


同 Verilog 作为输入的, 正如试图在 Verilog 中用 Always 语句实现组合
赋值和port 连接。

5.库,包和配置:
VHDL 这方面的组织比起Verilog 显然要严密多了,使用
configuration ,用简单的语句,就可以把不同的architecture
实现和entity 实现绑定,而此时我们就能看出VHDL 之所以要分开所谓entity 和architecture 的目的所在了。

CONFIGURATION 配置名OF 实体名IS
FOR 为实体选配的构造体名
END FOR ;
END 配置名;而事实上,configuration还可以直接指定某个Hierachy的某
个实体究竟适用那种entity 来例化,语法如下(参见VHDL Configuration ):
configuration TopMixed of Top is —TopMixed 是配置名,Top 是实体名
for Structure
是结构体名,是和实体Top 相对应的结构体
—B1 和B2Structure
for B1: Blk
是结构体structure 中的元件例化语句的标
use entity Work.Blk(RTL); —此

句说明,在元件例化的时候,利用用户自定义
的实体blk 来例化,其结构体是RTL
end for;
for B2: Blk
use entity Work.GateLevelBlk(Synth) —

语句说明,元件例化B2 时,利用实体
GateLevelBLK 对应的Synth 构造体来例化
port map (IP =&gt; To_Vector(A),
To_Int8(OP) =&gt; F);
end for;
end for;
end TopMixed;
只不过这似乎太麻烦了一点。

而Library 和Package 更好理
解一些。

用户可以将一些公共的定义统一靠Package 和Package Body 的关键字来定义到一个包里面去,而这些包又可以被编译在Library 当中。

不过Library 的建立似乎只
依赖于工具的解决,例如在编译的时候选择将包内容编译到某
个库之中,然后再使用。

使用的过程,则是利用Library ,Use 等关键字来import 这些内容。

而要提醒的是,当前编译代码都是被认为是缺省的编入到了work 库当中,所以如果需要引用代码中定义的某个包内容,应该用work.
(packet_name).all 之类的path 来声明。

操作
1. 强类型语言:
VHDL 是强类型语言,对类型要求非常严,一个对象只能有
种数据类型,而且不同类型数据间赋值是严格禁止的,这点Verilog 用户应当注意。

2. Procedure 和Function :
很好理解,直接对应Verilog 的Task 和Function ,需要注意
的就是在VHDL 中还可以对Function 进行重载,这个,也许有用吧。

3.属性:
VHDL 针对不同的对象,都具有不同的属性,这些属性不妨理解成Verilog 当中的Predefined tasks or methods ,但是似乎更加的丰富和多样,相信能够有效的减少代码量。

小结
本文目的不在于语法的教程或者指导(本来我也刚看VHDL 不过一个下午而已&#8230;&#8230; ),更希望能够迅速、扼
要的抽出VHDL 和Verilog 的一些区别和共性,加速学习的过程。

不过,我相信,一个熟悉Verilog 的工程师,在吃透了上面这些不同点后,至少可以跌跌撞撞的开始写VHDL 代码了,更多的东西,自然需要在实践中去体会和学习。

接下来,我的计划是结合Cadence 的IUS 工具,写一写最
基本的SystemVerilog 对于VHDL 的验证的QuickStart 了。

[5. 从目前了解的来看,VHDL 对于验证方面的支持还真是有限,比起Verilog 都有所不及,在最基本的打印,仿真控制上都要麻烦一些,所以,这种情况下,干脆一律交给
SystemVerilog/Vera/E/ 去做,可能还更直接一些]。

相关文档
最新文档