verilog学习笔记
- 格式:doc
- 大小:34.50 KB
- 文档页数:4
Backend Study NotesDC综合学习笔记 ................................................................................................................................................. - 1 -一、verilog 编写........................................................................................................................................... - 1 -二、DC综合注意的地方 ............................................................................................................................. - 2 -1.在同一个电路中不能同时含有触发器和锁存器两种电路单元。
................................................. - 2 -2.在电路中不能出现有反馈的组合逻辑。
......................................................................................... - 2 -3.不能出现用一个触发器的输出作为另一个触发器的时钟。
......................................................... - 2 -4.异步逻辑和模拟电路要单独处理。
................................................................................................. - 2 -5.使用的单元电路没有映射到工艺库中。
⾃⼰整理的:学习verilogDHL问题笔记——Quartus常见错误我初学verilog语⾔,很多细节都没注意,按着⾃⼰的思想就写了,编译的时候才发现各种问题。
这些都是我在学习中遇到的问题,还是很常见的。
1.Error (10028): Can't resolve multiple constant drivers for net ……解析:不能在两个以上always内对同⼀变量赋值,这个细节⼀般看书看资料会看到,但是编程时,就是没想到。
2.Error (10158): Verilog HDL Module Declaration error at clkseg.v(1): port "XXXX" is not declared as port解析:⼤意了,端⼝类型还没定义啊!3.Error (10110): variable "en" has mixed blocking and nonblocking Procedural Assignments -- must be all blocking or all nonblocking assignments解析:en在程序中有时⽤⾮阻塞赋值,有时⽤阻塞赋值,这是禁⽌的。
在初学的时候,可能分得不是很清楚,所以在检查时,⼀定要⼀步步观察慢慢来。
4.Error (10161): Verilog HDL error at clkseg.v(36): object "count" is not declared解析:这个错误应该很明显啦,只要能读得懂。
5.Error (10170): Verilog HDL syntax error at clkseg.v(37) near text "***"; expecting ";"解析:意思应该也很简单,就是检查的时候要细⼼点。
学习verilog DHL问题笔记——Quartus常见错误我初学verilog语言,很多细节都没注意,按着自己的思想就写了,编译的时候才发现各种问题。
这些都是我在学习中遇到的问题,还是很常见的。
1.Error (10028): Can't resolve multiple constant drivers for net ……解析:不能在两个以上always内对同一变量赋值,这个细节一般看书看资料会看到,但是编程时,就是没想到。
2.Error (10158): Verilog HDL Module Declaration error at clkseg.v(1): port "XXXX" is not declared as port解析:大意了,端口类型还没定义啊!3.Error (10110): variable "en" has mixed blocking and nonblocking Procedural Assignments -- must be all blocking or all nonblocking assignments解析:en在程序中有时用非阻塞赋值,有时用阻塞赋值,这是禁止的。
在初学的时候,可能分得不是很清楚,所以在检查时,一定要一步步观察慢慢来。
4.Error (10161): Verilog HDL error at clkseg.v(36): object "count" is not declared解析:这个错误应该很明显啦,只要能读得懂。
5.Error (10170): Verilog HDL syntax error at clkseg.v(37) near text "***"; expecting ";"解析:意思应该也很简单,就是检查的时候要细心点。
veriloga基础语法VerilogA是一种硅谷团队开发的建模语言,它被广泛应用于集成电路(IC)的设计和仿真中。
本文旨在介绍VerilogA的基础语法。
1. 模块声明在VerilogA中,每个模块都需要进行声明。
声明的语法如下:module 模块名(输入端口1,输入端口2,...输入端口n,输出端口1,输出端口2,...输出端口m);<模块定义代码>endmodule其中,模块名可以由字母、数字和下划线组成,不能以数字开头;输入端口和输出端口可以是标量或向量。
2. 参数声明VerilogA允许在模块中声明参数,以便在实例化时进行配置。
语法如下:parameter 参数名 = 值;参数可以通过assign语句进行连接,也可以在实例化时进行配置。
3. 变量声明在VerilogA中,可以使用不同的变量类型进行声明,如实数、整数、布尔值等。
real: 实数类型,用于存储实数值。
integer: 整数类型,用于存储整数值。
boolean: 布尔类型,用于存储真/假值。
语法如下:real 变量名;integer 变量名;boolean 变量名;4. 函数和任务在VerilogA中,可以使用函数和任务来实现特定的功能。
函数是一段可重用的代码,它接收输入参数并返回一个值。
函数的语法如下:function 返回类型函数名(输入参数);<函数定义代码>return 返回值;endfunction任务是一段可重用的代码,不返回值,但可以通过参数进行输入和输出。
任务的语法如下:task 任务名(输入参数);<任务定义代码>endtask5. 运算符VerilogA支持各种常见的数学和逻辑运算符,如加减乘除、取余、与或非等。
加法运算符:+减法运算符:-乘法运算符:*除法运算符:/取余运算符:%与运算符:&&或运算符:||非运算符:!6. 控制结构在VerilogA中,可以使用if-else、for、while等控制结构来实现条件判断和循环。
LCD1602显示源程序如下:module lcd1602(input clk, //60Minput rst_n,output lcd_p, //Backlight Source + lcd屏幕背光output lcd_n, //Backlight Source -output reg lcd_rs, //0:write order; 1:write dataoutput lcd_rw, //0:write data; 1:read dataoutput reg lcd_en, //negedge 在lcd_en下降沿需保证数据有效output reg [7:0] lcd_data);mux16mul(.rst_n(rst_n),.clk(clk),.start(start),.ain(data0),.bin(data1),.yout(data2),.done(done));//端口名称关联//--------------------lcd1602 order----------------------------parameter Mode_Set = 8'h31, //功能设置,Cursor_Set = 8'h0c, //光标设置Address_Set = 8'h06, //输入模式设置Clear_Set = 8'h01; //清屏设置/****************************LCD1602 Display Data****************************/ wire [7:0] data_r0,data_r1,data_r2; //乘数、被乘数wire [15:0]data0,data1; //结果显示wire [31:0]data2;wire [7:0] addr; //write addresswire start,done;assign data_r0 = 8'h30 + data0[7:0] ; // 8'h30在LCD1602上显示值为0。
verilog中的位运算符,缩位运算符和逻辑运算符的说明
1,位运算符
按位运算的运算符是位运算符,原来的操作数有几位,结果就有几位,若两个操作数位数不同,则位数短的操作数左端会自动补0(两个数右端对齐,位数少的操作数会在相应的高位补0)。
(1),按位取反:~
(2),按位与:&
(3),按位或:|
(4),按位异或:^
(5),按位同或:^~或~^
2,缩位运算符(又称归约运算符)
缩位运算符是单目运算符,按位进行逻辑运算,结果是一位值!
(1),与缩位运算符:&
(2),或缩位运算符:|
(3),异或缩位运算符:^
(4),与,或,异或运算符和非运算符组成的复合运算符:~&,~|,~^
3,逻辑运算符(逻辑关系运算)
(1),逻辑与:&&
(2),逻辑或:||
(3),逻辑非:!
其中,逻辑与和逻辑或是双目运算符,逻辑非是单目运算符。
如果操作数是多位的,则将操作数看做整体,若操作数中每一位都是0值则为逻辑0值,若操作数当中有1,则做位逻辑1值。
4,相等与全等运算符
(1),==
(2),!=
(3),===
(4),!==
== 、!= 、===、!== 符号之间不能有空格。
“==”和“!=”称作逻辑等式运算符,其结果由两个操作数的值决定。
由于操作数可能是x或z,其结果可能为x;
“===”和“!==”常用于case表达式的判别,又称作cae等式运算符。
其结果只为0和1.如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0.
逻辑等式运算符和case等式运算符的区别:。
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页。
verilog知识点总结Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统,它广泛应用于数字系统设计和仿真领域。
本文将总结一些Verilog 的重要知识点,以帮助读者更好地理解和应用Verilog。
一、Verilog的基本语法Verilog的基本语法包括模块声明、端口声明、信号声明、数据类型、运算符等。
Verilog中的模块是设计的基本单元,模块声明包括模块名和端口声明。
端口可以是输入、输出或双向的。
信号声明用于定义内部信号,可以是寄存器或线网类型。
Verilog支持多种数据类型,包括整数、浮点数、向量、数组等。
Verilog还提供了丰富的运算符,包括算术运算符、逻辑运算符、位运算符等。
二、组合逻辑电路描述Verilog可以用来描述各种组合逻辑电路,如与门、或门、非门等。
通过使用逻辑运算符和条件语句,可以很方便地描述组合逻辑电路的功能。
Verilog还提供了多种语法结构,如if语句、case语句等,用于描述复杂的逻辑功能。
三、时序逻辑电路描述时序逻辑电路是一种带有状态的电路,Verilog可以用来描述各种时序逻辑电路,如触发器、计数器、状态机等。
通过使用时钟信号和触发器,可以实现电路的时序行为。
Verilog提供了多种触发器类型,如D触发器、JK触发器、T触发器等,可以根据实际需求选择合适的触发器类型。
四、模块实例化和层次化设计Verilog支持模块的实例化和层次化设计,可以将一个模块实例化为另一个模块的一部分。
通过模块实例化,可以方便地实现模块的复用和层次化设计。
层次化设计可以使整个系统更加清晰和模块化,方便调试和维护。
五、仿真和验证Verilog可以用于对设计进行仿真和验证,以确保设计的正确性。
Verilog提供了仿真器,可以对设计进行时序仿真和波形查看。
通过仿真,可以验证设计的功能和时序行为是否符合要求。
Verilog 还支持测试向量的生成和自动验证,可以自动生成测试向量并进行自动验证。
Verilog学习笔记基本语法篇(⼗⼆)········编译预处理hVerilog HDL语⾔和C语⾔⼀样也提供编译预处理的功能。
在Verilog中为了和⼀般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上⾓,其对应的上键盘字符为"~",这个符号并不是单引号"'".这⾥简单介绍最常⽤的`define `include `timescale.1)宏定义`define⽤⼀个指定的标识符(名字)来代表⼀个字符串,其的⼀般形式为: `define 标识符(宏名)字符串(宏内容)如:`define SIGNAL string其作⽤是在后⾯程序中⽤SIGNAL替代所有的string字符串,在编译预处理时,将程序中该命令后⾯所有的SIGNAL替换为string。
这种替代过程称作宏展开。
说明:a)宏名可以是⼤写字母,也可以是⼩写字母。
⼀般⽤⼤写字母,防⽌与后⾯的变量名重复。
b)`define可以出现在模块定义⾥⾯,也可以出现在外边。
其有效范围是从该命令⾏开始⾄源⽂件结束。
c)在引⽤已定义的宏名时,必须在宏名的前⾯加上符号`,表⽰该名字是⼀个经过宏定义的名字。
d)宏定义是⽤宏名代替⼀个字符串,只做简单替换不检查语法。
e)宏定义不是Verilog HDL语句,不必在后⾯加分号。
f)在进⾏宏定义时,可以引⽤已经定义的宏名,可以层层替换。
g)宏名和宏内容必须在同⼀⾏进⾏声明。
如果在宏内容中包含有注释⾏,注释⾏不会作为被置换的内容。
注意:组成宏内容的字符串不能够被以下的语句记号分隔开。
注释⾏+数字+字符串+确认符+关键词+双⽬或三⽬运算符如下⾯的宏定义声明和引⽤就是⾮法的:`define first_half "start of string$display(`first_half end of string")2)⽂件包含处理`include所谓⽂件包含是指处理⼀个源⽂件可以将另⼀个源⽂件的全部内容包含进来,即将另外⽂件包含到本⽂件之中。
Verilog学习笔记基本语法篇(九)········任务和函数task 和 function 说明语句分别⽤来定义任务和函数,利⽤任务和函数可以把函数模块分成许多⼩的任务和函数便于理解和调试。
任务和函数往往还是⼤的程序模块在不同地点多次⽤到的相同的程序段。
输⼊、输出和总线信号的数据可以传⼊、传出任务和函数。
task 和 function 的不同:1)函数只能与主模块共⽤同⼀个仿真的时间单位,⽽任务可以⾃⼰定义⾃⼰的仿真时间单位。
2)函数不能启动任务,但是可以调⽤其它函数,但是任务可以调⽤其他函数和任务;3)函数⾄少要有⼀个输⼊变量,⽽任务可以没有或者有多个任何类型的变量。
4)函数返回⼀个值,⽽任务不返回任何值。
函数的⽬的值通过⼀个返回值对输⼊的信号进⾏响应。
⽽任务可以⽀持多种⽬的,能计算多个结果值,这些值只能通过任务的输出端⼝或者总线端⼝输出。
A) task说明语句如果传给任务的变量和任务完成后接受结果的变量已经定义,就可以⽤⼀条语句启动任务,任务完成以后控制就传回启动过程。
如果任务内部有定时设置,则启动的时间可以与控制返回的时间不同。
1)任务的定义;task <任务名>;<端⼝及数据类型声明语句><语句1>...<语句n>endtask2)任务的调⽤以及变量的传递:任务定义;task my_task;input a,b;inout c;output d,e;.... //执⾏任务的相应语句c=foo1; //对任务的变量赋初始值b=foo2;e=foo3;endtask任务的调⽤: my_task(v,w,x,y,z)任务调⽤变量(v,w,x,y,z)和任务定义的I/O变量(a,b,c,d,e)是⼀⼀对应的。
任务启动时,v,w和x的值给了a b c,结束时c,d,e的值返回给x,y,z。
学习笔记⼀:I2C协议学习和Verilog实现1//////////////////////////////////////////////////2//clk = 20 MHz ,⼀个周期50ns3//sck = 100 kHz (scl) ,⼀个周期 1000ns4//I2C在sck下降沿更新数据,上升沿读取(采样)数据5///////////////////////////////////////////////////6module demo_I2C #(parameter F100K = 9'd200)(clk,rstn,start_sig,word_addr,wr_data,rd_data,done_sig,scl,sda,sq_i);78input clk ;9input rstn ;1011input [1:0] start_sig ; //12input [7:0] word_addr ; //word address13input [7:0] wr_data ; //Data14output [7:0] rd_data ; //Data from EEPROM15output done_sig ;1617output scl ; //sda和scl其实是⽤来作为仿真信号添加在这⾥的,寄存器信号都⽤rscl和rsda表⽰了,最后⽤assign将rscl和rsda赋值给sda和scl,连到模块外部仿真⽤ 18inout sda ; //sda表⽰当前sda的in或out的值1920output [4:0] sq_i ;21/************************************22在这⾥,iic_func_module.v 的步骤i已经被引出来了。
读者要知道步骤i在⽆论是在设计上还是仿真上都有许多的好处。
23步骤i在仿真中可以充当“调试跟踪”的作⽤,因为只要模块的那个部分出问题,步骤i就会指向它。
竭诚为您提供优质文档/双击可除veriloghdl学习心得篇一:Verilog学习心得Verilog学习心得因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module.比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register,如果是,它的clock是什么?D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。
同样,Verilog 中没有“编译”的概念,而只有综合的概念。
写硬件描述语言的目的是为了综合,所以说要想写的好就要对综合器有很深的了解,这样写出来的代码才有效率。
曾经接触过motorola苏州设计中心的一位资深工程师,他忠告了一句:就是用verilog描述电路的时候,一定要清楚它实现的电路,很多人只顾学习verilog语言,而不熟悉它实现的电路,这是设计不出好的电路来的.一般写verilogcode时,对整个硬件的结构应该是很清楚了,最好有详细的电路图画出,时序问题等都应该考虑清楚了。
可以看着图直接写code。
要知道,最初Verilog是为了实现仿真而发明的.不可综合的Verilog语句也是很重要的.因为在实际设计电路时,除了要实现一个可综合的module外,你还要知道它的外围电路是怎样的,以及我的这个电路与这些外围电路能否协调工作.这些外围电路就可以用不可综合的语句来实现而不必管它是如何实现的.因为它们可能已经实际存在了,我仅是用它来模拟的.所以,在写verilog的时候应该要先明确我是用它来仿真的还是综合的.要是用来综合的话,就必须要严格地使用可综合的语句,而且不同的写法可能产生的电路会有很大差别,这时就要懂一些verilog综合方法的知识.就像前面说的,脑子里要有一个硬件的概念.特别是当综合报错时,就要想一想我这种写法能不能用硬件来实现,verilog毕竟还不是c,很多写法是不可实现的.要是这个module仅是用来仿真的,就要灵活得多了,这时你大可不必太在意硬件实现.只要满足它的语法,实现你要的功能就行了.有网友说关于#10clk=~clk的问题,虽然这种语句是不可综合的,但是在做simulation和verification是常常用它在testbench中来产生一个clock信号。
SystemVerilog断⾔学习笔记SystemVerilog断⾔学习笔记1⼀、前⾔随着数字电路规模越来越⼤、设计越来越复杂,使得对设计的功能验证越来越重要。
⾸先,我们要明⽩为什么要对设计进⾏验证?验证有什么作⽤?例如,在⽤FPGA进⾏设计时,我们并不能确保设计出来的东西没有功能上的漏洞,因此在设计后我们都会对其进⾏验证仿真。
换句话说,验证的⽬的是彻底地验证被测设计以确保设计没有功能上的缺陷。
⽽即将介绍的SystemVerilog断⾔便是⼀门重要的验证技术,它可以尽早发现设计的缺陷以及提⾼验证的效率。
⼆、基本概念1、什么是断⾔断⾔是设计属性的描述。
⽽断⾔可以从设计的功能描述中推知,然后转换成断⾔。
那么断⾔是如何表现的呢?当⼀个被检查的属性不像我们期望的那样表现时,则该断⾔失败;当⼀个禁⽌在设计中出现的属性发⽣时,则该断⾔失败。
2、为什么要使⽤SystemVerilog断⾔Verilog HDL也能实现断⾔,但其存在不⾜之处:Verilog HDL是⼀种过程语⾔,不能很好地控制时序;Verilog HDL是⼀种冗长的语⾔,随着断⾔数量的增加,维护代码将变得很困难;语⾔的过程性使得测试同⼀时间段内发⽣的并⾏事件相当困难;Verilog HDL没有提供内嵌的机制来提供功能覆盖的数据。
⽽SystemVerilog断⾔具有如下特征:它是⼀种描述性语⾔,可以完美描述时序的状况;语⾔本⾝⾮常精确且易于维护;语⾔的描述性提供了对时间卓越的控制;它提供了若⼲个内嵌函数来测试特定的设计情况,并且提供了⼀些构造来⾃动收集功能覆盖数据。
可见,使⽤SystemVerilog断⾔具有⾮常⼤的优势。
三、验证平台⼀个包含SystemVerilog断⾔的验证环境如下图所⽰:注:约束随机测试平台可以⽤来产⽣更多真实的验证情景;代码覆盖则是验证完整性的基本衡量标准。
⼀般情况下,测试平台需要做三件事:产⽣激励;⾃检机制;衡量功能覆盖。
verilog学习笔记-verilog基本语法1.verilog中逻辑表⽰ 在verilog中,有4中逻辑: 逻辑0:表⽰低电平 逻辑1:表⽰⾼电平 逻辑X:表⽰未知电平 逻辑Z:表⽰⾼阻态2.Verilog中数字进制 Verilog数字进制格式包括⼆进制、⼋进制、⼗进制和⼗六进制。
⼀般常⽤的为⼆进制、⼗进制和⼗六进制。
d:表⽰⼗进制 b:表⽰⼆进制 o:表⽰⼋进制 h:表⽰⼗六进制 verilog中数字的表⽰⽅法: ⼆进制表⽰如下:4'b0101 表⽰4位⼆进制数字0101 ⼗进制表⽰如下:4'd2 表⽰4位⼗进制数字2(⼆进制0010) ⼗六进制表⽰如下:4'ha 表⽰4位⼗六进制数字a(⼆进制1010) 在verilog中负数的表⽰⽅法:在位宽前⾯加符号 例如: -5'd25:表⽰5位的⼗进制数-25 在veriog中如果位宽缺省则默认位宽是32位宽:'b1001表⽰32位的⼆进制数0000_0000_0000_0000_0000_0000_0000_1001。
在veriog中如果进制缺省则默认⼗进制。
3.标识符 ⽤于定义模块名,端⼝名,信号名等。
标识符可以是任意⼀组字母、数字、$符号和_(下划线)符号的组合。
但是第⼀个必须是字母或者下划线,⽽且标识符区分⼤⼩写。
书写标识符时应该简洁明了清晰,最好能够体现含义,如: clk_50M:表⽰50兆赫兹时钟。
cpu_addr:表⽰CPU的地址线4.数据类型 在verilog⾥有三种数据类型: reg型:寄存器数据类型。
wire型:线⽹型数据类型。
tri型:线⽹型数据类型。
reg型: 寄存器表⽰⼀个抽象的数据存储单元,通过赋值语句可以改变寄存器储存的值,寄存器数据类型的关键字是 reg,reg 类型数据的默认初始值为不定值x reg [7:0] data //表⽰定义了⼀个8位的寄存器类型的数据data. reg cnt_reg //表⽰定义了⼀个⼀位的寄存器类型的数据cnt_reg reg [7:0] data [255:0] //定义了256个8位的寄存器data reg类型的数据只能在 always 语句和 initial 语句中被赋值。
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语句得到执行,寄存器累变量将由赋值表达式进行连续驱动,他将进入被连续。
学习Verilog HDL简谈
学习是一个慢长的过程不是一朝一夕的事情。
我坚信自学是最好的老师。
无论我们学什么都要有一个信心与奋斗目标。
现在接合自己的真实的体会简谈一下学习Verilog HDL语言一些注意事项。
希望对新上手学习Verilog HDL有一定的帮助。
我接触EDA设计主要是FPGA方面的。
可以这样说对一个大专的学生来说是很难的从事这个方面的学习的。
因为我们不仅要掌握硬件电路和软件设计知识而且还要拥有数字信号处理、系统分析、较强的高数知识。
特别是在设计FPGA应用玩是无线通信领域时,对这方面的要求更高,此时我们也要掌握别一个数学工具软件就是矩形实验室软件(AMTLAB)的运用。
而这些课程都是在本科高年级才开设的。
如果我们想要从事这方面的设计就要慢慢的努力自学对与我一样的大专生来说。
说到此就给大家推荐一个网址。
在这个网站上有许多的教学视频,软件和文档资料都是免费的。
比如说我们EDA所设计的软件知料几乎都可以找到在这个上面。
我是在学习VHDL和C语言后,接触这门语言的。
说所以说,我就接合这三种语言来谈它们的基本区别思路。
我们在做任何系统设计时候,都要先学会硬件电路的规划。
这里就不谈这个,我们常用的就是自己购买的实验开发板。
如果自己做,有一点困难。
主要是没有相关的设备。
比如说我们学校吧,做PCB板就只可以做单面的。
而EDA项目板都采用的是双层以上的板设计。
如
果拿到工厂去就是很贵了,接下来就是焊接了,这方面也是一个难点,FPGA/CPLD/DSP这些元件的管脚都很多的。
因此建议新手去买开发板。
一个好的开发板就可以省去你做实验和开发项目许多的时间。
我就说这样一个例子吧!上一学期,我们做实习项目就是一个多人抢答器。
因为自己比较了解自己的实验板,所以说就按照自己硬件资源设计但是结果是程序很长,调试不方便。
主要原因就是资源不足,不足就要想办法弥补。
这就增加了困难和延长了时间。
最后老师让我用学校的因资源充足所以代码也少许。
最后只有我与另一个同学成功完成了这个项目的设计且实习老师打出了98分的高分。
我说这个意思就是我们在做项目设计首先要规划好的硬件电路,我们编程出来的结果最终是在硬件电路上实现的。
在那个时候,我们只能够修改程序来适应硬件电路。
我们无论学习VHDL和Verilog HDL设计还是阅读他们的程序时候,我们头脑第一反映就要有一个模块形状。
简说就是一块集成块,有多少个管脚,哪些输入和输出,每个有什么作用有一个整体的把握。
说起模块,我就再多说一点。
我们在学习硬件电路的设计为了以后的工作,我们就必须要对这两种语言熟练一种,了解一种。
这就要看个人的喜好了。
一个项目的设计都是与多人的合作的成果。
为了便宜与团队工作就必须要这样的。
这也是我最后接触Verilog HDL的原因。
在学习这门语言基本就是要把握思路。
在心中要劳记一些结构。
如定义一个任务的结构如下:
task 任务名
定义端口类型(如input ,output ,inout)
数据类型(如reg,wire,parameter)
任务体(常用块语言begin………end和fork……………..join)
endtask
要区别C,VHDL ,与Verilog HDL的区别。
如:在C语言中有这样的形式if(a>b) y=1;和if if(a>b) y=1;else y=0;在C语言中就是相等的。
但是在Verilog HDL就是的,因为前者要引起竟争就会产生x输出。
我们在VHDL中也这样说到,为了避免产生多的寄存器也不用这种少else 的。
我们学习要学会正迁引。
要常常总结才能更好的掌握其区别的。
符号的区别。
在预编译时有这样一个符号“’”我们在书上看如’define。
但是一定要记住我们在写程序的时候,不是这个符号而是这个符号“`”如`define。
这个符号键位于ESC键正下方那个。
当初我也犯了这样的一个错误。
真值表的记忆要找规律。
如“==”和“|”真值表。
== 0 1 x z
0 1 x x x
1 x 1 x x
X x x 0 x
Z x x x 0
| 0 1 x z
0 x 1 x x
1 1 1 1 1
X x 1 x x
Z x 1 x x
以上的规律我相信大家会看出来吧。
与的规律只要有1两者之一,就为1,其他都是未知x。
最后给大家推荐两本书。
VHDL学习可以看一看由电子工业出版社出版的《VHDL数字电路设计教程》,由Volinei A.Pedroni著的。
而Verilog HDL可以看一看《Verilog HDL与数字电路设计》由王冠编的。
以上是自己的体会,有什么不足的还请朋友了解给予指出。
我还是一在校的大专生。