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 级电路是什么意思等等.现在我们就不会 ...
随机推荐
- QEMU/KVM磁盘在线备份
QEMU/KVM磁盘的在线完整及增量备份,是"打包"方案的一种具体实现,可实现基于时间点的备份,同时支持本地与远程2种备份方式,并可指定备份文件进行恢复. tag: qemu, k ...
- 20个非常有用的Java程序片段--转
原文地址:http://geek.csdn.net/news/detail/236591 下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 String a = ...
- usaco No Change, 2013 Nov 不找零(二分查找+状压dp)
Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身 ...
- LeetCode Golang 9.回文数
9. 回文数 第一种办法 :itoa 转换为字符串进行处理: package main import ( "strconv" "fmt" ) //判断一个整数是 ...
- LeetCode Golang 2. 两数相加
2. 两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- 关于使用css伪类实现小图标
效果: .person_use>span{ display:block; width:0; height:0; border-width:10px; border-style:solid; bo ...
- crm需求分析步骤
# CRM开发顺序# 需求分析# 思维导图# 业务场景分析#-------------------------------------## 原型图(Demo)# Axure#------------- ...
- Someing-About-Work
投料分拨次评估1.调试线投料分波次:(由调试厂录入生产计划:按照实际装机计划做二次分拣)1)计划组必须改两次工单:因为使用的是不同的任务号,一次一次分拣,一次二次分拣,2)计划核对数量困难,不能按照制 ...
- Centos7下安装Mongodb
Mongodb网盘路径:链接:https://pan.baidu.com/s/1rWJCPZ59EAW25ha1UF5czw 密码:u3zq 1.把安装包上传到linux服务器上,解压,然后我们把mo ...
- 一篇文章彻底弄懂Base64编码原理(转载)
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...