FPGA基础概念_Verilog

这篇具有很好参考价值的文章主要介绍了FPGA基础概念_Verilog。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一、文件尾缀含义等常识

  1. sof文件时编译(分析、综合、布线、生成、时序)过程中生成的一个文件,可通过Jtag下载到FPGA的SRAM中去执行.

  2. pof文件生成过程同上,但不同之处在于不能直接下载到FPGA的SRAM中,需要通过ASP端口直接下载到FPGA的配置芯片中,配置芯片一般时串行FLASH,在上电时,FPGA会主动从配置芯片汇总读取并烧写内部的SRAM数据然后执行。

  3. jic文件不是在编译过程中生成的,而是需要使用QuartusII软件的Convert Programing File功能可将sof文件转换得到jic文件,可通过JTAG接口将jic文件通过FPGA作为桥接芯片下载到配置芯片中去。

    可以看出来jic文件的性质和pof文件的性质是一样的,都是固化在配置芯片中的,但是下载方式是不一样的,pof文件是直接通过ASP端口直接下载到配置芯片中去的,而jic文件需要通过FPGA作为桥接再下载到配置芯片中去,两种方法各有各的好处,使用jic文件省了一个ASP端口,使用pof文件不需要转换直接就能下载。

  4. .xcf 的缩写可能是 xilinx Constrains File,该文件作为设计项目的配置文件,用于保存项目的配置、约束等信息,同时也用于相关的版本控制管理等,且其他人员可通过xcf文件加载项目的设置和约束。

  5. adc文件为物理(引脚)约束文件 不同开发环境尾缀不同,

  6. lattice Diamond中以.lpf为引脚约束文件"Logical Processing File",即逻辑处理文件

  7. sdc文件为时序约束文件

  8. 当top source文件引用其他source文件中的module时,保存后会自动引用其他模块。

  9. Tcl全名Tool Command Language,是一种解释执行的脚本语言(解释执行就是边解释边执。TD 软件支持使用 tcl 脚本运行 Flow,可减少用户界面操作。

  10. mif 文件是一个纯文本 (ASCII) 文件,包含一个标题和一个数据部分。数据部分包含一组带有数字坐标的语句,这些语句定义了要可视化的实际图形,而文件头则宣布了格式版本,并包含可选的声明。MIF文件通常与相应的MID文件一起使用,MID文件包含文本数据,是MIF格式的一部分

  11. BUFG:全局缓冲,它的输入时IBUFG的输出,BUFG的输出达到FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小

  12. BUFGMUX:全局时钟选择缓冲:两个输入,一个选择则控制端,一个输出

  13. IDDR全称 input double date rate,可以将双沿(时钟的上升沿、下降沿)数据信号转换为单沿数据信号,通常使用在串转并数据设计中

  14. 综合就是将 HDL 语言设计转化为由与门、或门和非门等基本逻辑单元组成的门级连接。因此,可综合语句就是能够通过 EDA 工具自动转化成硬件逻辑的语句。

  15. 换句话说任何符合 HDL 语法标准的代码都是对硬件行为的一种描述,但不一定是可直接对应成电路的设计信息

  16. 0:逻辑 0 或“假”;1:逻辑 1 或“真”;x:未知;z:高阻。

  17. Verilog HDL 中的常量分为 3 类:整数型、实数型以及字符串型。下划线符号“_”可以随意用在整数和实数中,没有实际意义,只是为了提高可读性。例如:56 等效于 5_6。

  18. 根据 Verilog 语言的定义,实数通过四舍五入隐式地转换为最相近的整数。

  19. 数据类型用来表示数字电路硬件中的数据存储和传送元素。Verilog HDL 中总共有两大类数据类型:线网类型和寄存器类型线网类型主要表示Verilog HDL中结构化元件之间的物理连线,其数值由驱动元件决定;如果没有驱动元件连接到线网上,则其缺省值为高阻'z'。寄存器类型主要表示数据的存储单元,其缺省值为不定'x'。二者最大的区别在于:寄存器类型数据保持最后一次的赋值,而线网型数据则需要持续的驱动

  20. 线网数据类型包含不同种类的线网子类型,其中只有 wire、tri、supply0 和 supply1是可综合的

  21. 线网类型变量的赋值(也就是驱动)只能通过数据流“assign”操作来完成,不能用于always 语句中

  22. 除了“/”和“%”等算术运算受限外,所有的操作符都是可综合的。

二、Verilog关键字含义

`timescale 1ns / 1ps
//含义为:时延单位为1ns,时延精度为1ps。

关键字
module                                模块开始定义
input                                 输入端口定义
output                                输出端口定义
inout                                 双向端口定义
parameter                             信号的参数定义
wire wire                             信号定义
reg reg                               信号定义
always                                产生reg信号语句的关键字
assign                                产生wire信号语句的关键字
begin                                 语句的起始标志
end                                   语句的结束标志
posedge/negedge                       时序电路的标志
case                                  语句起始标记
default                               语句的默认分支标志
endcase                               语句结束标记
if if/else                            语句标记
else if/else                          语句标记
for for                               语句标记
endmodule                             模块结束定义

数字表达方式主要有三个部分:位宽、进制和数字。
位宽指数字常量的二进制宽度,进制表示数字的类型
例如:8'b00101000     //位宽为8的二进制表示,’b表示二进制
数据类型

线网类型和寄存器类型。线网类型主要表示 Verilog HDL 中结构化元件之间的物理连线,其数值由驱动元件决定;如果没有驱动元件连接到线网上,则其缺省值为高阻'z'。寄存器类型主要表示数据的存储单元,其缺省值为不定'x'。

二者最大的区别在于:寄存器类型数据保持最后一次的赋值,而线网型数据则需要持续驱动。

连续赋值只能读线网型变量进行赋值,而不能对寄存器变量进行赋值,且仅需赋值一次,始终有效

assign wire;固定搭配

过程赋值主要用于initial和always中,在过程块中只能使用过程赋值语句,即在always中不可能出现assign wire。

过程赋值
在硬件中,过程赋值语句表示用赋值语句右端表达式所推导出的逻辑来驱动该赋值语句左边表达式的变量。过程赋值语句只能出现在 always 语句和 initial 语句中。在 Verilog HDL 语法中有阻塞赋值和非阻塞赋值这两种过程赋值语语句。
        阻塞赋值

        阻塞赋值由符号“=”来完成,“阻塞赋值”由其赋值操作行为而得名:“阻塞”即是 说在当前的赋值完成前阻塞其他类型的赋值任务,但是如果右端表达式中含有延时语句,则在延时没结束前不会阻塞其他赋值任务。

        非阻塞
        非阻塞赋值由符号“<= ”来完成,“非阻塞赋值”也由其赋值操作行为而得名:在一个时间步(time step )的开始估计右端表达式的值,并在这个时间步( time step )结束时用 等式右边的值更新取代左端表达式。在估算右端表达式和更新左端表达式的中间时间段,其他的对左端表达式的非阻塞赋值可以被执行。
适用对象
        过程赋值语句只能对寄存器类型的变量(reg integer real time )进行操作,经过赋
值后,上面这些变量的取值将保持不变,直到另一条赋值语句对变量重新赋值为止。
连续赋值
        连续赋值语句只能用来对线网型变量进行赋值,而不能对寄存器变量进行赋值,其基本
的语法格式为:
        线网型变量类型 [ 线网型变量位宽 ] 线网型变量名;
一个线网型变量一旦被连续赋值语句赋值之后,赋值语句右端赋值表达式的值将持续对
被赋值变量产生连续驱动。只要右端表达式任一个操作数的值发生变化,就会立即触发对被
赋值变量的更新操作。
适用对象

        只能用来对线网型变量进行赋值。

三、一些思维思路

1、上升沿和缓存上升沿的区别,上升沿与上升沿之间的间隔为一个时钟周期,上升沿与缓存上升沿的间隔为一个系统时钟周期。

2、上升沿缓存,每次系统脉冲到来时,将新脉冲赋值给缓存,但因为是非阻塞赋值,与此同时,未更新的缓存保留的仍是上一个时钟脉冲到来时的数据,所以,在当次判断中缓存为缓存。

reg  sck_p;
  if(rst_n)
    sck_p <= 0;
  else 
    sck_p <= sck;

3、在Verilog中的上升沿与下降沿的捕获

reg[2:0] sck_in;// 时钟输入
wire postadge;//上升沿
wire negadge;//下降沿

assign postadge = (sck_in[1:0] == 2'b01)? 1'b1:1'b0;
assign negadge= (sck_in[1:0] == 2'b10)? 1'b1:1'b0;
always@*
if(rst_n)
sck_in <= 3'd0;
else
sck_in = {sck_in[1:0],sck};

4、波形图的查看

实际开发过程中需要知晓通讯的时序,否则无法实现通讯,可根据通信端MCU的参考手册进行配置。需要根据代码推理出实际的波形图,且能够根据理论波形与实际波形的差别反推出代码的错误之处。。

5、此外,在 Verilog 语言中还有一种重复操作符{{}},即将一个表达式放入双重花括号中,复制因子放在第一层括号中,为复制一个常量或变量提供一种简便记法。例如,{3{2'b01}}= 6'b010101。

6、在实际运算中,经常通过不同移位数的组合来计算简单的乘法和除法。例如 s1*20,因为 20=16+4,所以可以通过 (s1<<4)+(s1<<2 )来实现。

module amp19( 
 clk, din, dout 
 ); 
 input clk; 
 input [7:0] din; 
 output [11:0] dout; 
 
 reg [11:0] dint16; 
 reg [11:0] dint2; 
 reg [11:0] dint; 
 
 //将放大倍数 19 分解为 16+2+1 
 always @(posedge clk) begin 
 dint16 <= din << 4; 
 dint2 <= din << 1; 
 dint <= din; 
 end
 
 assign dout = dint16 + dint2 + dint;

7、一元约简运算符

约简运算符对单个操作数进行运算,最后返回一位数,其运算过程为:首先将操作数的第一位和第二位进行与、或、非运算;然后再将运算结果和第三位进行与、或、非运算;依次类推直至最后一位。

always @ (a) begin 
 out1 = & a; //与约简运算
 out2 = | a; //或约简运算
 out3 = ~& a; //与非约简运算
 out4 = ~| a; //或非约简运算
 out5 = ^ a; //异或约简运算
 out6 = ~^ a; //同或约简运算
 end

8、If_else

if 语句指定了一个有优先级的编码逻辑,而 case 语句生成的逻辑是并行的,不具有优先级。if 语句可以包含一系列不同的表达式,而 case 语句比较的是一个公共的控制表达式。通常 if-else 结构速度较慢,但占用的面积小,如果对速度没有特殊要求而对面积有较高要求,则可用 if-else 语句完成编解码。case 结构速度较快,但占用面积较大,所以用 case 语句实现对速度要求较高的编解码电路。嵌套的 if 语句如果使用不当,就会导致设计的更大延时,为了避免较大的路径延时,最好不要使用特别长的嵌套 if 结构。如想利用 if 语句来实现那些对延时要求苛刻的路径时,应将最高优先级给最迟到达的关键信号。

9、对循环的理解

始终要记得Verilog是一门硬件描述语言,所编写的代码最终经过EDA工具被翻译为基本的逻辑门电路组合,而在硬件电路中并没有循环电路的原型,因此在使用循环语句时要十分小心,必须要时刻注意其可综合性。

在硬件系统中,任何RTL级的描述都是需要占用资源的,因此必须确保循环是一个有限循环,否则设计将是不可综合的,因为任何硬件实现平台的资源都是有限的。

描述层次越抽象,将其转化为硬件实现的难度就越大,性能就越差,并且占用资源越多。

在循环语句中出现的变量都采用了阻塞赋值,这是因为在 always 语句中使用非阻塞赋值“<=”时,只有在 always 结束后才会把右端的值赋给左边的寄存器。如果采用非阻塞赋值,则会造成循环语句只执行一次;硬件设计并不追求代码的短小,而是设计的时序和面积性能等特征。文章来源地址https://www.toymoban.com/news/detail-768810.html

到了这里,关于FPGA基础概念_Verilog的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA开发基础之三段式状态机

    状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,程序的运行其本质也是状态机,根据输入完成输出,得到新的状态。 在平时硬件电路的设计中经常需要用到状态机,例如CPU的取指、译码、执行,这个流程可以使用状态机来控制

    2024年02月04日
    浏览(38)
  • FPGA控制ADS1256的ADC采集(一)

    最近在做一个项目,需要使用到高精度的ADC采集,由于项目对采集速率并没有太高的要求,所以就将成本尽可能地花在采样精度上,最后选择了TI的ADS1256这款比较热门的24位高精度AD芯片,调完后来写篇文章记录一下。 老规矩,在介绍如何用FPGA控制其进行AD转换之前先来聊聊

    2024年02月02日
    浏览(28)
  • FPGA开发基础篇之一(接口篇)UART串口

    写在前面 从本文开始,将连载fpga开发基础知识,将这几年浅显的fpga开发经验整理出来,一是梳理一下这几年给别人做fpga的经历,同时也是分享给大家,也希望大牛批评指正。 一、UART串口通信基本概念 串口通信是非常基本且应用十分广泛的低速通信接口,无论是在dsp、单片

    2024年02月02日
    浏览(54)
  • FPGA设计开发(基础课题):分频器设计

    一、设计目的 1、掌握分频器的设计原理; 2、用HDL语言设计分频器。 二、设计原理 分频器与计数器类似,也是要对时钟脉冲进行计数,但其输出的不是对时钟脉冲个数的计数值,而是其频率与时钟的频率成固定比例关系的脉冲信号。整数分频是所有分频器中最简单,最容易

    2024年02月13日
    浏览(42)
  • 基于FPGA的ADC7768数据采集系统设计

    基于FPGA的ADC7768数据采集系统设计 随着科技的不断发展,数字信号处理在各个领域中的应用越来越广泛。而模拟信号的采集和转换成数字信号是数字处理的第一步。本文将介绍基于FPGA的ADC7768数据采集系统设计,该系统能够高效、准确地采集模拟信号并将其转换为数字信号。

    2024年02月11日
    浏览(37)
  • ADC采集方法 - 基于LVDS接口的FPGA实现

    ADC采集方法 - 基于LVDS接口的FPGA实现 在数字信号处理和通信系统中,模数转换器(ADC)是最基本、最重要的电子器件之一。一种广泛应用的ADC采集方案是使用低电压差分信号(LVDS)接口。这种接口可以提供较高的信噪比和抗干扰性能,在数据传输距离远的情况下也表现出色。

    2024年02月03日
    浏览(29)
  • Vivado中的COE文件:FPGA开发指南

    COE文件是Vivado软件中用于初始化存储器内容的一种常见文件格式。在FPGA开发过程中,我们经常需要对存储器进行初始化,以存储初始数据或者程序代码。COE文件提供了一种简单而灵活的方式来定义存储器的初始内容。本文将介绍COE文件的使用方法,并提供相应的示例代码。

    2024年02月06日
    浏览(45)
  • FPGA设计开发(基础课题):七人表决器设计

    一、设计目的 1、熟悉MAX+PLUSⅡ、QUARTUSⅡ软件的使用; 2、熟悉EDA/SOPC、FPGA基本结构; 3、熟悉EDA开发的基本流程。 二、设计原理 所谓表决器就是对于一件事,由多个人投票,如果同意的票数过半,就认为此事可行;否则如果否决的票数过半,则认为此事不行。 七人表决器顾

    2024年02月08日
    浏览(67)
  • ADC测试杂谈二:matlab操作串口向FPGA发信

     何以解忧,唯有串口。  相关文章:  ADC测试杂谈一:配置基于matlab+quartus的测试环境  之前提到,FPGA的JTAG相比MCU的UART,读取数据的速度更快。但是matlab 似乎 只能通过JTAG收信,而不能通过JTAG向FPGA发信。为了便于通过FPGA向芯片写一些配置信息,我们采用UART串口来向

    2024年02月10日
    浏览(33)
  • ISE Bit文件转换为MCS文件——FPGA开发指南

    ISE Bit文件转换为MCS文件——FPGA开发指南 在FPGA(现场可编程门阵列)开发中,经常需要将ISE Bit文件转换为MCS文件,以便在FPGA上进行编程和配置。本文将介绍如何进行这一过程,并提供相应的源代码示例。 一、什么是ISE Bit文件和MCS文件? ISE(Integrated Software Environment)是Xi

    2024年01月24日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包