搜档网
当前位置:搜档网 › Verilog和VHDL一些不同

Verilog和VHDL一些不同

Verilog和VHDL一些不同
Verilog和VHDL一些不同

硬件描述语言(Hardware Description Language)是一种用形式化方法来描述数字电路和系统的语言。过去我主要应用VHDL,在实际工作中逐渐发现Verilog比起VHDL来有一些优势,主要是在位运算上和其他方面如循环等语句比VHDL要多,在仿真方面Verilog拥有系统函数和系统任务可供调用,另外Verilog 的语法风格酷似C语言,这在编程学习中省去了熟悉语言语法格式的过程,因此我认为Verilog语言比起VHDL更优越。

在学习中,我感觉Verilog和VHDL有一些不同,在模块结构方面,verilog普遍采用always来描述时序逻辑电路,而VHDL则利用process,紧跟其后的敏感值列表,VHDL通常只写出敏感值,而是采用电平出发还是信号沿触发通常是在process内的语句中指明,如:

process(clk,reset)

if reset=1 then

......

elsif(clk'event and clk='1') then

......

end if;

而Verilog通常是在敏感值列表里就指明是电平触发还是信号沿出发,如

always@(posedge clk) ...... 综合为时序逻辑电路或

always@(clk) ...... 综合为组合逻辑电路

Verilog和VHDL的数据类型也有所不同,在VHDL中定义为整型和矢量是两个不同的类型,在相互应用中要通过程序包中的函数来相互转换。而Verilog中的寄存器型可以定义为多位,如reg[3:0] buf;相当与VHDL的矢量型,在使用中可以根据需要选择将其视为VHDL概念中的整形或矢量型。如:buf=="0001";或buf>1;。

VHDL中编写有限状态机是将状态定义为自定义类型,而在Verilog中只是将状态定义为一个变量。

Verilog中的位运算符(&,|,~,^,~^,<<,>>)和缩减运算符在VHDL中没有相应的语句。

Verilog语言中的编译预处理命令为软核的实现奠定了基础。

Verilog的赋值语句是其语法的一个难点。分为阻塞赋值语句和非阻塞赋值语句。通常在使用信号沿触发的综合为时序逻辑电路的always程序块中使用非阻塞赋值(<=),而在电平触发的综合为组合逻辑电路的always程序块中使用阻塞赋值语句(=)。在组合逻辑和时序逻辑的混合电路中按照时序逻辑来处理。

此外,除了数据结构以外,Verilog和C语言在语法上也有一些不同。Verilog的编译预处理语句以“`”开头,如`define,`include,C则是用“#”。在引用已定义的宏名时,必须在宏名的前面加上符号“`”,表示该名字是一个经过宏定义的名字,而C语言在引用是不用加任何符号。C语言的多条语句用“{”和“}”组成程序块,而Verilog则是用begin...end来实现。Verilog的关系运算符中有“===”和“!==”运算符,用以区别“==”和“!=”实现对不定位X和高阻值Z的比较。同样的情况也出现在casez和casex语句中。在Verilog中,case 语句即相当于C中的switch语句,不同之处在case语句执行完一个分支项后,无须使用break语句跳出分支语句。Verilog语言中的缩减运算符C中没有相应的语句。Verilog中并不是所有结构都顺序执行,always 间即为并发执行。

相关主题