1.数字集成电路设计
数字集成电路设计方法的演变:
1. 以元件为基础
2.以单元为基础,
3.以 RTL 综合为基础
4. 以IP为基础。
2.集成电路的发展阶段
1. 第一阶段:以加工制造为主导的 IC 产业发展的初级阶段 (产品: 简单的微处理器
2.第二阶段: 是标准工艺加工线公司与IC 设计公司共同发展的阶段 (产品: MPU,微处理器)
3.第三阶段: IC产业的 四业 开始分离,功能强大的通用型中央处理器 和信号处理器
4.第四阶段: IC 产业开始以 Fundry 为主导,IP的使用广泛。
3.功能模块的可重用性
1. 软核(Soft IP Core)
软核在EDA 设计领域指的是综合之前的寄存器传输级(RTL) 模型;具体在FPGA 设计中指的是对电路的硬件语言描述,包括逻辑描述、网表和帮助文档等。软核只经过功能仿真,需要经过综合以及布局布线才能使用。其优点是灵活性高、可移植性强,允许用户自配置;缺点是对模块的预测性较低,在后续设计中存在发生错误的可能性,有一定的设计风险。软核是IP 核应用最广泛的形式。
2. 固核(Firm IP Core)
固核在EDA 设计领域指的是带有平面规划信息的网表;具体在FPGA 设计中可以看做带有布局规划的软核,通常以RTL 代码和对应具体工艺网表的混合形式提供。将RTL 描述结合具体标准单元库进行综合优化设计,形成门级网表,再通过布局布线工具即可使用。和软核相比,固核的设计灵活性稍差,但在可靠性上有较大提高。目前,固核也是IP 核的主流形式之一。
3. 硬核 (Hard IP Core)
硬核在EDA 设计领域指经过验证的设计版图;具体在FPGA 设计中指布局和工艺固定、经过前端和后端验证的设计,设计人员不能对其修改。不能修改的原因有两个:首先是系统设计对各个模块的时序要求很严格,不允许打乱已有的物理版图;其次是保护知识产权的要求,不允许设计人员对其有任何改动。IP 硬核的不许修改特点使其复用有一定的困难,因此只能用于某些特定应用,使用范围较窄。
4.Verilog HDL 语言要素
1.空白符 :空格符(\b),制表符(\t),换行符,换页符,
2.注意符 : // 注释一行, 注释多行 /* */ (注释最好是英文)
3.标识符: 标识符包含:字母,数字,$, _ (下划线), 开头只能是 字母和下划线
4.转义标识符: \
5.关键字: 系统自带的标识符,有固定的意义。
6.Verilog HDL 四种状态: 0 (低电平), 1(高电平) , x(未知态) , z (高阻态)-》总线
7.负数, 补码形式存在
8. 数值进制 , 二进制 b/B, 八进制 o/O, 十进制 d/D, 十六进制 h/H.
9.整数表示,
10.实数表示: (不能用于设计) 十进制表示, 科学计数法,
5.数据类型
物理数据类型:连线型、寄存器型和存储器型数据类型;信号强度表示数字电路中不同强度的驱动源,用来解决不同驱动强度存在下的赋值冲突:
驱动能力:
标记符 | 名称 | 类型 | 强弱程度 |
supply | 电源级驱动 | 驱动 | 最强 |
strong | 强驱动 | 驱动 | 逐渐下降 |
pull | 上拉级驱动 | 驱动 | 逐渐下降 |
large | 大容性 | 存储 | 逐渐下降 |
weak | 弱驱动 | 驱动 | 逐渐下降 |
medium | 中性驱动 | 存储 | 逐渐下降 |
small | 小容性 | 存储 | 逐渐下降 |
highz | 高容性 | 高阻 |
连线型数据类型:
连线型数据类型 | 功能说明 |
wrie,tri | 标准连线 (缺省为该类型) |
wor,trior | 多重驱动时,具有线或特性的连线型 |
wand,trand | 多重驱动时,具有线与特性的连线型 |
trireg | 具有电荷保持特性的连线型数据 |
tri1 | 上拉电阻 |
tri0 | 下拉电阻 |
supply1 | 电源线,用于对电源建模,为高电平1 |
supply0 | 电源线,用于对地 建模, 为低电平0 |
寄存器: reg型
reg型是数据储存单元的抽象类型,其对应的硬件电路元件具有状态保持作用,能够存储数据,如触发器、锁存器等。
reg型变量常用于行为级描述,由过程赋值语句对其进行赋值。
reg型变量简单例子,
reg a: //定义一个一也的名为a的reg变量
reg [3:0] b: // 定义一个4位的名为b的reg型变量
reg[8:1]c.d.e; //定义了三个名称分别为c、d、 e的8位的reg型变量
reg型变量一般为无符号数,若将一个负数赋给reg型变量,则自动转换成其二进制补
码形式。例如:
reg signed[3:0]rega;
rega=-2; // rega的值为1110(14),是2的补码
原码: 0010
反码: 1101
补码: 1110
5.运算符与表达式
1.算数操作符, 加法(+),减法(-),乘法(*),除法(/), 取模(%)
重点:算术操作符的结果是位宽。算术表达式结果的长度是由最长操作数决定的,再赋值语句中,算术操作结果由操作最左端目标长度决定。
一,加法
reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01
b=a+d //b=4'b1010
k=a+d //k=2'b10
二,减法
reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01
b=a-d //b=4'b1000
k=a-d //k=2'b00
三,乘法
reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01
b=a*d //b=4'b1001
k=a*d //k=2'b01
四,除法
reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b01
b=a/d //b=4'b1010
k=a/d //k=2'b01
五,取模
reg[3:0]a,b,c;
Reg[1:0]d,k;
a=4'b1001
d=2'b11
b=a%d //b=4'b0000
k=a%d //k=2'b00
2.关系操作运算符 : 大于(>),小于(<),大于等于(>=) ,小于等于 (<=)
重点:任何和不定状态的运算输出都是不定状态,但我们不会遇到,在数电中对不定状态管理非常严格。我们都知道产生不定状态只有两种情况一种是信号悬空,另一种是2个信号对一个信号驱动。(两个信号输入只有一个非门输出)
简单 (不知道对比的话,转为十进制自己看看 就行了)
重要的是: 不定态的加入
a = 3;
d = 4'hx //不定状态
$display(a<=d) //out x
3.相等关系符
有四种相等的关系符: == (等于), !=(不等于) , ===(全等), !== (非全等)
重要:值得注意的是,我们经常会使用全等,因为相比较于等于,全等不会让不确定状态向下传播。还有就是不允许不同位宽信号对比。
一,== 等于关系符的 真值表
==0 | 0 | 1 | x | z |
0 | 1 | 0 | x | x |
1 | 0 | 1 | x | x |
x | x | x | x | x |
z | x | x | x | x |
二,=== 等于关系符的真值表 (去除了 不定态)
=== | 0 | 1 | x | z |
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
x | 0 | 0 | 1 | 0 |
z | 0 | 0 | 0 | 1 |
module xx_2;
reg[3:0]a,b,c,d;
initial
begin
a=4'b0xx1;
b=4'b0xx1;
c=4'b0011;
d=2'b11;
$display(a==b); //结果为 x
$display(c==d); //结果为 1
$display(a===b); //结果为 1
$display(c===d); //结果为 0 (=== 算了位数在规则里面)
4.逻辑运算符 && (逻辑与) , || (逻辑或), !(逻辑 非)
重点:若操作数有不定状态,则逻辑运算的结果也是不定状态
a=4'b1110; //a=1 (可以这样理解)
b=4'b0000; //b=0 (可以这样理解)
c=2'b10; //c=1 (可以这样理解)
!a=0;
!b=1;
!c=0;
a&&b=0;
a&&c=0;
b&&c=0;
a||b=1;
a||c=0;
b||C=1;
5.按位操作符
按位取反“~”,按位与“&”,按位或“|”,按位异或“^”,按位同或“^~”
重点: 比较位置少的 自动补 0 比较
module bit
reg[2:0]a;
reg[3:0]b;
initial
begin
// 因为 计算的时候一般是 位数相同的所以 a= 4'b 4位数
a=4'b110; // 运算的时候 在前面自动补一个 0 a=4'b0110
b=4'b0001;
$display("%b",~a); //结果为 4'b1001
$display("%b",~b); //结果为 4'b1110
$display("%b",a&b); //结果为 4'b0000
$display("%b",a|b); //结果为 4’b0111
$display("%b",a^b); //结果为 4'b0111
end
endmodule
6.移位操作符 << 左移 >>右移
a=4'b0110
$display("%b",a>>2); //结果为 4'b0001
$display("%b",a<<2); //结果为 4'b1000
7.条件运算符 (三目运算符)
module mux2(in1,in2,sel,out);
input [3:0]in1,in2;
input sel;
output [3:0]out;
reg [3:0]out;
assign out=(!sel)?in1:in2;
//sel为0时out等于inl,反之out等于in2
endmodule
8.连接和复制运算符
一,连接操作符:{信号1的某几位,……,信号n的某几位}
二,重复操作符{{}}:讲一个表达式放入最里面,外层放入复制因子。
module con11;
reg [2:0]a;
reg [3:0]b;
reg [7:0]c;
reg [4:0]d;
reg [5:0]e;
initial
begin
a=3'b101;
b=4'b1110;
c={a,b}; //连接操作 a和b全部连接
d={a[2:1],b[2:0]}; //连接操作 a的[2-1]位, b的 [2-0]位 连接,a在前面
e={2{a}};// 复制操作符 复制两个a
$display("%b",c);//结果7'b1011110
$display("%b",d);//结果5'b10110
$display("%b",e);//结果6'b101101
end
endmodule