Verilog 教程
文章平均质量分 84
Verilog HDL(简称 Verilog )是一种硬件描述语言,用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。
二当家的素材网
美好的人眼里映出的世界也是美好的~
展开
-
5.1 Verilog 模块与端口
模块内部有可选的 5 部分组成,分别是变量声明,数据流语句,行为级语句,低层模块例化及任务和函数,如下图表示。input、inout 类型不能声明为 reg 数据类型,因为 reg 类型是用于保存数值的,而输入端口只能反映与其相连的外部信号的变化,不能保存这些信号的值。模块名,端口信号,端口声明和可选的参数声明等,出现在设计使用的 Verilog 语句(图中 Declarations_and_Statements)之前。对于外部环境来说,模块内部是不可见的,对模块的调用只能通过端口连接进行。原创 2024-02-23 10:30:45 · 927 阅读 · 0 评论 -
4.8 Verilog过程连续赋值
与过程赋值不同的是,过程连续赋值表达式能被连续的驱动到wire 或 reg 类型变量中,即过程连续赋值发生作用时,右端表达式中任意操作数的变化都会引起过程连续赋值语句的重新执行。释放时(120ns), cnt_temp 为寄存器类型,仍然保持原有值不变,直到时钟上升沿由此进行加法赋值操作,值才等于 7。由图可知,在 cnt_temp 等于 4 时(80ns), cnt_temp 被强制赋值为 6,cout 被强制赋值为 1。分配过程中对分配的连续分配,分配过程中的值被保留直到被重新分配。原创 2024-02-23 10:23:22 · 843 阅读 · 0 评论 -
4.7 Verilog 循环语句
下面 for 循环的例子,实现了与 while 循环中例子一样的效果。Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。一般来说,因为初始条件和自加操作等过程都已经包含在 for 循环中,所以 for 循环写法比 while 更为紧凑,但也不是所有的情况下都能使用 for 循环来代替 while 循环。forever 语句表示永久循环,不包含任何条件表达式,一旦执行便无限的执行下去,系统函数 $finish 可退出 forever。原创 2024-02-22 11:24:38 · 753 阅读 · 0 评论 -
4.6 Verilog 多路分支语句
但是 case 语句中的 x 或 z 的比较逻辑是不可综合的,所以一般不建议在 case 语句中使用 x 或 z 作为比较值。case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不方便的问题。当多个条件选项下需要执行相同的语句时,多个条件选项可以用逗号分开,放在同一个语句块的候选项中。default 语句是可选的,且在一个 case 语句中不能有多个 default 语句。casex、 casez 语句是 case 语句的变形,用来表示条件选项中的无关项。一章,两者完全一致。原创 2024-02-22 11:16:41 · 497 阅读 · 0 评论 -
4.5 Verilog 条件语句
事例中 if 条件每次执行的语句只有一条,没有使用 begin 与 end 关键字。但如果是 if-if-else 的形式,即便执行语句只有一条,不使用 begin 与 end 关键字也会引起歧义。当然,编译器一般按照就近原则,使 else 与最近的一个 if(例子中第二个 if)相对应。例如下面代码,虽然格式上加以区分,但是 else 对应哪一个 if 条件,是有歧义的。条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号中。条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。原创 2024-02-20 18:59:54 · 597 阅读 · 0 评论 -
4.4 Verilog 语句块
因为 always 块和 forever 块是一直执行的,此时的 disable 有点类似 C 语言中的 continue 功能。而并行块中最长的执行时间为 15ns,所以顺序块中的信号 bi_sequen2 在 35ns 时被赋值。而并行块,ai_paral 与 bi_paral 的赋值是同时执行的,所以均在 5ns 时被赋值。在本节之前的仿真中,initial 块中的阻塞赋值,都是顺序块的实例。并行块中每条语句的时延都是与块语句开始执行的时间相关。并行块中的语句是并行执行的,即便是阻塞形式的赋值。原创 2024-02-20 18:56:44 · 751 阅读 · 0 评论 -
4.3 Verilog 时序控制
当多个信号或事件中任意一个发生变化都能够触发语句的执行时,Verilog 中使用"或"表达式来描述这种情况,用关键字 or 连接多个事件或信号。关键字 posedge 指信号发生边沿正向跳变,negedge 指信号发生负向边沿跳变,未指明跳变方向时,则 2 种情况的边沿变化都会触发相关事件。此时,更为简洁的写法是 @* 或 @(*),表示对语句块中的所有输入变量的变化都是敏感的。前面所讨论的事件控制都是需要等待信号值的变化或事件的触发,使用 @+敏感列表 的方式来表示的。原创 2024-02-20 18:52:48 · 665 阅读 · 0 评论 -
4.2 Verilog 过程赋值
如下所示,2 个 always 块中语句并行执行,赋值操作右端操作数使用的是上一个时钟周期的旧值,此时 a原创 2024-02-09 20:43:54 · 791 阅读 · 0 评论 -
4.1 Verilog 过程结构
与 initial 语句相反,always 语句是重复执行的。当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。每个 initial 语句或 always 语句都会产生一个独立的控制流,执行时间都是从 0 时刻开始。initial 语句从 0 时刻开始执行,只执行一次,多个 initial 块之间是相互独立的。信号 ai,bi 的值按照赋值顺序依次改变,所以 initial 内部语句也可以看做是顺序执行。由于循环执行的特点,always 语句多用于仿真时钟的产生,信号行为的检测等。原创 2024-02-09 20:40:42 · 299 阅读 · 0 评论 -
3.2 Verilog 时延
在上述例子中,A 或 B 任意一个变量发生变化,那么在 Z 得到新的值之前,会有 10 个时间单位的时延。如果在这 10 个时间单位内,即在 Z 获取新的值之前,A 或 B 任意一个值又发生了变化,那么计算 Z 的新值时会取 A 或 B 当前的新值。由于信号 ai 第二个高电平持续时间小于 20ns,so_lose 信号会因惯性时延而漏掉对这个脉冲的延时检测,所以后半段 so_lose 信号仍然为 0。由于所有的时延均大于 5ns,所以信号 so_get 的结果为与操作后再延迟 5ns 的结果。原创 2024-02-08 20:31:40 · 394 阅读 · 0 评论 -
3.1 Verilog 连续赋值
Verilog 还提供了另一种对 wire 型赋值的简单方法,即在 wire 型变量声明的时候同时对其赋值。例如下面赋值方式和上面的赋值例子的赋值方式,效果都是一致的。LHS(left hand side) 指赋值操作的左侧,RHS(right hand side)指赋值操作的右侧。设 Ai,Bi,Ci 分别为被加数、加数和相邻低位的进位数,So, Co 分别为本位和与向相邻高位的进位数。连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。原创 2024-02-08 20:29:26 · 1625 阅读 · 0 评论 -
2.5 Verilog 编译指令
以反引号 ` 开始的某些标识符是 Verilog 系统编译指令。编译指令为 Verilog 代码的撰写、编译、调试等提供了极大的便利。下面介绍下完整的 8 种编译指令,其中前 4 种使用频率较高。在编译阶段,`define 用于文本替换,类似于 C 语言中的。一旦 `define 指令被编译,其在整个编译过程中都会有效。则在另一个文件中也可以直接使用 DATA_DW。这些属于条件编译指令。例如下面的例子中,如果定义了 MCU51,则使用第一种参数说明;原创 2024-02-07 21:10:59 · 949 阅读 · 0 评论 -
2.4 Verilog 表达式
对变量进行声明时,要根据变量的操作符对变量的位宽进行合理声明,不要让结果溢出。全等比较时,如果按位比较有相同的 x 或 z,返回结果也可以为 1,即全等比较可比较 x 或 z。归约操作符包括:归约与(&),归约与非(~&),归约或(|),归约或非(~|),归约异或(^),归约同或(~^)。双目操作符对 2 个操作数进行算术运算,包括乘(*)、除(/)、加(+)、减(-)、求幂(**)、取模(%)。拼接操作符用大括号 {,} 来表示,用于将多个操作数(向量)拼接成新的操作数(向量),信号间用逗号隔开。原创 2024-02-07 21:03:44 · 1059 阅读 · 0 评论 -
2.3 Verilog 数据类型
Verilog 最常用的 2 种数据类型就是线网(wire)与寄存器(reg),其余类型可以理解为这两种数据类型的扩展或辅助。原创 2024-02-06 14:13:12 · 1100 阅读 · 0 评论 -
2.2 Verilog 数值表示
例如,为存储字符串 "www.runoob.com", 需要 14*8bit 的存储单元。例如一个 pad 的 input 呈现高阻状态时,其逻辑值和上下拉的状态有关系。数字声明时,合法的基数格式有 4 中,包括:十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。-15 在 5 位二进制中的形式为 5'b10001, 在 6 位二进制中的形式为 6'b11_0001。x 意味着信号数值的不确定,即在实际电路里,信号可能为 1,也可能为 0。原创 2024-02-06 14:06:56 · 295 阅读 · 0 评论 -
2.1 Verilog 基础语法
标识符(identifier)可以是任意一组字母、数字、$ 符号和 _(下划线)符号的合,但标识符的第一个字符必须是字母或者下划线,不能以数字或者美元符开始。每个语句必须以分号为结束符。空白符(换行、制表、空格)都没有实际的意义,在编译阶段可忽略。例如下面两中编程方式都是等效的。关键字是 Verilog 中预留的用于定义语言结构的特殊标识符。格式自由,可以在一行内编写,也可跨多行编写。Verilog 中关键字全部为小写。Verilog 是区分大小写的。另外,标识符是区分大小写的。原创 2024-02-06 14:04:05 · 535 阅读 · 0 评论 -
1.4 Verilog 设计方法
这样,可以把一个较大的系统,细化成多个小系统,从时间、工作量上分配给更多的人员去设计,从而提高了设计速度,缩短了开发周期。这样的过程可能反复多次,直至错误完全排除。逻辑综合的目的是产生物理电路门级结构,并在逻辑、时序上进行一定程度的优化,寻求逻辑、面积、功耗的平衡,增强电路的可测试性。正确地分析了用户的电路需求后,就可以进行逻辑功能的总体设计,设计整个电路的功能、接口和总体结构,考虑功能模块的划分和设计思路,各子模块的接口和时序(包括接口时序和内部信号的时序)等,向项目组成员合理分配子模块设计任务。原创 2024-02-06 14:02:08 · 508 阅读 · 0 评论 -
1.3 Verilog 环境搭建详解教程
记忆中,Quartus II + Modelsim 的联合仿真功能既强大,又安装方便。几年后重新进行此过程,发现步骤也有些许繁琐,花费了我一晚上的时间来搞定。很多细节也在上面提出,多多注意就好。不过,大家以后有机会进行大型的数字模块仿真时,就会发现此方法的有效性。在接下来的教程里,有些简单的仿真可能用其他软件进行,截图界面可能与 Modelsim 不一致。大家看到后不用怀疑仿真的准确性,这里特别说明。设计模块与 testbench 源码也会全部给出,大家完全可以自己仿真、验证。原创 2024-02-06 14:01:27 · 1656 阅读 · 0 评论 -
1.2 Verilog 简介及发展历史
Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。因此,在简化硬件设计任务、提高设计效率与可靠性、语言易读性、层次化和结构化设计等方面展现了强大的生命力与潜力。原创 2024-02-06 13:58:05 · 1742 阅读 · 0 评论 -
1.1 Verilog 教程
Verilog HDL(简称 Verilog )是一种硬件描述语言,用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。Verilog 继承了 C 语言的多种操作符和结构,与另一种硬件描述语言 VHDL 相比,语法不是很严格,代码更加简洁,更容易上手。Verilog 不仅定义了语法,还对语法结构都定义了清晰的仿真语义。因此,Verilog 编写的数字模型就能够使用 Verilog 仿真器进行验证。原创 2024-02-06 13:57:12 · 726 阅读 · 0 评论