笔记:FPGA与VHDL语言学习1

FPGA与VHDL语言学习1

目录

1.EDA,fpga,asic
2.CPLD与FPGA
3.设计一个三选一FPGA程序
4.使用由半加器与全加器程序生成一个f_adder全加器图形模块。试用4个f_adder模块组成一个4位全加器。
5.4~16译码器
6.设计乘法器

1.EDA技术与ASIC设计和FPGA开发有什么关系?
什么是综合?有哪些类型?综合在电子设计自动化中的地位是什么?

答:EDA是一门专业学科技术,ASIC是EDA中要实现电路,而FPGA是器件。综合:将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。
综合的分类:
1)自然语言综合
2)行为综合
3)逻辑综合
4)版图综合或结构综合

综合在电子设计自动化中的地位:
综合在电子设计自动化中是核心地位。综合器具有更复杂的工作环境,综合器在接受VHDL程序并准备对其综合前,必须获得与最终实现设计电路硬件特征相关的工艺库信息,以及获得优化综合的诸多约束条件信息;根据工艺库和约束条件信息,将VHDL程序转化成电路实现的相关信息。

1、CPLD与FPGA在内部硬件结构原理上有那些不同?
2、CPLD与FPGA芯片在实践应用中的选择有那些区别?

(1)内部硬件结构原理上:
FPGA:由LAB单元、可编程连线和IO控制块组成。一个LAB单元包含若干个LE模块。FPGA基于小单元(LE模块)。查找表是FPGA的基本逻辑单元。(每次输入信号查找对应结果,然后输出)。集成度高,内部触发器多。
CPLD:由宏单元、可编程连线、IO控制块组成。基于大单元。宏单元模块是CPLD的逻辑功能实现单元。输出可以选择D触发器,也可以通过其他路线。CPLD适合实现组合逻辑,在配合后面的触发器,也能实现一定的逻辑时序。
本质:CPLD是由组成电路构成,而FPGA像是一个巨大的查找表。
不同点:

1) CPLD的逻辑阵列更适合可重复编程的EEPROM或Flash技术来实现。而FPGA显然是利用SRAM技术更合适。
2) 由于是EEPROM或者Flash工艺决定了CPLD是有一定的擦写次数限制的。而FPGA在实际使用中几乎可以说是无配置次数限制。
3) CPLD由于采用的是EEPROM或者Flash工艺所以配置掉电后不丢失,也就不需要外挂配置芯片。而FPGA采用的是SRAM工艺,配置在掉电后就没有了,因此需要一个外部配置芯片。
4) CPLD由于不需要上电重新配置,所以上电后可以马上工作。而FPGA上电后需要配置时间,逻辑量的大小配置方式的区别也会影响配置时间的长短。
5) 由于CPLD的连续式布线结构,决定了它的时序延时是均匀和固定的。而FPGA采用的分段式布线结构造成了延时不固定。
6) 同样由于结构的差异,CPLD更适合完成的是复杂的组合逻辑,如编、译码的工作。而FPGA更适合做复杂的时序逻辑。换句话说就是FPGA更适合触发器丰富的逻辑结构,CPLD适合于触发器有限但是乘积项丰富的逻辑结构。
7)CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。
8)CPLD的速度比FPGA快,并且具有较大的时间可预测性。这是由于FPGA是门级编程,并且CLB之间采用分布式互联,而CPLD是逻辑块级编程,并且其逻辑块之间的互联是集总式的。

(2)实践应用上的不同点:
1) 由于工艺难度的差异,CPLD一般集成度较低,大多为几千门或几万门的芯片规模,做到几十万门已经很困难。而FPGA基于SRAM工艺,集成度更高,可以轻松做到几十万门甚至几百万门的芯片规模,最新的FPGA产品已经接近千万门的规模。

2) 也是由于工艺的原因,一般CPLD会比FPGA的功耗高

3) CPLD的安全性更高。由于配置芯片的存在,FPGA的保密性就会比CPLD略差。逻辑数据有可能被读取。(当然FPGA芯片会有一定的加密措施)

4)在编程上FPGA比CPLD具有更大的灵活性。CPLD通过修改具有固定内连电路的逻辑功能来编程,FPGA主要通过改变内部连线的布线来编程;FPGA可在逻辑门下编程,而CPLD是在逻辑块下编程。

5)CPLD比FPGA使用起来更方便。CPLD的编程采用E2PROM或FASTFLASH技术,无需外部存储器芯片,使用简单。而FPGA的编程信息需存放在外部存储器上,使用方法复杂。

6)fpga 的寄存器空间大于cpld可以实现的功能更多。

1、下载一个Quartus ii 13 版软件,在电脑上安装并破解,测试软件是否安装成功。
2、在quartus ii 软件安装成功后,参照学堂在线上的二选一FPGA程序的设计及波形图仿真结果,试设计一个三选一FPGA程序并进行波形图仿真。
3、将程序设计到完成仿真的操作过程的步骤(10个左右)整理成文本及仿真波形图结果截图。

1.要编写VHDL程序,首先建立一个工程
2.因为我们要做一个三选一电路选择器,将文件命名为MUX_3_1。
3.然后进行器件选择,在这里我们选择cyclone3型中的EP3C25F324C8器件。
4.最终成功建立了一个名为MUX_3_1的工程。
新建一个VHDL file以便我们一会儿编写三选一的代码。
5.当我们编写代码要注意:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
(这里是设计库和标准程序包)
ENTITY MUX_3_ IS
PORT(A,B,C,S0,S1 : IN STD_LOGIC;
Y : OUT STD_LOGIC);
END ENTITY MUX_3_1;
(这里是定义实体,实体的名字叫MUX_3_1,,名字应当与工程名字一致)
ARCHITECTURE BHV OF MUX_3_1 IS
SIGNAL S :STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
S <= S1 & S0;
PROCESS(S1,S0) BEGIN
  CASE (S) IS
 WHEN "00" => Y<=A ;
 WHEN "01" => Y<=B ;
 WHEN "11" => Y<=C ;
 WHEN OTHERS => NULL ;
  END CASE;
 END PROCESS;
END BHV ;
(这里是定义结构体表达,规定了程序的功能,
例如:当s0&s1为00时,将A的值赋给Y)

6.接下来我们对VHDL文件进行保存和编译
编译成功,没有错误,虽然有warning,但是我们可以先验证一下它是否能实现我们想要的功能。
7.如果不能实现就来重点看警告。让我们再对文件进行组建,成功之后为了验证我们的代码,我们新建一个波形文件
8.点击左侧空白处添加节点,选择node finder
9.点击LIST将需要的节点导入仿真波形的对话框中。
左侧是我们编程中的各个节点,右侧是它的波形。

10.我们再来设置一下输入的数据,选择方波,时长长短不一,其中时间应在10ns~100ns中选择

设置仿真器的模式为Quartus2 Simuliation
笔记:FPGA与VHDL语言学习1_第1张图片
11.最终运行一下,输出波形Y就会随着输入的变化而变化,
笔记:FPGA与VHDL语言学习1_第2张图片
12.让我们来仔细观察一下,当s1&s0为01时,Y与B路的电平相同都为低电平,因此,这个代码编写的没有错误。验证成功。

1、参考PPT第三章第四节,使用由半加器与全加器程序生成一个f_adder全加器图形模块。
2、试用4个f_adder模块组成一个4位全加器。对4位全加器仿真测试。把4位全加器设计图及仿真测试图通过作业系统上交,并说明仿真测试结果正确的理由。

笔记:FPGA与VHDL语言学习1_第3张图片
例如,在15ns-20ns之间,加数A=1101B=13,加数B=0001B=1,低位进位为0,因此结果S=1110B=14
笔记:FPGA与VHDL语言学习1_第4张图片

在20ns-25ns之间,加数A=1110B=14,加数B=0001B=1,低位进位为1,结果为16,溢出,因此S=0000B,且进位位Cout=1

Cout为Cin,A,B按位加法之后的进位位,因此,结果正确。

1、参考PPT第三章第五节的3~8译码器程序。试设计一个4~16译码器。把4~16译码器程序及仿真测试图通过作业系统上交,并说明仿真测试结果正确的理由。
我的答案:9分
笔记:FPGA与VHDL语言学习1_第5张图片

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY decoder4to16 IS

   PORT(din : IN STD_LOGIC_VECTOR (3 DOWNTO 0);

  dout : OUT BIT_VECTOR (15 DOWNTO 0));

END decoder4to16;

ARCHITECTURE behave OF decoder4to16 IS

BEGIN 
  dout<="0000000000000001" SLL CONV_INTEGER(din);

END behave;

在设计程序时:

1.首先定义设计库和标准程序包,为是用类型转换函数要打开程序包IEEE.STD_LOGIC_UNSIGNED.ALL

2.实体:定义din为四元素标准逻辑向量,din(0~3)都为标准逻辑位类型STD_LOGIC,dout同理位16元素标准逻辑向量

3.结构体:SLL是移位操作符,将位矢量左移,右面跟进的位补零。 第12句的意思是:将dout位矢量左移, 其中被位移部分要求是常数。(因此将din转换为整数类型CONV_INTEGER)从而实现4-16译码功能。

笔记:FPGA与VHDL语言学习1_第6张图片
在仿真波形中:

(1)验证功能时,看din第一个数据为0111=7,对应的dout为0000 0000 1000 0000,也就是dout[7]=1其他位为0,符合译码器功能。

(2)再看第二个数据验证,din第二个数据为1000=8,对应的dout为0000 0001 0000 0000,也就是dout[8]=1其他位为0,符合译码器功能。验证通过。

1、参考PPT第三章第五节的不同方法的乘法器程序,选择一个乘法器程序进行仿真测试。把乘法器程序及仿真测试图通过作业系统上交,并说明仿真测试结果正确的理由。
(1)sub.vhd是无符号乘法器

笔记:FPGA与VHDL语言学习1_第7张图片

它使用了程序包STD_LOGIC_UNSIGNED故在程序中的所有数据都做无符号处理, 在仿真的波形图可以看出它的运算结果都是无符号数。

笔记:FPGA与VHDL语言学习1_第8张图片

在如上的仿真图中,当输入C=0101=5,D=1001=9时,RA=C+D=E=14,RM=2D (H)=45 (O)=5*9,因此第一组正确;

当输入C=1100=12,D=1001=9时,RA=C+D=5 => (12+9-16)=5,RM=6C (H)=108(O)=12*9,因此第二组正确,验证完毕。

(2)COMP.vhd是有符号乘法器

笔记:FPGA与VHDL语言学习1_第9张图片

它与(1)不同的是,(2)用了另一种方式来定义符号类型。它的程序包含有STD_LOGIC_ARITH,

并将端口信号定义为SIGNED类型,因此,在仿真的波形图可以看出它的运算结果都是有符号数。

笔记:FPGA与VHDL语言学习1_第10张图片

在如上的仿真图中,

当输入C=0001=1,D=1001(补码)=-7时,C>D(C是正数大于负数),R=1,RA=C+D=-6=1010(补码)=A,RM=F9(H)=1111 1001(补码)=>=-7(O) ,第一组正确;

当输入C=0011=3,D=1001(补码)=-7时,C>D(C是正数大于负数),R=1,RA=C+D=-4=1100(补码)=C,RM=EB(H)=1110 1011(补码)=-21(O) ,因此第二组正确,验证完毕。

(3)移位相加型加法器

这个乘法器仅仅通过改变其中的参数S,即能增加乘法器的位数。 并且这个参数S的数值可以从外部,即顶层设计中传送进入,从而能在顶层设计中通过例化语句轻易改变此乘法器的尺寸。

笔记:FPGA与VHDL语言学习1_第11张图片

它的仿真图同无符号乘法器。

你可能感兴趣的:(fpga开发,驱动开发)