EDA学习大纲

    • 概念
      • 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语言转换成网表文件
          • 仿真器
            • 验证逻辑功能
            • 验证时序功能
          • 适配器(布局布线器)
            • 完成目标系统在器件上的布局布线
          • 下载器
            • 将设计下载到对应的实际器件
            • 实现硬件设计
    • 基础程序实例
      • 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
      • 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
         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

猜你喜欢

转载自www.cnblogs.com/lizlizliang/p/12037387.html
今日推荐