• 概念
  • EDA(电子设计自动化)
  • 借助于计算机和集成电路技术
  • 采用硬件描述语言(HDL)
  • EDA软件自动完成编译、化简、综合、优化等工作
  • 将软件描述的功能转译为硬件电路结构
  • 通过可编程逻辑器件(PLD)来实现
  • ASIC(专用集成电路)
  • 狭义EDA计数的设计目标
  • FPGA&CPLD是实现这一目标的途径的主流器件
  • SoC(片上系统/系统级芯片)
  • 在单个芯片上完成一个电子系统的功能
  • IP核(知识产权核)
  • 分类
  • 软IP(HDL程序)
  • 固IP(时序固定)
  • 硬IP(电路网表文件)
  • 优势:调用IP核能避免重复劳动,大大减轻工程师的负担,缩短设计所需周期。
  • 嵌入式系统
  • 定义
  • 以应用为中心
  • 以计算机技术为基础
  • 专用计算机系统
  • 组成
  • 软件
  • 硬件
  • PLD(可编程逻辑器件)
  • 出场时是一块不具有任何逻辑功能的空白芯片
  • 内部电路结构近乎可变,对其编程即改变其内部结构的过程
  • 发展
  • CPLD(复杂可编程逻辑器件)
  • 结构
  • 可编程I/O单元
  • 完成不同电气特性下对输入/输出信号的驱动与匹配
  • 基本逻辑单元(宏单元)
  • 结构
  • “与或”阵列——组合逻辑功能
  • 也称为乘积项
  • 任何组合逻辑电路都可化为"与-或"表达式
  • 任何组合电路都可用门或门二级电路实现
  • 任何时序电路都可用组合电路加上存储元件(存储器,触发器,RAM)构成
  • “与或”阵列每一个交叉点都是一个可编程熔丝,如果导通就是实现“与”逻辑
  • 在“与”阵列后还有一个“或”阵列,用以完成最简逻辑表达式中的“或”关系
  • 触发器——时序逻辑功能
  • 其中可编程触发器包含时钟、复位/置位配置功能,用以实现时序逻辑的寄存器或者锁存器等功能
  • 器件规模用MC数量表示(器件型号中的数字即表示MC数量)
  • 布线池/布线矩阵
  • 一般采用集中式布线池结构
  • 布线池是一个开关矩阵,通过打通节点可以完成不同MC的输入与输出项之间的连接
  • 由于布线池结构固定,CPLD输入到输出管脚的标准延时固定(称Pin To Pin延时),反映了CPLD可实现的最高频率(速度等级)
  • 固有延时&传输延时
  • 固有延时
  • 也称惯性延时,是任何电子器件都存在的一种延时特性
  • 主要物理机制是分布电容效应
  • 惯性延时模型中,器件输出都有一个固有的延时
  • 信号脉宽(持续时间)小于器件的固有延时时,器件将对输入信号不做反应,即有输入无输出
  • 传输延时
  • 表示输入与输出之间的一种绝对延时关系
  • 不考虑信号持续时间,仅表示信号传输推迟或延迟了一个时间段,该时间段即为传输延时
  • 其他辅助功能模块
  • FPGA(现场可编程门阵列)
  • 可编程输入输出单元(IOB)
  • 芯片与外界电路的接口
  • 完成不同电气特性下对输入/输出信号的驱动与匹配需求
  • 可编程逻辑单元
  • 基于SRAM工艺的FPGA,其可编程逻辑单元几乎都由查找表(LUT)和寄存器组成
  • 逻辑函数发生采用RAM"数据"朝朝的方式,并采用多个查找表构成一个查找表阵列的可编程逻辑阵列
    基于查找表的可编程逻辑结构
  • 内部结构灵活
  • 可配置为带同步/异步复位或置位/时钟使能的触发器
  • 也可配置为锁存器
  • Altera可编程逻辑单元通常称LE(由1个寄存器+1个LUT构成)
  • 嵌入式块RAM
  • 一般配置储存结构
  • 单端口RAM
  • 双端口RAM
  • 先进先出储存器(FIFO)
  • FPGA中没有专用的ROM硬件资源,实现ROM需对RAM赋初值并保持该初值
  • 布线资源
  • 联通FPGA内部所有资源
  • 连线的长度和工艺决定着信号在连线上的驱动能力和传输速度
  • 布线资源的优化与使用和设计的实现结果(包含速度和面积两个方面)有直接关系
  • 底层嵌入功能单元
  • 指通用程度较高的嵌入式功能模块
  • 内嵌专用硬核
  • 指那些通用性相对较弱的
  • 不是所有FPGA器件都包含硬核(Hard Core)
  • CPLD&FPGA对比
  • FPGA
    实现复杂设计,时序约束和仿真非常重要
  • 工艺上:实现工艺为SRAM,也包括Flash和Anti-Fuse等
  • 结构上:查找表(LUT)+寄存器结构
  • 编程配置:一般为配置,多数属于RAM型,掉电后程序丢失
  • 触发器数量:多
  • Pin To Pin延时:不可预测
  • 规模:大
  • 逻辑复杂度:高
  • 成本价格:高
  • 保密性:差
  • 互联结构/连线资源:分段式布线结构,布线资源丰富
  • 适用设计类型:触发器丰富,复杂的时序结构
  • CPLD
    实现简单低成本设计
  • 工艺上:实现工艺多为E²CMOS,也包括E²PROM、Flash、Anti-Fuse等
  • 结构上:乘积项结构
  • 编程配置:一般为编程,多为ROM型,掉电后程序不丢失
  • 触发器数量:少
  • Pin To Pin延时:固定
  • 规模:小
  • 逻辑复杂度:低
  • 成本价格:低
  • 保密性:好
  • 互联结构/连线资源:集总式布线结构,布线资源相对有限
  • 适用设计类型:触发器有限、乘积项丰富的结构,完成各种算法和组合逻辑
  • 常见大规模可编程逻辑器件的编程工艺
    编程和配置的概念
  • 基于电可擦除存储单元的E²PROM或Flash技术
  • CPLD一般使用此技术进行编程
  • 编程后改变电可擦除存储单元
  • 掉电后信息能保存
  • 基于SRAM的编程单元
  • 大部分FPGA采用这种编程工艺
  • 编程信息保存在SRAM中的,SRAM在掉电后编程信息立即丢失,在下次上电后,还需要重新载入编程信息
  • 该类器件的编程一般称为配置
  • 反熔丝结构和Flash结构的FPGA的下载为编程
  • 对FPGA的专用配置ROM的下载为编程
  • PLD&MCU区别
  • 硬件资源
  • PLD:内部电路结构可修改,硬件结构功能可任意配置
  • MCU:硬件结构固定不变
  • 软件开发
  • PLD:采用硬件描述语言VHDL和Verilog HDL描述电路功能
  • MCU:根据程序流程图,采用C语言实现,执行语句指令
  • 执行方式
  • PLD:并行计算且不执行代码,实现电路结构
  • MCU:串行执行指令
  • 算法应用
  • PLD:无乘法器,只能进行简单运算
  • MCU:能完成各种复杂运算
  • HDL(硬件描述语言)
  • 用形式化方法描述数字电路、设计数字逻辑系统
  • 主要目的:编写设计文件,建立电子系统行为级的模拟模型
  • 使用HDL设计目标的流程
  • 利用计算机对HDL建模的数字逻辑进行模拟
  • 利用逻辑综合工具自动生成符合要求,且在电路结构上可以实现的数字逻辑网表
  • 根据网表和工艺进行版图设计
  • 生成该工艺条件下电路的延时模型
  • 模拟验证无误后用于制造 ASIC芯片或者写入CPLD和FPGA器件中
  • HDL综合器&软件程序编译器区别
  • 软件程序编译器:将C语言或汇编语言等编写的程序,编译为0,1代码流
  • HDL综合器将用HDL编写的程序代码,转化为具体的电路网表结构
  • 应用
  • 用HDL建立的数字模型——软核
  • 用HDL建模和综合后生成的网表——固核
  • 主流HDL为VHDL和Verilog HDL
  • 数字系统设计抽象层次
  • 三个域
  • 行为域
  • 物理域
  • 结构域
  • 五个抽象层次
  • 系统级
  • 算法级
  • 寄存器传输级
  • 逻辑级
  • 电路级
  • Verilog HDL数字电路设计
  • Verilog HDL模块
  • Verilog HDL模块(module)结构框架
  • module 模块名 (端口列表) //端口定义
  • 端口定义 [描述端口] //I/O说明
  • 内部信号声明 //信号类型声明
  • 逻辑功能描述 [描述逻辑功能] //功能描述
  • endmodule
  • 端口定义格式
  • module module_name (port_i);
  • I/O说明
  • input port_a;
  • output port_b;
  • 信号类型声明
  • e.g.:reg [7:0] clk_out;
  • 分类
  • wire
  • 输入输出信号未指定类型(缺省)时默认为wire型
  • 可以做任何表达式的输入,assign和实例元件的输出
  • 变量取值可为0,1,x,z,若未连接到驱动源则其值为高阻态z
  • 输出值紧跟输入值变化,不可存,不可停,必须由驱动源驱动
  • reg
  • 默认初始值为不定值x
  • 综合时,综合器根据情况确定将其映射为寄存器或连线
  • 默认为无符号数,赋值为负数会得到二进制补码的结果
  • integer
  • 32位有符号整型变量
  • 默认初始值位不定值x
  • 是整数寄存器
  • 最少可容纳一个32位的数,但是做位向量访问是非法的
  • 逻辑功能描述的三种方式
  • 数据流建模
  • "assign"语句
    e.g.“assign y=(~s)|(b&a);”
  • 连续赋值
  • 被赋值方必为wire型
  • 结构化建模
  • 模块级建模(元件例化)
  • 门级建模
    e.g."or u1 (y,as,bs);"
  • 开关级建模
  • 行为级建模
  • "always"块语句
  • 过程赋值
  • 被赋值方必为reg型,若要对输出端口赋值必须二次定义
  • 敏感信号列表为触发式,其中任一信号发生变化即启动
  • e.g.
  • 同步复位&异步复位的区别
  • 区别在于是否受时钟信号控制
  • 同步复位:复位信号只有在时钟信号来临时才有效
  • 异步复位:只要异步复位信号到来即有效
  • 体现在"always"语句的敏感信号列表中
  • 有限状态机/时序机
  • 状态数目有限,可由表示状态的位数确定
  • 采用n位二进制编码的时序机的状态最多有2^n种状态
  • 同步(钟控)有限状态机(FSM):具有有限个状态且状态转换由时钟驱动
  • 两种基本类型
  • 米利(Mealy)机:下一状态和输出取决于当前状态和当前输入
  • 摩尔(Moore)机:下一状态取决于当前状态和当前输入,但输出仅取决于当前状态
  • 系统描述与设计
  • 时序图
  • 状态表
  • 状态图
  • 算法状态机(ASM)图
  • FSM的状态转移图(STG)
    以画图的形式考察
  • 有向图
  • 带有标记的节点
  • 必须考虑到从一个节点出发的所有可能的状态转移
  • 三要素
  • 独立状态
  • 转移条件
  • 转移方向
  • 状态机的状态编码
  • 三种编码方式
  • 二进制编码
  • 即顺序编码
  • 使用了最少数量触发器
  • 速度最慢
  • 格雷码
  • 两个相邻码值仅由一个位即可区分
  • 可减少电路中的电噪声
  • 纠错检错效率高
  • 独热码
  • 速度快
  • 使用更多触发器,但会导致对机器下一状态和输出的更简单译码逻辑
  • 设计简单
  • 对于状态数目大于32的状态机建议使用Gray编码,因为它比One-Hot编码需要更少的触发器,而且由于同时变化的位数少,它要比二进制编码更加可靠
  • 如果一个状态分配没有将所有的码值都覆盖到,那么将需要用到附加逻辑,用以检查,提取并转移到无用状态,这种附加逻辑将会对实现设计需要的总(电路)面积有影响。
  • 设计优化
  • 资源优化
  • 资源共享
  • 先选后乘,占用资源更少
  • 先乘后选,资源耗用多
  • 串行化
  • 将原本耗用资源巨大、单时钟周期内完成的并行执行逻辑分隔开,提取相同逻辑模块,时间复用
  • 使用多个时钟周期完成相同工作
  • 代价为工作速度大大降低
  • 速度优化
  • 流水线设计
  • 寄存器配平
  • 关键路径
  • 关键路径是指设计中从输入到输出经过的延时最长的逻辑路径
  • 从输入到输出的延时取决于信号所经过的延时最大(或称最长)路径,而与其他延时小的路径无关
  • 优化关键路径是一种提高设计工作速度的有效方法
  • EDA设计流程
  • EDA的FPGA/CPLD设计流程
  • 涉及的EDA工具
  • 设计输入编辑器
  • 用于设计输入
  • 接受多种设计输入表达方式
  • 原理图输入
  • 状态图输入
  • 波形输入
  • HDL的文本输入方式
  • HDL综合器
  • 将综合的HDL语言转换成网表文件
  • 仿真器
  • 验证逻辑功能
  • 验证时序功能
  • 适配器(布局布线器)
  • 完成目标系统在器件上的布局布线
  • 下载器
  • 将设计下载到对应的实际器件
  • 实现硬件设计
  • Verilog HDL基本语法
  • 标识符
  • 合法字符:任意字母、数字、"_"下划线、"$"美元符号
  • 第一个字符必须为字母或下划线
  • 区分大小写
  • 常量
  • 四值逻辑
  • "1,0"分别对应信号"有效(true)"和"无效(false)",实际电路信号只有这两个值
  • x为不定值,表示模糊状态,仿真器无法判定信号值
    如:一根信号线同时具有两个相反逻辑值(0,1)
  • z为高阻态,表示三态情形,此时信号线不与驱动器相连
    如:三态门使能信号无效时产生一个z值
  • 整型常量
  • +/-<位宽>'<进制><数字>
    +/-<size>'<base><value>
  • 进制有四种(不区分大小写)
  • 二进制 b
  • 八进制 o
  • 十进制 d/默认
  • 十六进制 h
  • 位宽为数值对应二进制数的宽度
  • <size>和<'>;<base>和<value>之间可以允许空格
  • <'>和<base>之间及数字内部不可空格
  • 运算符
  • 条件运算符
  • 格式:<结果>=<条件表达式>?<表达式1>:<表达式2>;
  • 计算条件表达式,结果为真,则将表达式1赋值给结果,否则将表达式2赋值给结果
  • 位拼接运算符
  • {操作数1,操作数2,……,操作数n}
  • {重复次数{操作数}} //复制运算符
  • 时间控制语句
  • 延时控制语句
  • 用"#延时时间"来表示
  • 延时时间为指定的延时时间量,以多个仿真时间单位给出
  • 仿真时间单位须指定
  • 分类
  • 语句前延时
  • 格式:#延时时间语句;
  • 仿真时遇到该语句结果为:不立即执行语句,等延时时间量过去再执行
  • 单独延时
  • 格式:#延时时间;
  • 仿真遇到该语句时不进行任何操作,等待延时时间量过去
  • 语句内延时
  • 格式:结果= #延时时间表达式;
  • 将赋值过程分成两步,先计算表达式,待延时时间量过去后,将表达式的值赋给结果
  • 这一语句计算顺序与前两种不同
  • 事件控制语句
  • 将某事件作为执行某操作的条件
  • 分类
  • 边沿敏感事件
    e.g. @(posedge clk or negedge rst) c=a+b;@(d1 or d2 or d3) dout=d1^d2^d3;//按位异或
  • 格式:@(事件)语句;
  • 只要"()"中任一事件发生变化,就会促使后面语句执行
  • 电平敏感事件
  • 赋值语句
  • 连续赋值语句
  • 格式:assign 结果=表达式;
  • 所有变量均为wire型
  • 过程赋值语句
  • always,initial内对reg型变量赋值
  • 阻塞赋值
  • 使用"="
  • 在该语句结束时立即完成赋值操作
  • 多条阻塞赋值语句存在时,若前面的语句没有完成,后面语句不能执行
  • 非阻塞赋值
  • 使用"<="
  • 在整个过程块结束时才完成赋值操作
  • 整过过程份为两个操作:同时开始计算所有右侧表达式,给左侧所有结果赋值
  • 在always中使用时,综合成的电路为时序逻辑电路
  • 编译预处理语句
  • 以"`"开头,结尾无";"
  • 宏定义
  • 示例
1 `define width 8//用width代替数字8
2 reg [`width-1:0] a,b,c;//引用已定义宏名时需加上“`”
  • 时间标尺定义
  • 两则示例:1
1 //`timescale 时间精度/时间单位
 2 `timescale 1ns/10ps //表示时间单位1ns,时间精度10ps
 3 module gate
 4 (
 5     input a,b,
 6     output out
 7 );
 8 
 9 or #(4.23,5.67) A1(out,a,b);
10 
11 endmodule
12 //上例中4.23延时值为4.2ns,5.67延时值为5.7ns
  • 2
1 //若改为下例,则延时值分别为42ns,57ns
 2 `timescale 1ns/10ps
 3 module gate
 4 (
 5     input a,b,
 6     output out
 7 );
 8 
 9 or #(4.23,5.67) A1(out,a,b);
10 
11 endmodule
  • 基础程序实例
  • ADDER
1 //半加器
2 module half_add
3 (
4  input a,b,
5  output cout,sum
6 );
7 assign sum=a^b;
8 assign cout=a&b;
9 endmodule
1 //8位全加器
 2 module adder8
 3 (
 4  input [7:0] a,b,
 5  input c,
 6  output reg [7:0] sum,
 7  output reg cout
 8 );
 9 always @(a or b or c)
10 begin
11  sum=a^b^c;
12  cout=(a&b)|(a&c)|(b&c);
13 end
14 endmodule
1 //行为描述方式的1位全加器
 2 module full_add_2
 3 (
 4  input a,b,c,
 5  output reg sum,cout
 6 );
 7 always @(a or b or c)
 8 begin
 9  {cout,sum}=a+b+c;//使用位拼接运算符很好诠释了全加器的实质
10 end
11 endmodule
1 //调用门级原件实现1位全加器
 2 module full_add
 3 (
 4  input a,b,c,
 5  output sum,cout
 6 );
 7 wire w,y1,y2,y3;
 8 and and1(y1,a,b);
 9 and and2(y2,a,c);
10 and and3(y3,b,c);
11 or or1(cout,y1,y2,y3);
12 xor xor1(w,a,b);
13 xor xor2(sum,w,c);
14 endmodule
1 //用上例1位全加器构成4位全加器
 2 `include "full_add.v"
 3 module full_add4
 4 (
 5  input [3:0] a,b,
 6  input c,
 7  output [3:0] sum,
 8  output cout
 9 );
10 wire c1,c2,c3;
11 full_add u0(.a(a[0]),.b(b[0]),.c(c),.sum(sum[0]),.cout(c1));
12 full_add u0(.a(a[1]),.b(b[1]),.c(c1),.sum(sum[1]),.cout(c2));
13 full_add u0(.a(a[2]),.b(b[2]),.c(c2),.sum(sum[2]),.cout(c3));
14 full_add u0(.a(a[3]),.b(b[3]),.c(c3),.sum(sum[3]),.cout(cout));
15 endmodule
  • MUX
1 //2选1多路数据选择器
 2 module mux2
 3 (
 4  input [1:0] a,b,
 5  input sel,
 6  output reg [1:0] q
 7 );
 8 always @(a or sel)
 9 begin
10  if(sel)
11  q=a;
12  else
13  q=b;
14 end
15 endmodule
//两种数据流描述4选1数据选择器
module mux4_1a
(
 input a,b,c,d,
 input s0,s1,
 output y
);
assign y=(~s1&~s0&a)|(~s1&s0&b)|(s1&~s0&c)|(s1&s0&d);
endmodule
1 module mux4_1b
2 (
3  input a,b,c,d,
4  input s0,s1,
5  output y
6 );
7 assign y=s1?(s0?d:c):(s0?b:a);
8 endmodule

EDA I.T基础架构方案 eda结构_EDA

  • COUNTER
1 //模10计数器
 2 module count10
 3 (
 4  input clk,rst,start,
 5  output reg cout,
 6  output [3:0] daout
 7 );
 8 reg [3:0] cnt;
 9 assign daout=cnt;
10 always @(posedge clk or negedge rst)//异步复位
11 begin
12  if(!rst)
13  begin
14  cnt<=0;
15  cout<=0;
16  end
17  else if(start==1)
18  begin
19  if(cnt==10)
20  begin
21  cnt<=0;
22  cout<=1;
23  end
24  else
25  begin
26  cnt<=cnt+1;
27  cout<=0;
28  end
29  end
30 end
31 endmodule
  • CODER/DECODER
1 //普通8-3编码器
 2 module code8_3
 3 (
 4  input [7:0] I,
 5  output reg [2:0] Q
 6 );
 7 always @(I)
 8 begin
 9  case(I)
10  8'b00000001:Q=7;
11  8'b00000010:Q=6;
12  8'b00000100:Q=5;
13  8'b00001000:Q=4;
14  8'b00010000:Q=3;
15  8'b00100000:Q=2;
16  8'b01000000:Q=1;
17  8'b10000000:Q=0;
18  default:Q=3'bxxx;
19  endcase
20 end
21 endmodule
1 //8-3优先编码器
 2 module code_8_3
 3 (
 4  input[7:0] I,
 5  input s,
 6  output reg [2:0] Q,
 7  output reg EO,GS
 8 );
 9 always @(s or I)
10 begin
11  if(s) begin Q=7;E0=1;GS=1;end
12  else
13  begin
14  if(~I[7]) begin Q=0;EO=1;GS=0;end
15  else if(~I[6]) begin Q=1;EO=1;GS=0;end
16  else if(~I[5]) begin Q=2;EO=1;GS=0;end
17  else if(~I[4]) begin Q=3;EO=1;GS=0;end
18  else if(~I[3]) begin Q=4;EO=1;GS=0;end
19  else if(~I[2]) begin Q=5;EO=1;GS=0;end
20  else if(~I[1]) begin Q=6;EO=1;GS=0;end
21  else if(~I[0]) begin Q=7;EO=1;GS=0;end
22  else begin Q=7;EO=0;GS=1;end
23  end
24 end
25 endmodule
1 //3-8译码器
 2 module decode3_8
 3 (
 4  input a,b,c,e1,e2,e3,
 5  output reg [7:0]Y
 6 );
 7 always @(a or b or c or e1 or e2 or e3)
 8 begin
 9  if((e1==1)&(e2==0)&(e3==0))
10  case({c,b,a})
11  0:Y=8'b11111110;
12  1:Y=8'b11111101;
13  2:Y=8'b11111011;
14  3:Y=8'b11110111;
15  4:Y=8'b11101111;
16  5:Y=8'b11011111;
17  6:Y=8'b10111111;
18  7:Y=8'b01111111;
19  default:Y=8'bX;
20  endcase
21  else
22  Y=8'b11111111;
23 end
24 endmodule
  • TRIGGER
1 //D触发器
 2 module dff
 3 (
 4  input clk,rst,d,
 5  output reg q
 6 );
 7 always @(posedge clk)
 8 begin
 9  if(rst)//同步复位信号
10  q<=0;
11  else
12  q<=d;
13 end
14 endmodule

EDA I.T基础架构方案 eda结构_verilog HDL_02

1 //采用行为描述方式的基本RS触发器(if语句嵌套)
 2 module RSff2
 3 (
 4   input R,S,
 5   output reg Q,QN    
 6 );
 7 always @(R or S)
 8     if({R,S}==2'b01)      begin Q<=0;QN<=1; end
 9     else if({R,S}==2'b10) begin Q<=1;QN<=0; end
10     else if({R,S}==2'b10) begin Q<=Q;QN<=QN; end
11     else                  begin Q<=1'bX;QN<=1'bX; end
12 endmodule
1 //采用结构描述方式的基本RS触发器(体现逻辑)
2 module RSff1
3 (
4   input R,S,
5   output reg Q,QN    
6 );
7 nand u1(Q,S,QN),
8         u2(QN,R,Q);
9 endmodule
1 //主从JK触发器
 2 module JKff2
 3 (
 4     input J,K,CP,
 5     output reg Q,QN
 6 );
 7 always @(negedge CP)
 8     if({J,K}==2'b00)    begin Q<=Q;QN<=QN; end
 9     else if({J,K}==2'b01)    begin Q<=0;QN<=1; end
10     else if({J,K}==2'b10)    begin Q<=1;QN<=0; end
11     else if({J,K}==2'b11)    begin Q<=~Q;QN<=~QN; end
12     else    begin Q<=1'bX;QN<=1'bX; end
13 endmodule
1 //T触发器
 2 module tff
 3 (
 4     input clk,t,
 5     output reg q
 6 );
 7 always @(posedeg clk)
 8 begin
 9     if(t==0)
10     q<=q;
11     else
12     q<=~q;
13 end
14 endmodule