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 级电路是什么意思等等.现在我们就不会 ...
随机推荐
- iframe刷新以及自适应高度
A页面中的iframe链接到B页面在B页面调用这个可以刷新父页面的iframe self.location.reload(); <iframe src="admin-list.htm ...
- P1888 三角函数
题目描述 输入一组勾股数a,b,c(a≠b≠c),用分数格式输出其较小锐角的正弦值.(要求约分.) 输入输出格式 输入格式: 一行,包含三个数,即勾股数a,b,c(无大小顺序). 输出格式: 一行,包 ...
- Android中的事件分发机制
Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...
- Codeforces Round #493 (Div. 1) B. Roman Digits 打表找规律
题意: 我们在研究罗马数字.罗马数字只有4个字符,I,V,X,L分别代表1,5,10,100.一个罗马数字的值为该数字包含的字符代表数字的和,而与字符的顺序无关.例如XXXV=35,IXI=12. 现 ...
- css——应用多个样式
应用多个样式 在class中使用多个样式 在这是会有优先级关系问题 在上面的代码中,aa,bb,中的颜色会有冲突,到底显示的结果会是黄色还是绿色呢? 结果是绿色的.它是以程序执行的先后为优先级,后执行 ...
- GRUB 引导流程
GRUB(bootloader)引导流程: GRUB,GRand Unified Bootlader ,是一个来自GUN项目的多操作系统启动程序.GRUB是多启动规范的实现,它允许用户可以在计算机内 ...
- python3 列表操作
- 创建列表 #创建列表: list1 = [1, 2, 3, 4, 5] - 向列表中添加元素 - append # 向列表中添加元素: list1 = [1, 2, 3, 4, 5] list1. ...
- 为什么要清除BSS段
如题,看到uboot里有清除BSS段的代码,想知道这样做的目的是什么啊,BSS段默认值本来就是0了啊,希望大哥大姐们能详细的解说下,谢谢了 bss 段描述了未初始化的全局变量和静态变量的大小等信息,但 ...
- 常见的版本号及Springcloud的版本
谈谈软件版本号的认识 一.常见版本号说明 举个瓜:2.0.3 RELEASE 2:主版本号,当功能模块有较大更新或者整体架构发生变化时,主版本号会更新 0:次版本号.次版本表示只是局部的一些变动. 2 ...
- POI实现Excel2003插入多张图片
POI的操作Excel时,不可避免有操作图片的处理.怎么插入图片呢?网上也有不少介绍. 下面的代码是向Excel中插入多张图片的例子: public static void main(String[] ...