FPGA初学之前后仿真分析
最近在学习FPGA,感觉语言的学习到时很容易,但是由于缺乏电路图的硬件知识,所以看起来比较难懂,下面是对FPGA中仿真的一点理解,以后需要学习的地方还有很多啊。
一、使用ISE环境进行FPGA系统设计的时候,仿真是一个必不可少的步骤,即仿真过程是正确实现设计的关键环节,有两种:
相同:两者仿真使用的仿真器是相同的, 所需的流程和激励也是相同的;
不同:时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时, 并且在仿真结果波形图中,时序仿真后的信号加载了时延, 而功能仿真没有。
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初学之前后仿真分析的更多相关文章
- FPGA初学心得
有三种方法在模块中产生逻辑:1.使用连续赋值语句“assign”:2.用实例元件 3.用“always”块.所以在always块中赋值不能使用assign,而是直接给变量赋值就行. reg与wire的 ...
- 初学FPGA一些建议
数字电路: 这是大学里的基本课程 ,涵盖了一般数字电路的组合电路.时序电路.寄存器传输.储存器以及可编程逻辑电路(FPGA 就是其中一种),还有比较好的添加了计算机的指令集结构.处理器设计等计算机方面 ...
- 初学FPGA
刚开始感觉FPGA不过也就是和51,ARM单片机那样写写程序就完事了,现在看来根本不是那么回事.从夏宇闻老师的Verilog HDL,黑金教程开始学起,但是感觉看到黑金时序篇时感觉少点什么,原来是缺少 ...
- 初学FPGA图像处理,开发板选择建议
我用的是ZYNQ7010的开发板,纯粹是入门学习,对于初学者,使用较多的xlinx入门级的开发板一般是zynq7000系列,淘宝上买的较好的是黑金和米联科,我买的就是黑金的,个人觉得教程很少,学习资料 ...
- altera soc体验之旅 FPGA与ARM的窃窃私语
喜大普奔,公司要评估用SOC做产品,我就自然而然的被安排了学习和评估的工作,于是,每天的工作就是开始研究soc了.其实,只要能静下心来学习,一切都还是能够弄出来的. 以前像个无头苍蝇一样到处乱撞, ...
- FPGA学习之路——一路走来
既然选择了远方,便不顾风雨兼程,一路走下去. —韩彬 在看bingo的书时,看到这样写到.做什么事情都不容易,学习也是,所以一个词很重要不忘初心.作为一名大二的学生,我很高兴能够将自己学习FPGA的过 ...
- 【安富莱STM32H7教程】第1章 初学STM32H7的准备工作
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第1章 初学STM32H7的准备工作 俗话说万事开头 ...
- 数字信号处理专题(2)——利用FPGA进行基本运算及特殊函数定点运算
一.前言 FPGA以擅长高速并行数据处理而闻名,从有线/无线通信到图像处理中各种DSP算法,再到现今火爆的AI应用,都离不开卷积.滤波.变换等基本的数学运算.但由于FPGA的硬件结构和开发特性使得其对 ...
- 我的 FPGA 学习历程(12)—— 电子钟项目准备
初学 FPGA 的时候,我们总是存在很多疑问,比如:xilinx 和 altera 的 FPGA 那种比较好.verilog 语言被如何综合成具体硬件电路.RTL 级电路是什么意思等等.现在我们就不会 ...
随机推荐
- 【转】Docker基础
一.简介 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的CGroup.Namespace.Union FS等技术实现的一种系统级虚拟化技术. 特性 更高效的利用系统资源: ...
- C#比较二个数组并找出相同或不同元素的方法
这篇文章主要介绍了C#比较二个数组并找出相同或不同元素的方法,涉及C#针对数组的交集.补集等集合操作相关技巧,非常简单实用, 具有一定参考借鉴价值,需要的朋友可以参考下 " }; " ...
- [实例]ROS使用OpenCV读取图像并发布图像消息在rviz中显示
思路: (1)使用opencv读取本地图像 (2)调用cv_bridge::CvImage().toImageMsg()将本地图像发送给rviz显示 一.使用opencv读取本地图像并发布图像消息 ( ...
- 在 Ubuntu 15.04 上安装 Android Studio(极其简单)
sudo apt-add-repository ppa:paolorotolo/android-studio sudo apt-get update sudo apt-get install andr ...
- AVL数
平衡二叉树(AVL树) AVL树是一种二叉搜索树,并且每个节点的左右子树高度之差最多为1.AVL树是第一个在最坏的情况下保证以O(logn)的时间进行搜索,插入和删除操作的数据结构,AVL树能在对数时 ...
- android studio开发去掉titlebar
android:theme="@style/AppTheme"换成android:theme="@style/Theme.AppCompat.NoActionBar&qu ...
- mac 调整Launchpad行列数目
Mac调整Launchpad 行数和列数 开打Terminal终端依次输入以下三句: <1> 改变行数:defaults write com.apple.dock springboard ...
- Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题
题意: 给你一个长度为 nnn 的 010101串 ,你有两种操作: 1.将一个子串翻转,花费 XXX 2.将一个子串中的0变成1,1变成0,花费 YYY 求你将这个01串变成全是1的串的最少花费. ...
- 路飞学城Python-Day34
01-MySQL-开篇 数据库:数据库就是数据存储的仓库,数据想要永久存储只能放在文件中,如果忽略文件的存储的效率问题,文件的组件全部都存放在一台机器上,那么文件数据就可以存储在一台机器上,但是这样做 ...
- postgressql sql查询拼接多个字段为一个字段查询出来
表年份 月份 数据1 数据22000 1 1 12000 2 2 12001 2 2 2 2001 5 5 4 希望的查询结果如下所示: 时间 数据1 数据22000年1月 1 12000年2月 2 ...