最近在学习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. jQuery插件开发的两种方法

    1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $. ...

  2. 解决:[WARNING] fpm_children_bury(), line 215: child 2736 (pool default) exited on signal 15 SIGTERM after 59.588363 seconds from start

    试用Nginx + PHP FastCGI 做WEB服务器,运行了几个月的时间,烦恼的是经常碰到Nginx 502 Bad Gateway 这个问题. 参考了很多修改办法,这个502的问题一直存在,今 ...

  3. Spark Streaming概念学习系列之SparkStreaming的高层抽象DStream

    不多说,直接上干货! SparkStreaming的高层抽象DStream 为了便于理解,Spark Streaming提出了DStream抽象,代表连续不断的数据流. DStream 是一个持续的R ...

  4. 关于app夜间模式那点事

    大半年没写过代码了 一直在忙一些其他的事情  这几天想起来看了一点  心惊肉跳的 发现好陌生  所以打算今后慢慢的拾起来  往深度和广度去发展 发现好久之前写的一个微博项目  有一个夜间模式的功能没有 ...

  5. 基于mysql主从同步的proxy读写分离

    mysql-proxy 简介 MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载 ...

  6. soapUI检查webServices接口的方法以及对自动触发线程的查询

    这几天需要熟悉接口传输过来的数据,因此会用到soapUI,但是没结果这个工具,然后百度了下,结合了下,下面是我对webservice在soapUI的展现: 1:其实说白了,就是我们不知道从接口里传输过 ...

  7. UVa 10106 Product 【大数相乘】WA

    虽然是错的代码,但是还是想贴出来,最开始WA发现是没有考虑到乘积为0的情况,后来把a*0,0*a,a*0---0(若干个0),0--0(若干个0)*a都考虑进去了:可是还是WA,实在不懂先留在这儿. ...

  8. Unity 脚本挂载位置

    原则:谁的脚本,挂载到谁身上 1,一般场景中会有个GameController脚本,挂在空物体上. 2,我见很多人脚本习惯挂到Camera上,好吧,不知算不算规范.

  9. zabbix-server端监控MySQL服务

    Zabbix 监控MySQL数据库 为server.zabbix,com 添加服务模块 创建MySQL服务图形 Server.zabbix.com 服务器操作 [root@server ~]# cd ...

  10. Kendo UI diagram 更改connnect线颜色,及shapes的属性值

    1.改diagram中连线的颜色:redraw一下就OK // Change the Line Green diagram.connections[indexS].redraw({ stroke:{ ...