verilog学习笔记

合集下载

DC-PT-FM-ICC学习笔记

DC-PT-FM-ICC学习笔记

Backend Study NotesDC综合学习笔记 ................................................................................................................................................. - 1 -一、verilog 编写........................................................................................................................................... - 1 -二、DC综合注意的地方 ............................................................................................................................. - 2 -1.在同一个电路中不能同时含有触发器和锁存器两种电路单元。

................................................. - 2 -2.在电路中不能出现有反馈的组合逻辑。

......................................................................................... - 2 -3.不能出现用一个触发器的输出作为另一个触发器的时钟。

......................................................... - 2 -4.异步逻辑和模拟电路要单独处理。

................................................................................................. - 2 -5.使用的单元电路没有映射到工艺库中。

自己整理的:学习verilogDHL问题笔记——Quartus常见错误

自己整理的:学习verilogDHL问题笔记——Quartus常见错误

⾃⼰整理的:学习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 DHL问题笔记——Quartus常见错误

学习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状态机学习笔记(verilog)资料

最新FPGA状态机学习笔记(verilog)资料

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块中语句是顺序执行的,因此在需要延时的时候,按相对时间延时。

16位乘法器学习笔记(Verilog语言源程序+仿真程序)

16位乘法器学习笔记(Verilog语言源程序+仿真程序)

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语言基础知识

Verilog语言基础知识
2.常量
在Verilog HDL中,用parameter来定义常量,即用parameter来定义一个标志符,代表一个常量,称为符号常量。其定义格式如下:
parameter 参数名1=表达式,参数名2=表达式,参数名3=表达式……;
例如:
parameter sel=8,code=8'ha3;
//分别定义参数sel为常数8(十进制),参数code为常数a3(十六进制)
Verilog HDL中共有19种数据类型。数据类型是用来表示数字电路中的数据存储和传送单元的。在此介绍4个最基本的数据类型:integer型、parameter型、reg型和wire型。
Verilog HDL中也有常量和变量之分,他们分属以上这些类型。
6.2.1 常量
在程序运行过程中,其值不能被改变的量称为常量。
assign {cout,sum}=ina+inb+cin;//全加
endmodule
【例6.2】一个8位计数器的Verilog HDL源代码
module counter8(out,cout,data,load,cin,clk);
output[7:0]out;
output cout;
input[7:0] data;
6.1.2 Verilog HDL模块的结构
Verilog HDL的基本设计单元是"模块(block)"。一个模块是由两部分组成的,一部分描述接口;另一部分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明,图6.1示出了一个"与-或-非"门电路。
图6.1"与-或-非"电路
该电路表示的逻辑函数可以写为:
6.2.2 变量

Verilog学习笔记--运算符与阻塞非阻塞语句

Verilog学习笔记--运算符与阻塞非阻塞语句

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语言(基础语法篇)

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页。

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

运算符、赋值语句和结构说明语句
逻辑运算符:

&& 逻辑与 || 逻辑或 !逻辑非
&& || 优先级低于关系运算符 !优先级高于算术运算符 关系运算符优先级低于算术运算符
等式运算符:
== 等于
!== 不等于 ==== 等于 !== 不等于
移位运算符: 0 填充补移出的空位
移位的位数变化:
eg;4'b1001 << 1 = 5'b10010 4'b1001 << 2 = 6'b1001000 4'b1001 >> 1 = 4'b0101 4'b1001 >> 2 = 4'b0100 1 << 6 = 32'b1000000 //默认最少是 32 位
顺序块:
每条语句的延迟时间是相对于前一条语句的仿真时间而言
begin
语句 1;
语句 2;
.
.
. 语句 n;
end
//
begin:块名
// 块名即该块的名字,一个标识名,声明语句可以是参数声明
语句、reg、interger、real
块内声明语句
语句 1; 语句 2;
.
.
.
语句 n;
并行块: // 每条语句的延迟时间是相对于程序流程控制进入块内的仿真时间而言,延迟时
assign、时例元件、always 块 是同时执行的,相当于并发运行的,顺序不会影响实现的功能
四种最基本的数据类型:reg、wire、integer、parameter //其他类型; large、medium、scalared、time、small、tri、trio、tril、triand、trior、trireg、vectored、wand、w or
eg:module Decode(A,F); parameter Width = 1,polarity = 1; . . . endmodule module Top; wire[3:0] A4; wire[4:0] A5; wire[15:0] F16; wire[31:0] F32; Decode #(4,0) D1(A4,F16) // Wieth = 4,Polarity = 0 Decode #(5) D1(A4,F16) // Wieth = 5,Polarity = 1
循环语句:
forever repeat
while
for
forever /连续的执行语句
forever 语句 repeat /连续执行一条语句 n 次
repeat(表达式)语句
eg;repeat(size)
begin
if(shif_opb[1])
result = result + shif-opa;
shif_oba = shif_opa << 1; shif_opb = shif_opb >> 1;
模块的结构、数据类型、变量和基本运算符号
module 模块名(口 1,口 2,.....)
引用模块端口: 严格按照端口的顺序来连接:
模块名(连接端口 1 信号名,连接端口 2 信号名,.....); 引用时用'.'符号,标明原模块是定义时规定的端口号:
模块名(.端口 1 名(连接信号 1 名),.端口 2 名(连接信号 2 名)....); eg; mydesign M1(.sin(serialin),.pout(parallel)) sin/pout 是 M1 的 mydesign 的端口, serialin/parallel 是 M1 的端口,是 M1 引用 mydesign 的模块
wire [7:0] b; // 1 个 8 位的 wire 数据 wire [4:1] c,d; //2 个 4 位的 wire 数据
reg: 寄存器数据类型关键字,默认初始值为 x/一位, 通常用来表示 always 模块内的指定信号,通
过行为描述语句表达逻辑关系
always 模块内每一个信号必须定义为 reg 型 reg[n-1:0]/[n:1] 数据名 1,数据名 2,...... reg 数据是一个表达式中的操作数时,它的值被当做无符号值,即正值
对存储器进行地址索引的表达式必须是常数表达式
对于同一数据类型声明。可以同时定义存储器类型和 reg 类型 eg;parameter wordsize = 16, memsize = 256; reg[wordsize - 1:0] mem[memsize - 1],writerreg,readreg;
reg[n-1:0] / reg mema[n-1:0] 不同 eg;reg[wordsize - 1:0] mem[memsize - 1] ,writerreg,readreg; writerreg = 0; / men[3] = 0; //第三个存储单元赋值为 0
运算符:
算术运算符 + - x / % 赋值运算符 = <= 关系运算符 > < >= <= 逻辑运算符 && || !
eg;{4{w}} = {w,w,w,w} / {b,{3{a,b}}} = {b,a,b,a,b,a,b} // 4,3 必须是常数表达式
缩减运算符: 单目运算符,具有与或非运算规则
运算法则:第一步先将操作数的第 1 位与第 2 位进行 与或非 运算,第二步先将操作数的第 2
位与第 3 位进行 与或非 运算,......
eg; reg [3:0] B; reg c;
c = &B;
相当于 c = ((B[0] & B[1]) & B[2] ) & B[3]
优先级别:
! ~ -> * / % -> + - -> >> << -> < <= > >= -> == !== === !=== -> & -> ^ ^~
-> | -> && -> || ?:
defparam 改变另一个模块中的参数 反标注到焖鸡 Verilog 网表上
eg; 'include 'Top.v' 'include 'Block,v' 'include 'Annotate,v'
// 利用这种方法把布线延迟通过布线工具生成的延迟参数文件
module Test; wire W; Top T();
reg[width-1:0] R 变量 1,变量 2.....; wire[width-1:0] W 变量 1,变量 2.....;
assign 后面加一个方程式即可 eg; assign a = b & c # 延时单位时间 eg; #2 延时两个单位时间
always 用来描述组合逻辑和时序逻辑; always @ (posedge clk or posedge clr); //上下列子等价 begin if(clr) q <= 0; else if(en) q <= d; end
casez(表达式) <case 分支> endcase
casex(表达式) <case 分支> endcase
case(sele)
16'b2: reu = 10'd9
16'b3: reu = 10'd3
16'b5: reu = 10'd1 default: reu = 10'd5
endcase
casez 处理不考虑高阻值 z 的比较过程,casex 则将高阻值 z 和不定值 x 都视为不关心的情况
memory: 对 reg 变量建立数组来对储存器建模,可以描述 RAM 存储器、ROM 存储器、reg 文件。数组
中的每一个单元通过一个数组索引进行寻址,没有多维数组。
memory 数据是通过扩展 reg 型数据的地址范围来生成的。 reg[n-1:0] 存储器名[m-1:0]/[m:1] //n 位存储器,m 个存储器 eg;reg[7:0] mema[255:0]
位拼接运算符: 把多个信号的某些位拼接起来进行位操作
{信号 1 的某几位,信号 2 的某几位,信号 3 的某几位,......信号 n 的某几位}
eg;{a,b[3:0],w,3'b101} = {a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
不允许存在没有指明位数的信号
输入口: input[信号位宽-1:0] 端口名 1; 输出口: output[信号位宽-1:0] 端口名 2; 输入/输出端口: inout[信号位宽-1:0] 端口名 3 I/O 说明写在端口声明中:
module module_name(input port1,ouput port2,inout port3);
end
while /执行一条语句直到满足
while(表达式)语句 eg;while(tempreg)
个唯一的存储地址
条件语句、循环语句、块语句和生成语句
if_else
if() if()/else if()/else if()/else else 总与最近的 if 配对
条件语句必须在过程块中使用
0,x,z 为假
case //常用于微处理器的指令译码 case(表达式) <case 分支> endcase
关键词: MD 太多了,不想记!!!!
赋值语句:
非阻塞
不能立即为下面的语句所用,块结束才能完成这次赋值操作,而所赋的变量值是上一次赋 值得到的,时序逻辑电路常用
相关文档
最新文档