Learning Path
浏览 开发笔记 相关教程与章节。
社区笔记、经验文章、测验题库与零散教程入口。
教程
1237
关键词:函数,大小端转换,数码管译码 在 Verilog 中,可以利用任务(关键字为 task)或函数(关键字为 function),将重复性的行为级设计进行提取,并在多个地方调用,来避免重复代码的多次编写,使代码更加的简洁、易懂。 函数 函数只能在模块中定义,位置任意,并在模块的任何地方引用,作用范围也局限于此模块。函数主要有以下几个特点: 1)不含有任何延迟、时序或时序控制逻辑 2)至少有一个输入变量 3)只有一个返回值,且没有输..
关键字:例化,generate,全加器,层次访问 在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化。模块例化建立了描述的层次。信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则。 命名端口连接 这种方法将需要例化的模块端口与外部信号按照其名字进行连接,端口顺序随意,可以与引用 module 的声明端口顺序不一致,只要保证端口名字与外部信号匹配即可。 下面是例化一次 1bit 全加器的例子: 实例 [mycode4..
学习 Verilog 做仿真时,可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartus II;ASIC 开发环境有 Synopsys 公司的 VCS ;很多人也在用 Icarus Verilog 和 GTKwave 的方法,更加的轻便。 虽然 ISE 或者 Quartus II 都会自带仿真器,但功能还是有欠缺。所以,这里介绍下 Quartus II + Mo..
Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。因此,在简化硬件设计任务、提高设计效率与可靠性、语言易读性、层次化和结构化设计等方面展现了强大的生命力与潜力。 发展历史 1983 年,Verilog 最初由 Gateway Design Automation 公司(GDA)的 Phil Moorby 创建,作为内部仿真器的语言,主要用于逻辑建模和仿真验证,被广泛使用。 1989 年,GDA 公司..
关键词:触发器,锁存器 Latch 的含义 锁存器(Latch),是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值。仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。 当电平信号无效时,输出信号随输入信号变化,就像通过了缓冲器;当电平有效时,输出信号被锁存。激励信号的任何变化,都将直接引起锁存器输出状态的改变,很有可能会因为瞬态特性不稳定而产生振荡现象。 锁存器示意图如下: 触发器(flip-flop)..
关键词:while, for, repeat, forever Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。 while 循环 while 循环语法格式如下: while (condition) begin … end while 循环中止条件为 condition 为假。 如果开..
关键词:模块,端口,双向端口,PAD 结构建模方式有 3 类描述语句: Gate(门级)例化语句,UDP (用户定义原语)例化语句和 module (模块) 例化语句。本次主要讲述使用最多的模块级例化语句。 模块 模块是 Verilog 中基本单元的定义形式,是与外界交互的接口。 模块格式定义如下: module module_name #(parameter_list) (port_list) ; Dec..
数值种类 Verilog HDL 有下列四种基本的值来表示硬件电路中的电平逻辑: 0:逻辑 0 或 “假” 1:逻辑 1 或 “真” x 或 X:未知 z 或 Z:高阻 x 意味着信号数值的不确定,即在实际电路里,信号可能为 1,也可能为 0。 z 意味着信号处于高阻状态,常见于信号(input, reg)没有驱动时的逻辑结果。例如一个 pad 的 input 呈现高阻状态时,其逻辑值和上下拉的状态有关系。上拉则逻辑值为 1,下拉..
本节主要对有符号数的十进制与二进制表示以及一些数值变换进行简单的总结。 定义一个宽度为 DW 的二进制补码格式的数据 dbin ,其表示的有符号十进制数字为 ddec 。 reg [DW-1:0] dbin ; 1. 十进制有符号数转二进制补码 正数的补码为原码。 假如十进制数 ddec 为负数,则计算其对应的二进制补码的方法主要有 2 种: 将ddec 最高位符号位改写为 1,剩余数值部分取反加一 例如,4bit 数字 -..
关键词:流水线,乘法器硬件描述语言的一个突出优点就是指令执行的并行性。多条语句能够在相同时钟周期内并行处理多个信号数据。 但是当数据串行输入时,指令执行的并行性并不能体现出其优势。而且很多时候有些计算并不能在一个或两个时钟周期内执行完毕,如果每次输入的串行数据都需要等待上一次计算执行完毕后才能开启下一次的计算,那效率是相当低的。流水线就是解决多周期下串行数据计算效率低的问题。 流水线 流水线的基本思想是:把一个重复的过程分解为若干个子..
关键词:阻塞赋值,非阻塞赋值,并行 过程性赋值是在 initial 或 always 语句块里的赋值,赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后,其值将保持不变,直到重新被赋予新值。 连续性赋值总是处于激活状态,任何操作数的改变都会影响表达式的结果;过程赋值只有在语句执行的时候,才会起作用。这是连续性赋值与过程性赋值的区别。 Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞赋值。 阻塞赋值 阻塞赋值属于顺序执行..
关键词:initial, always 过程结构语句有 2 种,initial 与 always 语句。它们是行为级建模的 2 种基本语句。 一个模块中可以包含多个 initial 和 always 语句,但 2 种语句不能嵌套使用。 这些语句在模块间并行执行,与其在模块的前后顺序没有关系。 但是 initial 语句或 always 语句内部可以理解为是顺序执行的(非阻塞赋值除外)。 每个 initial 语句或 always 语句都..
串行 FIR 滤波器设计 设计说明 设计参数不变,与并行 FIR 滤波器参数一致。即,输入频率为 7.5 MHz 和 250 KHz 的正弦波混合信号,经过 FIR 滤波器后,高频信号 7.5MHz 被滤除,只保留 250KMHz 的信号。 输入频率: 7.5MHz 和 250KHz 采样频率: 50MHz 阻带: 1MHz-6MHz 阶数: 15 (N=15) 串行设计,就是..
关键词:顺序块,并行块,嵌套块,命名块,disable Verilog 语句块提供了将两条或更多条语句组成语法结构上相当于一条一句的机制。主要包括两种类型:顺序块和并行块。 顺序块 顺序块用关键字 begin 和 end 来表示。 顺序块中的语句是一条条执行的。当然,非阻塞赋值除外。 顺序块中每条语句的时延总是与其前面语句执行的时间相关。 在本节之前的仿真中,initial 块中的阻塞赋值,都是顺序块的实例。 并行块 并行块有关键字 ..
关键词: 同步,异步 由第 3 章可知,当触发器输入端的数据和触发器的时钟不相关时,很容易导致电路时序不满足。本章主要解决模块间可导致时序 violation 的异步问题。 关于异步与同步的定义,许多地方都有介绍,细节上也有所差异。本章主要的关注点是解决异步问题的方法,而不关心为什么会出现异步时钟,也不关心异步电路的具体结构,仅从异步时钟的时序结果去分析解决问题。 同步时钟 数字设计中,一般认为,频率相同或频率比为整数倍、且相位相同或..
关键词:任务 任务与函数的区别 和函数一样,任务(task)可以用来描述共同的代码段,并在模块内任意位置被调用,让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算,而任务更像一个过程,不仅能完成函数的功能,还可以包含时序控制逻辑。下面对任务与函数的区别进行概括: 比较点函数任务输入函数至少有一个输入,端口声明不能包含 inout 型任务可以没有或者有多个输入,且端口声明可以为 inout 型输出函数没有输出任务可以没有或者有多个..
关键词:testbench,仿真,文件读写 Verilog 代码设计完成后,还需要进行重要的步骤,即逻辑功能仿真。仿真激励文件称之为 testbench,放在各设计模块的顶层,以便对模块进行系统性的例化调用进行仿真。 毫不夸张的说,对于稍微复杂的 Verilog 设计,如果不进行仿真,即便是经验丰富的老手,99.9999% 以上的设计都不会正常的工作。不能说仿真比设计更加的重要,但是一般来说,仿真花费的时间会比设计花费的时间要多。有时候..
关键词:时延, 惯性时延 连续赋值延时语句中的延时,用于控制任意操作数发生变化到语句左端赋予新值之间的时间延时。 时延一般是不可综合的。 寄存器的时延也是可以控制的,这部分在时序控制里加以说明。 连续赋值时延一般可分为普通赋值时延、隐式时延、声明时延。 下面 3 个例子实现的功能是等效的,分别对应 3 种不同连续赋值时延的写法。 [mycode4 type='verilog'] //普通时延,A&B计算结..
关键词:时延控制,事件触发,边沿触发,电平触发 Verilog 提供了 2 大类时序控制方法:时延控制和事件控制。事件控制主要分为边沿触发事件控制与电平敏感事件控制。 时延控制 基于时延的时序控制出现在表达式中,它指定了语句从开始执行到执行完毕之间的时间间隔。 时延可以是数字、标识符或者表达式。 根据在表达式中的位置差异,时延控制又可以分为常规时延与内嵌时延。 常规时延 遇到常规延时时,该语句需要等待一定时间,然后将计算结果赋值给目标..
Verilog HDL(简称 Verilog )是一种硬件描述语言,用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog 继承了 C 语言的多种操作符和结构,与另一种硬件描述语言 VHDL 相比,语法不是很严格,代码更加简洁,更容易上手。 Verilog 不仅定义了语法,还对语法结构都定义了清晰的仿真语义。因此,Verilog 编写的数字模型就能够使用 Verilog 仿真器进行验证。 谁适合阅..
为保证子程序的原汁原味,避免拉跨拙劣的翻译水平,所有子程序列表均保留英文说明。这里也没有对所有的子程序都进行验证,由于版本或抄写问题,可能会有所疏漏,欢迎指正。建议使用时再仔细研究对应类型的子程序,多多参考其他例子中参数的类型及设置。 ACC 子程序主要分为 5 大类:句柄(handle)、后继(next)、值变链接(VCL)、取值(fetch)、杂项(miscellaneous)、修改(modify)。 句柄子程序 返回类型调用格式及..
功能特性 ACC 子程序主要完成的功能有: 从内部数据结构中读取特定对象的相关信息 把特定对象的相关信息写入内部数据结构中 ACC 子程序可操作的对象类型有: 模块实例、模块端口、模块的端到端的路径以及模块之间的路径 顶层模块 原语实例和原语端口 wire、reg、parameter、integer、time、real 等变量类型 时序检查 命名事件 ACC 子程序的主要特征有: 均以 acc_ 为前缀 开头必须调用 acc_ini..
关键词:偶数分频,奇数分频,半整数分频,小数分频 初学 Verilog 时许多模块都是由计数器与分频器组成的,例如 PWM 脉宽调制、频率计等。分频逻辑也往往通过计数逻辑完成。本节主要对偶数分频、奇数分频、半整数分频以及小数分频进行简单的总结。 偶数分频 采用触发器反向输出端连接到输入端的方式,可构成简单的 2 分频电路。 以此为基础进行级联,可构成 4 分频,8 分频电路。 电路实现如下图所示,用 Verilog 描述时只需使用简单..
随着各种应用场景的限制,芯片在运行时往往需要在不同的应用下切换不同的时钟源,例如低功耗和高性能模式就分别需要低频率和高频率的时钟。两个时钟源有可能是同源且同步的,也有可能是不相关的。直接使用选择逻辑进行时钟切换大概率会导致分频时钟信号出现毛刺现象,所以时钟切换逻辑也需要进行特殊的处理。 时钟切换问题 直接采用选择逻辑对时钟进行切换的电路图如下所示。 假如时钟选择信号 sel_clk1 与两个时钟都是异步的,那么时钟切换时刻就是任意的..