最近在学习FPGA,感觉语言的学习到时很容易,但是由于缺乏电路图的硬件知识,所以看起来比较难懂,下面是对FPGA中仿真的一点理解,以后需要学习的地方还有很多啊。

一、使用ISE环境进行FPGA系统设计的时候,仿真是一个必不可少的步骤,即仿真过程是正确实现设计的关键环节,有两种:

1.功能仿真 (前仿真 ):在设计实现前对所创建的逻辑进行的验证其功能是否正确的过程,即布局布线以前的仿真。
2.时序仿真(后仿真):指布局布线后仿真,因为加入了线延迟信息,所以这一步的仿真和真正芯片的行为最接近,也是用于仿真芯片时序约束是否添加正确,布局布线后是否还满足时序等。

相同:两者仿真使用的仿真器是相同的, 所需的流程和激励也是相同的;

不同:时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时, 并且在仿真结果波形图中,时序仿真后的信号加载了时延, 而功能仿真没有。

ISE环境中前后仿真的选项:

以一个ALU的实现功能为例分析前后仿真的不同,其前仿真和后仿真的结果图为:

前仿真图

后仿真图

从时序仿真图可以看出,后仿真存在着延迟。本实验中存在的延迟也就是几ns,但是频率很高的时候,延迟可能会达到一个或者几个周期,这就要求工作频率不能超过最高工作频率。那么最高频率怎么计算呢?

二、计算最大工作频率

首先需要知道FPGA中存在 的延时有哪些,下面是常用的四种:

1、纯组合逻辑延时(输入引脚到输出引脚),如图:

2、输入引脚到同步元件之间的延时,如图delay2

3、同步元件到输出引脚之间的延时,如图delay3

4、不同时钟Clk1和Clk2之间的异步延时,如图delay4

我们知道,几乎所有的FPGA设计平台都包含静态时序分析工具,利用这类工具可以获得映射或布局布线后的时序分析报告,从而对设计的性能做出评估。

工作频率的计算受到时序延时delay1、 delay2、 delay3、 delay4的影响。在影响工作频率的参数中,由于针对某一个器件delay2  和delay3  是固定的,因此我们在设计中需要考虑的参数主要就是delay1  和delay4。从静态分析报告中我们可以得到工作频率的最大值,就是时序分析报告中所有延时的最大值。如果工作频率大于该值,则可能出现延时一个或几个周期的情况,从而导致输出结果错误。

上述仿真时序图的源码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all; entity ALU is port ( CLK : in STD_LOGIC ;
OP_CODE : in STD_LOGIC_VECTOR ( downto ) ;
A,B : in STD_LOGIC_VECTOR ( downto ) ;
C_IN : in STD_LOGIC;
EN : in STD_LOGIC;
Y : out STD_LOGIC_VECTOR ( downto ) ); end ALU; architecture Behavioral of ALU is signal OP_CODE_CI : STD_LOGIC_VECTOR ( downto ); begin OP_CODE_CI <= OP_CODE & C_IN ;
process ( CLK ) begin
if rising_edge ( CLK ) then
if (EN = '') then
case OP_CODE_CI is
when "" => Y <= A;
when "" => Y <= A + ;
when "" => Y <= A + B ;
when "" => Y <= A + B + ;
when "" => Y <= A + not B ;
when "" => Y <= A + not B + ;
when "" => Y <= A - ;
when "" => Y <= A ;
when "" => Y <= A and B ;
when "" => Y <= A or B ;
when "" => Y <= A xor B ;
when "" => Y <= not A ;
when "" => Y <= (others => '') ;
when others => Y <= (others => 'X' );
end case;
end if;
end if ;
end process; end Behavioral;

Test Bench的测试激励:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL; ENTITY ALU_test IS
END ALU_test; ARCHITECTURE behavior OF ALU_test IS COMPONENT ALU
PORT(
CLK : IN std_logic;
OP_CODE : IN std_logic_vector( downto );
A : IN std_logic_vector( downto );
B : IN std_logic_vector( downto );
C_IN : IN std_logic;
EN : IN std_logic;
Y : OUT std_logic_vector( downto )
);
END COMPONENT; signal OP_CODE_SIG : STD_LOGIC_VECTOR( downto ):= (others => '');
signal A_SIG : STD_LOGIC_VECTOR( downto ):= "" ;
signal B_SIG : STD_LOGIC_VECTOR( downto ):= "" ;
signal C_IN_SIG : STD_LOGIC := '';
signal EN_SIG : STD_LOGIC := '';
signal Y_SIG : STD_LOGIC_VECTOR( downto );
signal CLK : STD_LOGIC := '' ;
signal OP_CODE_CI_SIG : STD_LOGIC_VECTOR ( downto ) := (others => '') ; BEGIN OP_CODE_SIG <= OP_CODE_CI_SIG( downto );
C_IN_SIG <= OP_CODE_CI_SIG();
UUT: ALU port map(
OP_CODE => OP_CODE_SIG,
A => A_SIG,
B => B_SIG,
C_IN => C_IN_SIG,
Y => Y_SIG,
EN => EN_SIG,
CLK => CLK);
CLK <= not CLK after ns; process
begin
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait for ns;
OP_CODE_CI_SIG <= ""; wait;
end process;
END;

FPGA初学之前后仿真分析的更多相关文章

  1. FPGA初学心得

    有三种方法在模块中产生逻辑:1.使用连续赋值语句“assign”:2.用实例元件 3.用“always”块.所以在always块中赋值不能使用assign,而是直接给变量赋值就行. reg与wire的 ...

  2. 初学FPGA一些建议

    数字电路: 这是大学里的基本课程 ,涵盖了一般数字电路的组合电路.时序电路.寄存器传输.储存器以及可编程逻辑电路(FPGA 就是其中一种),还有比较好的添加了计算机的指令集结构.处理器设计等计算机方面 ...

  3. 初学FPGA

    刚开始感觉FPGA不过也就是和51,ARM单片机那样写写程序就完事了,现在看来根本不是那么回事.从夏宇闻老师的Verilog HDL,黑金教程开始学起,但是感觉看到黑金时序篇时感觉少点什么,原来是缺少 ...

  4. 初学FPGA图像处理,开发板选择建议

    我用的是ZYNQ7010的开发板,纯粹是入门学习,对于初学者,使用较多的xlinx入门级的开发板一般是zynq7000系列,淘宝上买的较好的是黑金和米联科,我买的就是黑金的,个人觉得教程很少,学习资料 ...

  5. altera soc体验之旅 FPGA与ARM的窃窃私语

      喜大普奔,公司要评估用SOC做产品,我就自然而然的被安排了学习和评估的工作,于是,每天的工作就是开始研究soc了.其实,只要能静下心来学习,一切都还是能够弄出来的. 以前像个无头苍蝇一样到处乱撞, ...

  6. FPGA学习之路——一路走来

    既然选择了远方,便不顾风雨兼程,一路走下去. —韩彬 在看bingo的书时,看到这样写到.做什么事情都不容易,学习也是,所以一个词很重要不忘初心.作为一名大二的学生,我很高兴能够将自己学习FPGA的过 ...

  7. 【安富莱STM32H7教程】第1章 初学STM32H7的准备工作

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第1章   初学STM32H7的准备工作 俗话说万事开头 ...

  8. 数字信号处理专题(2)——利用FPGA进行基本运算及特殊函数定点运算

    一.前言 FPGA以擅长高速并行数据处理而闻名,从有线/无线通信到图像处理中各种DSP算法,再到现今火爆的AI应用,都离不开卷积.滤波.变换等基本的数学运算.但由于FPGA的硬件结构和开发特性使得其对 ...

  9. 我的 FPGA 学习历程(12)—— 电子钟项目准备

    初学 FPGA 的时候,我们总是存在很多疑问,比如:xilinx 和 altera 的 FPGA 那种比较好.verilog 语言被如何综合成具体硬件电路.RTL 级电路是什么意思等等.现在我们就不会 ...

随机推荐

  1. C++中的pair,make_pair学习

    std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型.例如std::pair<int,float> 或者 std::pair<double,do ...

  2. JQuery 登录窗口的布局

    <!-- Button trigger modal --><button type="button" class="btn btn-primary bt ...

  3. C# MVC登录判断状态

    public class AuthenAdminAttribute:FilterAttribute,IAuthorizationFilter { public void OnAuthenticatio ...

  4. JavaScript基础知识-正则表达式

    正则表达式 作用:定义一个特定的验证字符串内容规则的表达式 注:正则表达式并不是JavaScript独有的:JavaScript支持正则表达式 var a = { };  // 定义一个空对象     ...

  5. Unity碰撞和触发的区别

    碰撞的必要条件: 2个都有Collider,且至少有一个刚体.带刚体的身上会检测OnCollision事件,stay就是2个一直在碰着. 触发的必要条件: 至少有一个碰撞器勾选了IsTrigger,至 ...

  6. 树莓派使用samba

    tips:打算利用树莓派做局域网内的文件共享服务器, 实测发现树莓派挂载一个硬盘比较合适,挂载多个硬盘则会出现供电不足而挂载失败, 即使利用外置供电接入多个硬盘实测效果也不好,树莓派在IO上无法处理多 ...

  7. sklearn学习4----预处理(1)标准化

    一.[标准化]scale: 1.导入模块  from sklearn.preprocessing import scaler 2.作用:直接将给定数据进行标准化 3.使用代码 X_scaled=sca ...

  8. AMD包下载及使用

    AMD下载 下载地址 选择837.zip下载即可,将837.zib考入相应的文件夹下,并解压缩 wget http://netlib.org/toms/837.zip unzip 837.zip cd ...

  9. koa,express,node 通用方法连接MySQL

    这个教程不管node,express,koa都可以用下面方法连接,这里用koa做个参考 这个教程的源码地址: https://github.com/xiaqijian/... 新建文件目录,我是这样子 ...

  10. vue 阿里云上传组件

    vue 阿里云上传组件 Vue.js上传图片到阿里云OSS存储 测试项目git地址 本测试项目启动方法 示例链接 组件配置项 实践解释 本文主要介绍如何 在vue项目中使用web 直传方式上传阿里云o ...