verilog学习笔记
- 格式:pdf
- 大小:117.37 KB
- 文档页数:13
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 ";"解析:意思应该也很简单,就是检查的时候要细心点。
FPGA之有限状态机学习笔记有限状态机(FSM)是由寄存器组合组合逻辑构成的硬件时序电路。
FSM 的状态只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。
Mealy型FSM的下一个状态不仅取决于当前所在状态,还取决于各个输入值。
Moore型FSM的下一个状态只取决于当前状态。
Verilog HDL可以用很多方法描述FSM,最常用的是用always语句和case 语句。
FSM常用模型有Gray和独热码两种,对于用FPGA实现的FSM建议采用独热码。
因为采用独热码可省下许多组合电路的使用,提高电路的速度和可靠性,且总的单元数并无显著增加。
用Verilog语言描述FSM,可以充分发挥硬件描述语言的抽象建模能力。
有限状态机设计的一般步骤:(1)、逻辑抽象,得出状态转换图(2)、状态化简(3)、状态分配(4)、选定触发器的类型并求出状态方程、驱动方程和输出方程(5)、按照方程得出逻辑图以下就是分别用独热码和Gray码实现上述状态的源程序:采用独热码源程序:module fsm(Clock,Reset,A,B,C,D,E,Multi,Contig,Single);input Clock;input Reset;input A,B,C,D,E;output Multi,Contig,Single;reg Multi;reg Contig;reg Single;parameter [6:0]S1=7'b0000001,S2=7'b0000010,S3=7'b0000100,S4=7'b0001000,S5=7'b0010000,S6=7'b0100000,S7=7'b1000000;parameter U_DL Y=1;reg [6:0] curr_st;reg [6:0] next_st;always @(posedge Clock or posedge Reset) beginif(!Reset)curr_st=S1;elsecurr_st= #U_DL Y next_st;endalways @(curr_st or A or B or C or D or E) begincase(curr_st)S1:beginMulti =1'b0;Contig =1'b0;Single =1'b0;if(A&~B&C)next_st =S2;else if(A&B&~C)next_st =S4;elsenext_st =S1;endS2:beginMulti =1'b1;Contig =1'b0;Single =1'b0;if(!D)next_st =S3;elsenext_st =S4;endS3:beginMulti =1'b0;Contig =1'b1;Single =1'b0;if(A|D)next_st =S4;elsenext_st =S3;endS4:beginMulti =1'b1;Contig =1'b1;Single =1'b0;if(A&B&~C)next_st =S5;elsenext_st =S4;endS5:beginMulti =1'b1;Contig =1'b0;Single =1'b0;next_st =S6;endS6:beginMulti =1'b0;Contig =1'b1;Single =1'b1;if(!E)next_st =S7;elsenext_st =S6;endS7:beginMulti =1'b0;Contig =1'b1;Single =1'b0;if(E)next_st =S1;elsenext_st =S7;enddefault:next_st =S1;endcaseendendmoduleModelsim仿真激励文件程序如下:`timescale 1 ns/ 1 psmodule fsm_vlg_tst();// constants// general purpose registersreg eachvec;// test vector input registersreg A;reg B;reg C;reg Clock;reg D;reg E;reg Reset;// wireswire Contig;wire Multi;wire Single;// assign statements (if any)fsm i1 (// port map - connection between master ports and signals/registers .A(A),.B(B),.C(C),.Clock(Clock),.Contig(Contig),.D(D),.E(E),.Multi(Multi),.Reset(Reset),.Single(Single));initialbeginClock=0;forever #10Clock=~Clock;endinitialbeginReset=0;#100Reset=1;endinitialbegin//{A,B,C,D,E}=5'b10101;//# 10// {A,B,C,D,E}=5'b11000;{A,B,C,D,E}=5'b10111;//A=1;//B=0;//C=1;#100//{A,B,C,D,E}=5'b10101;D=0;#50//{A,B,C,D,E}=5'b10111;A=1;D=1;#50//{A,B,C,D,E}=5'b11011;A=1;B=1;C=0;#100//{A,B,C,D,E}=5'b11010;E=0;#50//{A,B,C,D,E}=5'b11011;E=1;endendmodule注:initial块中语句是顺序执行的,因此在需要延时的时候,按相对时间延时。
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学习方法关键词: verilog一般认为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&bendmodule模块中最重要的部分是逻辑功能定义。
有三种方法可以再模块中产生逻辑。
1、用“assign”声明语句如:assign a=b&c2、用实例元件,如同调入库元件一样如: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;end采用assign语句是最常用的方法之一。
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 语句中被赋值。