tags
type
status
date
slug
summary
category
password
icon
#0 Verilog语法
iverilog
cmd命令:
iverilog -g2005-sv -o 1.out 1.v
把1.v输出为1.out,-sv是调用systemverilogvvp -n 1.out -lxt2
gtkwave 1.vcd
查看波形需要在1.v中添加命令:
数值
0低电平,1高电平,x/X未知,z/Z高阻
4'b1011
,4表示bit数,‘DHBO表示基数,最后是数值可以加入下划线,如
32'h3022_c0de
负数在最前面加
-
都写上长度和基数!不然会有意料之外的bug
数据类型
- wire 导线节点,默认的变量类型。信号流向有方向性,因此只能用assign赋值一次
- reg 寄存器,类似变量
- vector wire或reg位宽大于1。
- 定义
reg [3:0] counter;
表示3-0(含)共4bit,且最高有效位为3。 如果定义reg [3:0] counter[3:0];
则说明counter是4*4bit的数组。 要注意向量(packed/bus)reg[3:0]
与数组(unpacked)counter[3:0]
是不同的概念。向量作为一种数据类型可以整个赋值,比如counter[0]=4'hA
- 引用
counter[31-:8]
与counter[31:24]
等价,其中31-/+
表示从第31个bit开始递减/增,取几位 - 合成
temp1 = {data1, data2};
其中的常数必须给出长度。temp2 = {32{1’b0}}
赋值32位0 - 容易出错的赋值
& a[3:0]
表示对向量各位进行与。
假设a是一个向量,直接进行
b=a;
会导致b默认为1bit的wire,从而出现bug。为防止这种情况出现,可以加上`default_nettype none
- integer 位宽与编译器有关的有符号数(reg为无符号数)
- time 通过
$time
获取当前仿真时间
- parameter/localparam 常量
编译指令
`define
`undef
`include
`timescale time_unit/time_precision
注释
//
或 /* xxx */
赋值
wire的赋值:
assign f=(~s&x1)|(x&x2);
~&|^
分别代表非、与、或、异或。wire类型只能被赋值一次。注意这些都是bit-wise的运算符,对向量按位计算且结果也是向量,而&& ||
等是逻辑运算符,结果是1bit的值。reg的赋值:
b=4'd10
多变量赋值:
assign {o2, o1, o0} = vec;
时延
#x
延时x个time precision过程结构
initial
每个initial语句都是独立的,从0时刻开始执行,只执行一次。多用于初始化、信号检测等
always @(*)
Combinational.从0时刻开始执行,执行完最后一条后回到第一条。内部赋值采用阻塞赋值x=y
always @(posedge clk)
Clocked.内部采用非阻塞赋值x<=y
。非阻塞赋值同时进行,且采用上一时刻的数据,其结果直到下一个时刻才会生效。如下面代码可以实现reg值的交换。
- 注意所有
always
等过程结构内部的赋值都不用assign
,只能对reg等赋值。除了组合逻辑电路,一般情况下不对wire赋值。
分支
- if和case必须包含在always块中,因此内部不能对wire赋值。对wire赋值可以采用
out = (sel == 0) ? a:b
- casez中,当满足多个条件时,采用最前面那个。但最好的方式还是让输入无论如何都只满足一个条件,因此
bzz10
比bzz1z
更好。
- 避免latch。如果在一个模块后,某个值没有被确定,那么verilog会自动继承其上一时刻的值,称为latch。除非有意为之,否则latch的警告很有可能是bug。 为避免latch,必须确保在任何情况下所有变量都被赋值 除了使用default之外,也可以在case前赋予默认值:
循环
- for的控制变量一般定义为integer,该变量只用于辅助生产代码,而在仿真时会消失。
- generate的控制变量为genvar。for循环需要一个名字
门级原始结构
and(y,x1,x2)
or(y,x1,x2,x3)
not(y,x)
模块
- 实例化
选择
#1 Preface
标准芯片、可编程逻辑芯片(PLD)与全定制芯片(ASIC)
PLD的一种是FPGA,现场可编程门阵列
CAD系统:Quartus/ISE
#2 Introduction to Logic Circuits
Analysis: network⇒function
Synthesis: function⇒network
Properties of Bool Algebra
- Duality: and与or互换,0与1互换,等式仍然成立
- Distribution law:
(from duality)
- Absorption law:
- Merge law:
- De Morgan’s law:
- Inclusion law: ()
()
积之和&和之积
积之和(SOP):所有f=1的项加起来,如 。如果每一项都是最小项,那么称为正则积之和。
和之积(POS):所有f=0的项的非乘起来,如。如果每一项都是最大项,那么称为正则和之积。
任何“或-与”电路可以用具有相同拓扑结构的“或非-与非”单路实现(p30)
硬件描述语言(HDL)
Verilog HDL或VHDL是通用的硬件描述语言。
逻辑综合:把Verilog编译成逻辑电路
功能仿真:验证零时延逻辑门能否实现功能
时序仿真:考虑时延验证功能
卡诺图
注意4变量卡诺图除了左右边、上下边相邻,四个角也是相邻的
5变量卡诺图由两张4变量卡诺图组成,对应位置都为1则可以消去x5
对SOP形式,覆盖所有1;对POS形式,覆盖所有0。两种方法的消去变量的方法是一致的,下面均以SOP为例
最小化策略
- 字符:乘积里有几项就是几个字符
- 蕴含项(Implicant):该项对应框内全是1
- 质蕴含项/素项(Prime Implicant):不能被包含进字符数更少(框更大)的蕴含项中
- 覆盖:所有框加起来盖住所有1
- 成本:总逻辑门数量+所有逻辑门的输入数,并假定原始输入的非可以无成本获得
- 基本质蕴涵项(Essential Prime Implicant):包含了一个最小项,该最小项不在其他质蕴涵项中。容易发现,基本质蕴涵项必须被包括在一个覆盖中
无关项
永远不会出现的输入的组合。可以根据方便任意的赋值为0或1,在卡诺图中用d表示
多输出电路
对多输出电路,由于部分电路可以共享,整体成本最小的方式可能不是让各自的成本都最小,以上寻找基本质蕴涵项的方法不成立
#3 Calculation Circuits
- 半加器
本位,进位
- 全加器
加上前一位的进位
其中异或定义为,其本质上是和mod2
异或门的另一个作用是:用信号x控制信号y
另外同或:
一个全加器可以用两个半加器构成
- 补码
- 作者:XiaoTianyao
- 链接:https://www.xty27.top/article/Verilog
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。