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

合集下载

【精品】Verilog语法基础

【精品】Verilog语法基础

• 归约操作符的操作数只有一个。 •对操作数的所有位进行位操作。 •结果只有一位,可以是0, 1, X。
移位操作符
>> << 逻辑右移 逻辑左移
module shift (); 左移先补后移 reg [9: 0] num, num1; 右移先移后补 reg [7: 0] rega, regb; initial rega = 8'b00001100; initial fork #10 num <= rega << 5 ; // num = 01_1000_0000 #10 regb <= rega << 5 ; // regb = 1000_0000 #20 num <= rega >> 3; // num = 00_0000_0001 #20 regb <= rega >> 3 ; // regb = 0000_0001 #30 num <= 10'b11_1111_0000; #40 rega <= num << 2; //rega = 1100_0000 #40 num1 <= num << 2;//num1=11_1100_0000 #50 rega <= num >> 2; //rega = 1111_1100 #50 num1 <= num >> 2;//num1=00_1111_1100 #60 $finish; join endmodule
相等操作符
=
赋值操作符,将等式右边表达式的值拷贝到左边。
注意逻辑等与 case等的差别 2‘b1x==2’b0x 值为0,因为不相等 2‘b1x==2’b1x

Verilog语法入门,初学者必看

Verilog语法入门,初学者必看

Verilog的词法约定1Verilog是大小写相关的,其中的关键字全部为小写。

2空白符由空格、制表符、和换行符组成。

3单行注释以“//”开始,verilog将忽略此处到行尾的内容。

多行注释以“/*”开始,以“*/”结束。

多行注释不允许嵌套4操作符有三种:单目操作符、双目操作符和三目操作符。

5数字声明Verilog中有两种数字生命:指明位数的数字和不指明位数的数字指明位数的数字表示形式:<size>’<base format><number>Size用来指明数字位宽度,只能用十进制整数表示Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H)例如4’b1111 //4位2进制数12’h3ac //12位16进制数不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。

如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。

‘o21 //32位八进制数X值和Z值:不确定值用X表示,高阻用Z值表示。

在八进制数中代表3位,十六进制中代表4位。

12’h12X //这是一个12位16进制数,其中低四位不确定负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。

-6’d3 //一个6位的用二进制补码形式存储的十进制数3,表示负数-6’sd3 //一个6位的带符号算数运算的负数下划线符号和问号:除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。

在这两条语句中,“?”表示不必关心的情况。

12’B1111_0011_1110 // 增强可读性4’b10?? //相当于4’b10zz6字符串是双引号括起来的一个字符队列。

对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。

verilog 基本语法

verilog 基本语法

verilog 基本语法Verilog基本语法Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。

它具有强大的建模能力,能够描述复杂的数字系统,并用于逻辑设计和硬件验证。

本文将介绍Verilog的基本语法,以帮助读者对这种语言有一个基本的了解。

1. 模块声明在Verilog中,所有的设计都是通过模块来实现的。

模块是Verilog 的基本组织单位,类似于其他编程语言中的函数或类。

模块声明由关键字module开头,后面跟着模块的名称和输入输出端口的定义。

例如:module my_module(input a, b, output c);// 模块的主体endmodule2. 端口声明在模块声明中,使用关键字input和output来声明输入和输出端口。

输入端口用于接收信号,输出端口用于输出信号。

端口可以是单个的信号,也可以是信号的数组。

例如:input a, b; // 单个输入端口output c; // 单个输出端口input [7:0] d; // 输入信号的数组3. 信号声明在Verilog中,使用关键字wire、reg、integer等来声明信号。

wire用于声明连续的信号,reg用于声明时序的信号,integer用于声明整数变量。

例如:wire a, b; // 连续信号reg [7:0] c; // 时序信号,有8位integer d; // 整数变量4. 时钟和复位在数字电路中,时钟和复位信号是非常重要的。

在Verilog中,可以使用关键字input来声明时钟和复位信号,并在模块的输入端口中定义。

例如:input clk; // 时钟信号input rst; // 复位信号5. 运算符Verilog支持各种运算符,包括算术运算符、逻辑运算符、位运算符等。

算术运算符用于执行加减乘除等操作,逻辑运算符用于执行与或非等逻辑操作,位运算符用于执行位操作。

例如:a =b + c; // 加法运算d = ~(a & b); // 与运算和非运算6. 控制结构在Verilog中,可以使用if语句、case语句等控制结构来实现条件判断和多路选择。

fpga verilog 语法

fpga verilog 语法

fpga verilog 语法FPGA Verilog语法是一种硬件描述语言,用于编写逻辑电路描述、控制器和组合逻辑。

以下是一些FPGA Verilog语法的基本元素:1. 模块定义:module 模块名(输入端口1, 输入端口2, ..., 输出端口1, 输出端口2, ...) ;// 模块内部逻辑endmodule2. 端口定义:input [位宽-1:0] 输入端口名1, 输入端口名2, ... ;output [位宽-1:0] 输出端口名1, 输出端口名2, ... ;inout [位宽-1:0] 双向端口名1, 双向端口名2, ... ;3. 信号定义:reg [位宽-1:0] 寄存器名1, 寄存器名2, ... ; // 时序逻辑wire [位宽-1:0] 信号名1, 信号名2, ... ; // 组合逻辑4. 复位信号:reg 复位信号名;always @(posedge 时钟信号 or negedge 复位信号名)if (!复位信号名) begin// 复位时的操作endelse begin// 正常时的操作end5. 组合逻辑:assign 信号名 = 表达式;6. 时序逻辑:always @(posedge 时钟信号)// 时钟上升沿触发的操作7. 选择结构:if (条件1) begin// 条件1满足时的操作endelse if (条件2) begin// 条件2满足时的操作endelse begin// 以上条件都不满足时的操作end8. 循环结构:for (初始条件; 终止条件; 步长) begin // 循环体内操作end这些是FPGA Verilog语法的一些基本元素,可以通过使用这些语法结构来描述和实现各种基本的硬件逻辑。

Verilog基础语法总结

Verilog基础语法总结

Verilog基础语法总结去年⼩学期写的,push到博客上好了Verilog 的基本声明类型wire w1; // 线路类型reg [-3:4] r1; // ⼋位寄存器integer mem[0:2047]; // 2048 个整数的阵列reg [31:0] cache[0:63]; // 32 位数据的64个存储单元//通常称为内存或记忆体//更多阵列类型的声明reg [7:0] array [0:1023];reg [7:0] array [0:1023][0:511];module⾥的声明类型parameter 参数声明port 脚位声明基本语法`define 常数名数字//定义⼀个宏常量,引⽤⽅法是:`常数名//其中数字的格式为:x’(b/h/d)x位数//b是⼆进制,h是16进制,d是10进制#10 <item>//经过10个时延单位执⾏后⾯的程式`timescale 1ns/10ns//定义时延单位`include”<name>.v”//将⼯作⽬录下的该⽂件的内容扩充到本⽂件中//注意是⼯作⽬录,include其他路径下的⽂件是不⾏的module <模组名>(参数列表);endmodule//声明⼀个模块assign//主要⽤来描述组合逻辑//与always语句块相⽐较不必强制使等号左边的数必须为寄存器类型//等号左边可以是wire或reg或output//两种 Assign :Blocking v.s. Nonblocking//a = b ; // Blocking assignment : 执⾏顺序不⼀定,//a <= b; // Nonblocking assignment : 所有可同时执⾏的东西都执⾏完⼀次后,才会前进到下//⼀个时间点。

Always//声明⼀个语句块//⽤法⼀ always #时延语句//⽤法⼆ always @(posedge clk)//当clk信号处于上升沿的时候要执⾏的语句块//这⾥posedge代表信号的上升沿//negedge代表信号的下降沿举例说明阻塞式赋值(Blocking)与⾮阻塞式(Non-Blocking)赋值的区别下⾯是阻塞式赋值的例⼦reg d1, d2, d3, d4;always @(posedge clk) d2 = d1;always @(posedge clk) d3 = d2;always @(posedge clk) d4 = d3;由于这是⼀门硬件描述语⾔,语句的声明顺序与执⾏顺序⽆关,这样的写法我们是⽆法得知这三条语句的执⾏顺序的,所以,d2,d3,d4的结果都将是不固定的下⾯是⾮阻塞式赋值的例⼦reg d1, d2, d3, d4;always @(posedge clk) d2 <= d1;always @(posedge clk) d3 <= d2;always @(posedge clk) d4 <= d3;因为可以同时执⾏的事件都执⾏完⼀次之后才会执⾏下⼀时间点的事件,所以d2,d3,d4会得到上⼀轮的d1,d2,d3下⾯仍然是⼀个阻塞式赋值的例⼦a = 1;b = a;c = b;执⾏结果相当于a=1,b=1,c=1;下⾯是⼀个⾮阻塞式赋值的例⼦a <= 1;b <= a;c <= b;执⾏结果相当于a=1;b=上⼀轮a的值;c=上⼀轮b的值//initial语句块:常⽤于testbench实时赋值initialbegin// 程序end//当模拟⼀开始会被执⾏//到end会结束系统函数与常量$readmemh("cpu0s.hex", m);将对应的⽂件写到m这个阵列⾥⾯$time是显⽰执⾏时间的常量,其单位是ns$display(“printf的格式控制符”,输出参数列表); $monitor的语法完全类似verilog中所有变量都是全局变量,例如module top;integer myglobalvar;endmodulemodule any;initial $display(top.myglobalvar);Endmodule关于模组内模块的合法性说明module <module name> (<port list>);<declares><module items>endmodule其中的 <module items> 可能是以下类型的语句:1. initial2. always3. assign4. module 实例基本语句说明-分⽀语句1.简易分⽀f = sel ? a : b; // 右邊的任何改變都會引發左邊的重新計算2.IF分⽀if (s == 1'b0)y = 0;elsey = 1;if (select == 1) y = a;else y = b;3.case分⽀case ({a,b})2'b00: t = 1;2'b11: t = 4;default: t = 0;endcasecase (op)2'b00: y = a + b;2'b01: y = a - b;2'b10: y = a ˆ b;default: y = ’hxxxx;endcase4.casez : 将z当做⽆关项处理casez (f)2'b00: y=a+b;2'b01: y=a-b;2'b10: y=a&b;2'b11: y=a^b;default: y=0;Endcase语句说明-循环语句1.forfor (i=0; i<16; i=i+1)m[i] = i;reg [3:0] i, output;for ( i = 0 ; i <= 15 ; i = i + 1 ) begin output = i;#10;End2.whilei=0while (i<16) beginm[i] = i;i = i + 1;endreg [3:0] i, output;i = 0;while (i <= 15) beginend运算式与反运算符运算符:~代表取反位运算,!代表取⾮,^代表异或,+,-合并运算:reg [2:0] a;reg [4:0] b;{a, b} = 8'b10011110 // 此时会把100给a,111110给breg [15:0] c;c = {a, b, {2{a}}, 2'b11} // 此时 c 会是 {a, b, a, a, 11} 衔接后的结果。

FPGA及verilog经典语法总结

FPGA及verilog经典语法总结

2011-10-12 论坛笔记整理第一部分 vhdl程序中的基本问题总结 (1)1.关于端口 (1)2.信号和变量 (1)3.位(矢量)与逻辑(矢量) (2)4.关于进程 (3)(一). 多余时钟的引入 (3)(二). 输出多驱动 (4)5.关于VHDL学习中的几点说明................................................................................................5 第二部分FPGA设计学习经验 (6)1.FPGA学习的一些误区 (6)2.设计方法经验 (9)3.fpga设计的精髓 — 时序设计 (10)(一)总体设计方案和逻辑详细设计方案 (10)(二)如何提高电路工作频率(加约束,流水、切割状态) (11)(三)做逻辑的难点在于系统结构设计和仿真验证 (12)4.设计规范很重要 (13)(一)设计必须文档化 (14)(二)代码规范 (14)(三)ALTERA参考设计准则 (16)第三部分项目经验小结.....................................................................................................................17 经验一...........................................................................................................................................17 经验二 (18)第一部分 vhdl程序中的基本问题总结1. 关于端口VHDL 共定义了 5 种类型的端口,分别是In, Out,Inout, Buffer 及Linkage,实际设计时只会用到前四种。

FPGA的设计基础之Verilog语言

FPGA的设计基础之Verilog语言

FPGA的设计基础之Verilog语言1FPGA的设计基础之Verilog语言硬件描述语言(HDL)是一种用形式化方法来描述数字电路和系统的语言。

数字电路系统的设计者利用这种语言可以从上层到下层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。

然后利用电子设计自动化(以下简称为EDA)工具逐层进行仿真验证,再把其中需要变为具体物理电路的模块组合经由自动综合工具转换到门级电路网表。

接下去再用专用集成电路(ASIC)或现场可编程门阵列(FPGA)自动布局布线工具把网表转换为具体电路布线结构的实现。

硬件描述语言的发展至今已有近三十年的历史,并成功地应用于设计的各个阶段:建模、仿真、验证和综合等。

最近十多年来,用综合工具把可综合风格的HDL模块自动转换为具体电路发展非常迅速,大大地提高了复杂数字系统的设计生产率。

在美国和日本等先进电子工业国,Verilog语言已成为设计数字系统的基础。

Verilog HDL是硬件描述语言的一种,用于数字电子系统设计。

它允许设计者用它来进行各种级别的逻辑设计,可以用它进行数字逻辑系统的仿真验证、时序分析、逻辑综合。

它是目前应用最广泛的一种硬件描述语言。

据有关文献报道,目前在美国使用Verilog HDL进行设计的工程师大约有10多万人,全美国有200多所大学教授用Verilog 硬件描述语言的设计方法。

在我国台湾地区几乎所有著名大学的电子和计算机工程系都讲授Verilog有关的课程。

Verilog HDL是在1983年,由GDA(GateWay Design AutomaTIon)公司的Phil Moorby首创的。

Phil Moorby后来成为Verilog-XL的主要设计者和Cadence公司(Cadence Design System)的第一个合伙人。

在1984-1985年,Moorby设计出了第一个名为Verilog-XL的仿真器,1986年,他对Verilog HDL的发展又作出了另一个巨大贡献:即提出了用于快速门级仿真的XL算法。

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中,实体是描述一个硬件单元的基本描述。

verilog使用基础总结

verilog使用基础总结

verilog使用基础总结FPGA的基本语法:1:定义一个数据的,定义其位宽和和进制,省略位宽默认32位,省略进制默认十进制,数据之间可以添加下划线2:X表示不确定的值,Z为高阻态3:parameter参数类型,可以定义为不变的数据,也可以参数的传递4:定义字符串时通用C语言的部分字符串,如\n,\t等5:变量数据类型主要分为网络类型和寄存器类型。

网络类型不能存储数据,寄存器类型可以存储数据。

(网络类型:wire和tri主要用作连接单元的连线;Supply0对地建模,supply1对电源建模。

Wor和trior实现线或功能;wand和triand实现线与功能;trireg可以存储数值和电容节点的建模;tri0和tri1用于线逻辑的建模)(寄存器类型:reg型为可定义的无符号整数变量;memory是reg型的一个数组;interger型是32位有符号整数变量)6:wire型信号可以用于任何方程式的输入,也可作为assign语句或者实例元件的输出。

Reg型数据常用作表示always模块内的自定信号,常代表触发器。

7:逻辑运算符分为数值的与或非也分为按位运算符。

缩减运算符依次高位和地位实现逻辑运算。

关系运算符两个数据进行关系运算,输出真假和不确定X等式运算符分为逻辑等和严格等。

逻辑等输出01X,将X,Z视为不确定的数;关系等分为01,将X,Z视为两种符号。

位拼接运算符将两个数据的某几位拼接在一起三目运算符相当于if和else,8:赋值语句分为阻塞赋值和非阻塞赋值阻塞赋值也就是说它阻塞了其他赋值语句的执行,只能进行一步一步的执行,a=b非阻塞赋值允许其他verilog语句同时进行操作,a9:verilog中有01XZ四种逻辑值,逻辑值为1则按照真处理,若为0XZ则按假处理,跳过if中的语句。

在if嵌套中,else总是和它最上面的if来匹配。

Case语句中的case和endcase成对出现。

case语句分为case语句,以常量为参考;casez则以高阻态为参考,当有一个Z是,其结果为真;ca***则以高阻态和不确定值为参考,当有一个为Z或X时,结果为真。

verilog基本语法、模块写法

verilog基本语法、模块写法

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

它广泛应用于数字系统的建模、验证和综合,是数字电路设计领域中的重要工具之一。

在Verilog中,模块是最基本的组织单位,模块中包含了电路的功能和行为描述。

本文将介绍Verilog语言的基本语法和模块写法,以帮助读者更好地理解和应用Verilog语言。

一、Verilog基本语法1. 注释在Verilog中,使用双斜杠(//)进行单行注释,使用/* */进行多行注释。

注释可以提高代码的可读性,便于他人理解和维护。

2. 变量声明Verilog中的变量可以分为寄存器变量(reg)和线网(wire)两种类型。

寄存器变量用于存储状态信息,线网用于连接各个逻辑门的输入和输出。

3. 逻辑运算符和位运算符Verilog中包括逻辑运算符(与、或、非等)和位运算符(与、或、异或等),用于对信号进行逻辑和位级操作。

4. 控制语句Verilog支持if-else语句、case语句等控制语句,用于根据不同条件执行不同的操作。

5. 模拟时钟在Verilog中,时钟是电路中的重要部分,通常使用时钟信号来同步各个元件的动作。

时钟可以通过周期性方波信号来模拟,使用$period 函数可以定义时钟的周期。

6. 仿真指令Verilog提供了多种仿真指令,用于初始化信号、设置仿真时间、输出波形图等操作,有助于仿真和调试电路。

二、模块写法1. 模块定义在Verilog中,一个模块包含了一组功能相关的硬件描述,可以看作是一个小型电路的抽象。

模块通过module关键字进行定义,其中包括模块名、输入输出端口声明等信息。

```verilogmodule adder(input wire [3:0] a,input wire [3:0] b,output reg [4:0] c);// 模块内部逻辑描述endmodule```2. 端口声明模块的端口包括输入端口(input)和输出端口(output),可以通过wire和reg进行声明。

Verilog学习笔记基本语法篇(九)········任务和函数

Verilog学习笔记基本语法篇(九)········任务和函数

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。

12_语法篇_Verilog基础语法

12_语法篇_Verilog基础语法
a>b a<b a <= b a>= b a == b a != b
说明
a 大于 b a 小于 b a 大于等于 b a 大于等于 b a 等于 b a 不等于 b
Verilog基础语法 –运算符
逻辑运算符:
符号 ! &&
||
使用方法
说明
!a a && b a || b
a的非,如果a为0,那么a的非是1。 a 与上 b,如果a和b都为1,a&&b结果才为 1,表示真。 a 或上 b,如果a或者b有一个为1,a||b结果 为1,表示真。
下面我们分别对这些运算符进行介绍。
Verilog基础语法 –运算符
算术运算符:
符号 + * / %
使用方法
a+b a-b a*b a/b a%b
说明
a 加上 b a 减去 b a 乘以 b a 除以 b a 模除 b
Verilog基础语法 –运算符
关系运算符:
符号
> < <= >= == !=
使用方法
a^b
将 a 的每个位与 b 相同的位进行异或
Verilog基础语法 –运算符
移位运算符:
符号
<< >>
使用方法
a << b a >> b
说明
将 a 左移 b 位 将 a 右移 b 位
Verilog基础语法 –运算符
拼接运算符:
符号 {}
使用方法 {a,b}
说明
将 a 和 b 拼接起来,作为一个 新信号
Verilog基础语法 –运算符
运算符的优先级:

verilog语法(一)Verilog基础知识

verilog语法(一)Verilog基础知识

verilog语法(⼀)Verilog基础知识本节主要讲解了 Verilog 的基础知识,包括 7 个⼩节,下⾯我们分别给⼤家介绍这 7 个⼩节的内容。

1.Verilog 的逻辑值我们先看下逻辑电路中有四种值,即四种状态:逻辑 0:表⽰低电平,也就是对应我们电路的 GND;逻辑 1:表⽰⾼电平,也就是对应我们电路的 VCC;逻辑 X:表⽰未知,有可能是⾼电平,也有可能是低电平;逻辑 Z:表⽰⾼阻态,外部没有激励信号是⼀个悬空状态。

如下图所⽰:2.Verilog 的标识符定义:标识符(identifier)⽤于定义模块名、端⼝名和信号名等。

Verilog 的标识符可以是任意⼀组字母、数字、$和_(下划线)符号的组合,但标识符的第⼀个字符必须是字母或者下划线。

另外,标识符是区分⼤⼩写的。

以下是标识符的⼏个例⼦:Count,COUNT //与 Count 不同,R56_68,FIVE$;虽然标识符写法很多,但是要简洁、清晰、易懂,推荐写法如下:Count,fifo_wr不建议⼤⼩写混合使⽤,普通内部信号建议全部⼩写,参数定义建议⼤写,另外信号命名最好体现信号的含义。

规范建议:以下是⼀些书写规范的要求:1、⽤有意义的有效的名字如 sum、cpu_addr 等。

2、⽤下划线区分词语组合,如 cpu_addr。

3、采⽤⼀些前缀或后缀,⽐如:时钟采⽤ clk 前缀:clk_50m,clk_cpu;低电平采⽤_n 后缀:enable_n;4、统⼀缩写,如全局复位信号 rst。

5、同⼀信号在不同层次保持⼀致性,如同⼀时钟信号必须在各模块保持⼀致。

6、⾃定义的标识符不能与保留字(关键词)同名。

7、参数统⼀采⽤⼤写,如定义参数使⽤SIZE。

3.Verilog 的数字进制格式Verilog 数字进制格式包括⼆进制、⼋进制、⼗进制和⼗六进制,⼀般常⽤的为⼆进制、⼗进制和⼗六进制。

⼆进制表⽰如下:4’b0101 表⽰ 4 位⼆进制数字 0101;⼗进制表⽰如下:4’d2 表⽰ 4 位⼗进制数字 2(⼆进制 0010);⼗六进制表⽰如下:4’ha 表⽰ 4 位⼗六进制数字 a(⼆进制 1010),⼗六进制的计数⽅式为 0,1,2…9,a,b,c,d,e,f,最⼤计数为 f(f:⼗进制表⽰为 15)。

verilog的基础语法总结

verilog的基础语法总结

verilog的基础语法总结FPGA的设计:1:串并转换,使用寄存器,RAM,复杂的可以用状态机。

2:FPGA的基本语法:1:定义一个数据的,定义其位宽和和进制,省略位宽默认32位,省略进制默认十进制,数据之间可以添加下划线2: X表示不确定的值,Z为高阻态3:parameter参数类型,可以定义为不变的数据,也可以参数的传递4:定义字符串时通用C语言的部分字符串,如\n,\t等5:变量数据类型主要分为网络类型和寄存器类型。

网络类型不能存储数据,寄存器类型可以存储数据。

(网络类型:wire和tri主要用作连接单元的连线;Supply0对地建模,supply1对电源建模。

Wor 和trior实现线或功能;wand和triand实现线与功能;trireg可以存储数值和电容节点的建模;tri0和tri1用于线逻辑的建模)(寄存器类型:reg型为可定义的无符号整数变量;memory是reg型的一个数组;interger型是32位有符号整数变量)6:wire型信号可以用于任何方程式的输入,也可作为assign语句或者实例元件的输出。

Reg型数据常用作表示always模块内的自定信号,常代表触发器。

7:逻辑运算符分为数值的与或非也分为按位运算符。

缩减运算符依次高位和地位实现逻辑运算。

关系运算符两个数据进行关系运算,输出真假和不确定X等式运算符分为逻辑等和严格等。

逻辑等输出01X,将X,Z视为不确定的数;关系等分为01,将X,Z视为两种符号。

位拼接运算符将两个数据的某几位拼接在一起三目运算符相当于if和else,8:赋值语句分为阻塞赋值和非阻塞赋值阻塞赋值也就是说它阻塞了其他赋值语句的执行,只能进行一步一步的执行,a=b 非阻塞赋值允许其他verilog语句同时进行操作,a<=b当使用always时,阻塞赋值来描述组合逻辑,而非阻塞赋值描述时序逻辑。

在一个always 块中不要同时使用阻塞逻辑和非阻塞逻辑9:verilog中有0 1 X Z四种逻辑值,逻辑值为1则按照真处理,若为0 X Z则按假处理,跳过if中的语句。

verilog语法基本知识

verilog语法基本知识

verilog语法基本知识Verilog语法基本知识Verilog是一种硬件描述语言,用于设计数字电路和系统。

它是一种结构化的编程语言,具有高度的抽象性和可重用性。

本文将介绍Verilog 的基本语法知识。

1.模块定义在Verilog中,一个模块是一个独立的实体,可以包含多个输入和输出端口以及内部逻辑。

模块定义的基本形式如下:module module_name(input port_list, output port_list);//内部逻辑endmodule其中,module_name为模块名称,input port_list为输入端口列表,output port_list为输出端口列表。

2.端口定义在模块定义中,可以定义多个输入和输出端口。

每个端口都有一个名称和数据类型。

例如:input clk; //定义一个时钟输入端口output reg [7:0] data_out; //定义一个8位输出端口3.数据类型Verilog支持多种数据类型,包括整数、浮点数、布尔值、向量等。

整数类型可以是有符号或无符号的,并且可以指定位宽。

例如:reg signed [7:0] num1; //有符号8位整数类型reg unsigned [15:0] num2; //无符号16位整数类型浮点数类型包括实数和双精度实数。

例如:real num3; //实数类型realtime num4; //双精度实数类型布尔值类型包括true和false。

例如:wire flag; //布尔值类型向量类型可以表示多位数据,例如:reg [7:0] data_in; //8位向量类型4.运算符Verilog支持多种运算符,包括算术运算符、比较运算符、逻辑运算符等。

算术运算符包括加、减、乘、除等。

例如:a =b + c; //加法运算b = d * e; //乘法运算比较运算符包括等于、不等于、大于、小于等。

例如:if(a == b) begin //判断a是否等于b//执行代码end逻辑运算符包括与、或、非等。

veriloghdl基本语法

veriloghdl基本语法

Verilog HDL(硬件描述语言)是一种用于描述数字电路和硬件设计的语言。

它被广泛用于数字电路设计、FPGA 编程和ASIC 设计等领域。

以下是Verilog HDL的一些基本语法要点:模块声明:Verilog程序通常由一个或多个模块组成。

每个模块的声明以关键字module 开始,后面跟着模块的名称和输入/输出端口的声明。

例如:module MyModule (input wire A,input wire B,output wire Y);// 模块的行为描述endmodule端口声明:端口声明包括输入(input)、输出(output)、双向(inout)端口,以及线(wire)或寄存器(reg)类型的端口。

端口声明通常在模块的参数列表中列出。

线声明:线(wire)用于表示组合逻辑电路中的连接,它们不存储任何状态。

寄存器(reg)用于表示时序逻辑电路中的状态元素,可以存储数据。

例如:wire A, B;reg [7:0] data;组合逻辑:组合逻辑使用assign 语句来描述,它定义了如何从输入信号计算输出信号。

例如:assign Y = A & B; // Y是A和B的逻辑与结果时序逻辑:时序逻辑通常使用always 块来描述。

它表示在时钟信号的边沿或电平触发时执行的操作。

例如:always @(posedge clk) beginif (reset) begindata <= 8'h00;end else begindata <= data + 1;endend条件语句:Verilog使用if、else if 和else 来描述条件分支。

例如:if (condition1) begin// 条件1成立时的操作end else if (condition2) begin// 条件2成立时的操作end else begin// 以上条件都不成立时的操作end模块实例化:你可以在其他模块内部实例化已定义的模块,并连接其输入和输出。

Verilog学习笔记基本语法篇(二)·········运算符

Verilog学习笔记基本语法篇(二)·········运算符

优先顺序!~* / %+ -<< >>< <= > >= == !== === !===&^ ^~|&&||:最⾼优先级别↓↓↓↓最低优先级别Verilog学习笔记基本语法篇(⼆)·········运算符Verilog HDL的语⾔的运算符的范围很⼴,按照其功能⼤概可以分为以下⼏类:(1)算术运算符 +,-,*,/,%(2)赋值运算符=,<=(3)关系运算符> ,<,>=,<=(4)逻辑运算符 &&, ||, !(5)条件运算符?:(6)位运算符~, | , ^ ,& ,^~(7)移位运算符<< ,>>(8)拼接运算符{}(9)其他。

1)基本的算术运算符:加减乘都⽐较简单这⾥不再记录。

在进⾏整数的除法运算时,结果要略去⼩数部分,只取整数部分;⽽进⾏取模运算时(%,亦称作求余运算符)结果的符号位采⽤模运算符中第⼀个操作数的符号。

-10%3 结果 -1 11%-3 结果为2注意:在进⾏算术运算时,如果某⼀个操作数有不确定的值x,则整个结果也为不确定值x。

2)位运算符:按位取反~ 、按位与 & 、按位或 | 、按位异或 ^ 、按位同或 ^~在不同长度的数据进⾏位运算时,系统会⾃动的将两个数右端对齐,位数少的操作数会在相应的⾼位补0,⼀时的两个操作数按位进⾏操作。

3)逻辑运算符:逻辑与 &&、逻辑或 ||、逻辑⾮!其中&&和||是双⽬运算符,其优先级别低于关系运算符,⽽!⾼于算术运算符。

4)关系运算符< 、 > 、 <= 、 >= 如果关系运算是假的,则返回值是0,如果声明的关系是真的,则返回值是1。

关系运算符的优先级别低于算数运算符。

VerilogFPGA入门笔记(源于学习经验积累)

VerilogFPGA入门笔记(源于学习经验积累)

FPGA入门笔记(源于学习经验积累)17.verilog特点:区分大小写,所有关键字都要求小写不是强类型语言,不同类型数据之间可以赋值和运算//是单行注释可以跨行注释描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守可综合原则门级描述使用门级模型或者用户自定义模型UDP来代替具体基本元件,在IDE中针对不同FPGA器件已经有对应的基本元件原语18.verlog语法要点:module endmodule之间由两部分构成:接口描述和逻辑功能描述IO端口种类:input output inout相同位宽的输入输出信号可以一起声明,input[3:0] a,b; 不同位宽的必须分开写内部信号为reg类型,内部信号信号的状态:0 1 x z,3'bx1=3'bxx1 x/z会往左扩展3'b1=3'b001 数字不往左扩展逻辑功能描述中常用assign描述组合逻辑电路,always既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用方法描述逻辑功能always之间、assign之间、实例引用之间以及它们之间都是并行执行,always内部是顺序执行常量格式:<+/-><二进制位宽><'><进制><该进制的数值>:默认进制为10进制默认位宽为32位位宽是从二进制宽度角度而言的由位宽决定从低位截取二进制数2'hFF=2'b11,通常由被赋值的reg变量位宽决定parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义变量种类:wire reg memoryIO信号默认为wire类型,除非指定为reg类型wire可以用作任何输入输出端口wire包括input output inoutwire不带寄存功能assign赋值语句中,被赋值的信号都是wire类型assign之所以称为连续赋值,是因为不断检测表达式的变化reg类型可以被赋值后再使用,而不是向wire一样只能输出,类似VHDL中的buffer端口reg类型变量初始值为x (VHDL中初始值为本类型最小值,通常是0)always模块里被赋值的信号都必须定义为reg类型,因为always可以反复执行,而reg表示信号的寄存,可以保留上次执行的值reg类型变量与integer变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer是有符号数verilog中所有内部信号都是静态变量,因为它们的值都在reg中存储起来了memory型只有一维数组,由reg型变量组成memory初始化只能按地址赋值,不能一次性赋值1*256的memory写法:reg mema[255:0] mema[3]=0;不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取A[a:b] 无论a b谁大,a总是实际电路的信号高位,b总是实际电路的信号低位算术运算中如果有X值则结果为Xfor循环中的变量另外定义成integer,因为它不是实际信号,有正负;reg则以无符号数存在== 和!=只比较0、1,遇到z或x时结果都为x (x在if中算做假条件),结果可能是1、0、x===和!==比较更加苛刻,包括x和z的精确比较,结果可能是0、1&&的结果只有1'b1或1'b0两种,A&A的结果位宽则是与A相同的{1,0}为64'h100000000,所以拼接运算中各信号一定要指定位宽移位运算左移将保留4'b1000<<1等于5'b10000,右移则舍弃4'b0011等于4'b0001数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算非阻塞式赋值<=与阻塞式赋值=阻塞:在同一个always过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语句被该赋值语句阻塞非阻塞:在同一个always过程中,非阻塞赋值语句是同时进行的,排在后面的语句不会被该赋值语句阻塞<=:块结束后才能完成赋值块内所有<=语句在always块结束时刻同时赋值<=右边各变量的值是上一次时钟边沿时,这些变量当时的值用于描述可综合的时序电路=:=语句结束之后过程always才可能结束在always过程中,begin end块内按先后顺序立即赋值,在fork join内同时赋值(可能造成冲突)与assign连用描述组合电路begin end中阻塞的含义:begin ...@(A) B=C...; end 如果A事件不发生则永远不能执行下去,被阻塞了由于时钟的延时(往往在ps级),多个always(posedge)之间究竟谁先执行是个未知数使用原则:同一个always过程块内建立时序电路用<=纯组合逻辑电路用=,生成的电路结构最简单,执行速度最快同一个always块内不要混用<=和=不要在多个always块内对同一个变量赋值(多源驱动)if else的三种形式,第三种形式适合描述优先编码器if条件中0/x/z当成假,1当成真,非0的数值也当成真case语句的三种:case(四种状态的比较) casez(忽略z) casex(忽略x和z,只看哪些位的信号有用)case语句中所有表达式值的位宽必须相等,default中不能将n'bx用'bx代替避免生成锁存器的方法:电平触发时if后加else case中加default ?使用casex会将不必要的状态视为无关项,使得综合出来的电路最简单两种特殊的括号:begin 顺序语句... end fork 并行语句... join,其差别在于块内语句的起止时间、执行顺序、相对延时块被命名后,其内部变量可以被调用,因为变量都是静态的(调用信号:对应电路中的一个信号线被引到另一处)initial块只无条件执行一次always块在满足条件时不断执行initial常用来写测试文件,always块常用来写电路描述always既可以描述组合逻辑电路又可以描述时序逻辑电路always如果后面有敏感信号列表则不能用wait语句always既可以描述电平触发又可以描述边沿触发,wait只能描述电平触发assign常用于描述组合逻辑电路测试文件中一般都是现initial 后always生成语句:生成快的本质是使用循环内的一条语句代替多条重复的verilog语句,简化了用户的编程genvar用于声明生成变量,生成变量只能用在生成快之间仿真时,仿真器会将生成块中的代码展平,在确立后的方针代码中,生成变量是不存在的最好是先想象出来循环生成语句被展平后的电路样子,再写相关的描述语句task和function的区别:task可以定义自己的仿真时间单位,function与主模块共用同一个仿真时间单位函数不能启动任务,任务能够启动函数函数至少要有一个输入变量,任务没有输入变量函数返回一个值,任务不返回值一个模块的设计包括3个部分:电路模块的设计测试模块的设计设计文档的编写设计者通过布局布线工具生成具有布线延迟的电路,再进行后仿真,得到时序分析报告从时序分析报告中可以知道电路的实际延迟t,同步电路内每个时钟周期要大于t,从而可确定该运算逻辑的最高频率综合器之所以能够实现加法器、乘法器是因为库中已经存在可配置的参数化器件模型FPGA内总线宽度容易自定义,以便实现高速数据流,三态数据总线相当于数据流的控制阀门数字系统内数据流的控制:开关(或三态数据总线)、数据暂存部件(寄存器)、同步状态机控制(整个系统在一个时钟域内)流水线操作pipe line:K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组,上一级的输出是下一级的输入流水线操作获得第一个结果的时间要比不用流水线操作的时间长,但以后结果获得时间都只需要一个时钟周期,提高了数据吞吐量流水线操作的保证:Tclk>K*(组合逻辑延迟+触发器的建立保持时间/触发时间),即时间片段要长于最大路径延迟体现了面积换速度的思想,在综合时考虑的是以面积小为主还是以速度为主本质上是一种同步逻辑同步时序逻辑和异步时序逻辑:同步时序逻辑指所有寄存器组由唯一时钟触发always@(posedge clk) 或always@(negedage clk)异步时序逻辑指触发条件不唯一,任意一个条件都会引起触发always@(posedge clk or posedage reset)目前的综合器是以同步时序逻辑综合的,因为同步时序逻辑较异步时序逻辑可靠严格的同步要求时钟信号传递速度远远大于各部分的延迟,实际中clk要单独用线,而不要经过反相器等部件always @(posedge.. ) begin ...<=... end 表示同步时序逻辑(同时刻赋值)不同速率数据接口的处理方法(异步数据的处理方法):帧同步FIFO 双端口RAM同步状态机:包括moore和mealy型两种,及其反馈模型(是一种反馈控制系统,当前状态就是其内部状态变量)状态机的开发步骤:根据实际问题列出输入输出变量和状态数画出状态图并化简写出状态转移真值表得到逻辑表达式用D触发器或JK触发器构建电路(目前用D触发器多)verilog描述时只需要得到简化的状态图就可以描述状态编码方式:独热码格雷码状态机主体程序有单always描述方式和多always描述方式采用case/casez/casex建立模型最好,因为x是无关态,生成的电路最简单default: state='bx与实际情况更一致,效果等同于default: state<=idle只有同步状态机才能被目前的综合for语句会将所有变量的情况展开,占用巨量逻辑资源,替代办法是用计数器和case语句说明所有情况有优先级的if else结构会消耗更多资源,建议用无优先级的case替代模块的复用往往比代码上修改节省的资源多PLL的分频、倍频、移相操作会增加设计精度同步时序电路的延时:#x通常用于仿真测试,实际硬件延时是:长延迟用计数器,小延迟用D触发器,此方法用来取代延迟链同步电路中,稳定的数据采用必须满足采样寄存器的建立和保持时间reg类型在always中不一定综合成时序电路,也可能是组合逻辑电路乒乓操作与作用异步时钟域同步问题延迟包括门延迟和线延迟组合逻辑产生的时钟仅能应用在时钟频率较低、精度要求不高的情况下增减敏感信号得到的结果一样补充部分:verilog HDL起初是作为写testbench而产生的verilog 有1995进入IEEE标准,为IEEE-1364, 于2001年进行了扩展,为IEEE 1364-2001;verilog AMS可用于模拟电路和数字电路的综合,目前正在不断发展和完善中;verilog的标识符区分大小写,关键字使用小写;用\\来进行单行注释,用\* *\来进行跨行注释;标识符由字母、数字、下划线构成,并以字母开头;关键字又叫保留字,只有小写的关键字才是保留字;信号的状态有4种:0 1 x zx和z在描述电路时不区分大小写,在仿真时大小写有不同意义;常量表达式中:x z不区分大小写;进制符号h o d b与H O D B不区分大小写;十六进制中a~f不区分大小写;下划线_用于提高可读性;?在数中可以代替z;x和z的左端补位;字符和字符串都以ASICII码形式存在,也可以当成电路内的信号;字符串必须包含在同一行,不能分成多行书写;如果表达式或者赋值语句中将字符串当成操作数,则字符串中的每个字符都被看成8位的ASCII值序列;可综合的信号类型:wire reg memory 它们用来描述数字电路不可综合的数据类型:integer real 它们只用仿真,位于testbench中wire是连线的抽象模型,不能保存数据,其值由驱动元的值决定;wire不能用在always或initial块中;wire的默认值为高阻z;wire的使用情形: 1.作为模块的输出端口2.用连续赋值语句assign赋值;reg是1位寄存器(触发器)的抽象模型,可以保存数据;reg必须用在always或initial块中;reg的默认值为x;reg的使用情形:1.阻塞赋值<= 2.非阻塞赋值=memory只能是一维的;memory只能对每个单元分别初始化,方法:1.一个一个赋值2. 通过系统任务$readmem赋值reg[3:0] fc;//一个4位寄存器reg fc[3:0] //4个一位寄存器parameter的作用:仿真开始以前对其进行赋值,整个仿真过程中保持其值不变;关系运算符将以逻辑1或逻辑0返回比较的结果;== !=的返回值有0 1 x三种情况,=== !==的返回值只有0 1两种情况;verilog由于是描述电路的,用于位的操作较多,有: 位逻辑操作,移位操作,并置操作,归约操作;位逻辑运算的结果中,位数与原操作数一样多;归约符是在原操作数的所有位上进行操作,并产生1位结果;并置运算可以发生在bit与bit之间bit与矢量之间矢量与矢量之间用于仿真的系统任务:所有系统任务都必须在initial或always内;所有系统任务都必须以$开头;常见系统任务:显示任务($diplay系列和$write系列)监控任务($monitor系列)探测任务($strobe系列)文件打开、输入、关闭任务(&fopen &fclose &fdisplay...)读取文件任务($readmemb $readmemh)仿真结束控制任务($finish $stop)随即信号任务($random)过程块:initial块和always块一个module内可以包含多个initial或always模块;所有initial或always块在0时刻开始并行执行,各initial或always块内部顺序执行;initial过程块主要是面向testbench的,通常不具有可综合性;always过程块在描述电路时既可以描述组合逻辑电路(电平敏感)又可以描述时序逻辑电路(边沿敏感);写testbench时initial通常用于初始化以及顺序波形的描述,always通常用于重复波形的描述;任务task与函数function: 为了描述模块中被多次执行的部分以及为了增强代码的易读性verilog中的高级程序语句如for循环语句只用在写testbench中;begin end和fork join是两种特殊的括号if语句的第三种形式适合描述优先编码器,case语句适合描述数据选择器和状态机;case的条件表达式如果与分支项表达式长度不同,则在比较前将所有表达式都统一为这些表达式的最长长度;casez忽略z,casex忽略z和x;assign语句只在右端表达式发生变化时才重新计算并重新赋值,其余时间都是连续赋值;assign语句可以指定bit、vector或是任意拼接操作的结果;assign语句是连续赋值的,用于驱动网线wire,reg类型不需要连续赋值,reg 类型一旦被赋值就会一直保存;过程赋值语句有两种:阻塞式=和非阻塞式<=,只能在过程块initial和always中使用;@对事件触发的控制与wait语句不能同时使用;FPGA学习心得(二)V erilog的两个误区:使用Reg类型还是Net类型:Reg类型只在过程块中被赋值;而Net类型则在过程块外面被赋值或者驱动. 阻塞赋值和非阻塞赋值:V erilog中竞争发生的条件:两个或多个语句在执行顺序不同时导致不同的结果,则存在竞争.Nonblocking不是一个类型;Blocking赋值是一个单步过程,计算RHS,并更形LHS是不可中断的.七条准则:1.时序逻辑和锁存器,使用非阻塞赋值2.always块中的组合逻辑,使用阻塞赋值3.同一always块,时序组合混合逻辑使用非阻塞赋值4.通常情况下,在同一always块中不要混合使用阻塞与非阻塞赋值5.不要在多个always块中对同一变量进行赋值6.使用$strobe显示非阻塞赋值得信号7.不要用#0的过程赋值V erilog中的分层事件队列:活动事件:阻塞赋值;计算非阻塞赋值的RHS;连续赋值;$display命令;计算输入并改变原语的输出.这些事件可能按照任意次序调度.非活动事件:#0的阻塞赋值非阻塞事件:更新非阻塞赋值的LHS监视事件:$monitor命令;$strobe命令经验:在always块中使用非阻塞赋值来产生时序逻辑和锁存器在always块中使用阻塞赋值来产生组合逻辑在always块中使用非阻塞赋值来产生同一块中的时序和组合逻辑在纯组合逻辑中使用非阻塞赋值可能会导致功能错误阻塞赋值和非阻塞赋值混合使用的方式:将组合逻辑赋值通过时序表达式表示或者将组合逻辑赋值与时序逻辑分开,在独立的语句块中描述不推荐在同一always块中混合使用阻塞和非阻塞赋值几个关于非阻塞赋值的错误理解:错误1:无法使用$display命令显示非阻塞赋值变量正解:非阻塞赋值变量的更新在所有$display命令之后错误2:#0让一个赋值在每个时间步的最后执行正解:#0只会让赋值语句进入非活动事件队列错误3:在同一always块中对同一变量进行多次非阻塞赋值是不允许的正解:在IEEE 1364 verilog标准中定义了上述赋值,最后一个非阻塞赋值起作用模拟开始时候的困难:不同的模拟器,不同的模拟选项导致开始模拟时现象不同建议: 在0时刻通过非阻塞赋值设置reset信号;第一个半周期设置clock为0编写V erilog代码的一些经验:V erilog文件名和模块名相同不要在可综合代码中使用casex语句当在可综合代码中使用casez语句时要小心当写case语句时,对存在不关心的cases时使用casez,使用?代替Z来表示不关心的casesV erilog编写状态机相关:状态机分类:Moore(输出只与当前状态相关)和Mealy(输出与当前状态和输入相关)二进制编码和One-Hot编码状态机的基本块:下一状态度组合逻辑;时钟同步的当前状态逻辑;输出组合逻辑两个always块写状态机,使用三个always块,如果输出需要寄存使用高效的One-Hot状态编码,组合输出经验:每个状态机作为一个独立的V erilog模块对状态进行预定义,状态赋值使用状态名作参数,不要使用`define,多使用parameter两个always语句块的状态机,一个always用来描述状态向量寄存器的时序逻辑.一个用来描述下一状态度组合逻辑.组合输出可以通过连续赋值语句或者在下一状态度组合always块中描述.verilog语法规则1.V erilog分以下四个层次:l 低阶交换模型:电路由开关与储存点所组成l 逻辑间层次描述:用and ,or, buf , not 等l 资料处理模型或暂存器转移层次:用于说明资料如何在暂存器中储存与传送。

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

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

相关文档
最新文档