FPGA入门_fpga入门必看视频

2023-04-05 11:32:43

 

1.fpga入门视频教程

1.1 Verilog 教程Verilog HDL(简称 Verilog )是一种硬件描述语言,用于数字电路的系统设计可对算法级、门级、开关级等多种抽象设计层次进行建模Verilog 继承了 C 语言的多种操作符和结构,与另一种硬件描述语言 VHDL 相比,语法不是很严格,代码更加简洁,更容易上手。

2.fpga入门教程

Verilog 不仅定义了语法,还对语法结构都定义了清晰的仿真语义因此,Verilog 编写的数字模型就能够使用 Verilog 仿真器进行验证第一个 Verilog 设计4 位宽 10 进制计数器:实例

3.fpga入门指南

module counter10(//端口定义input rstn, //复位端,低有效input clk, //输入时钟output

4.fpga入门资料

[3:0] cnt, //计数输出output cout); //溢出位reg [3:0] cnt_temp ; //计数器寄存器

5.fpga入门的基础知识

always@(posedge clk ornegedge rstn) beginif(! rstn)begin//复位时,计时归0 cnt_temp <= 4b0 ;

6.fpga入门到精通

endelseif (cnt_temp==4d9) begin//计时10个cycle时,计时归0 cnt_temp <=4b000;endelse

7.fpga教程推荐

begin//计时加1 cnt_temp <= cnt_temp + 1b1 ; endendassign cout = (cnt_temp==4d9) ;

8.fpga快速入门

//输出周期位assign cnt = cnt_temp ; //输出实时计时器endmodule1.2 Verilog 简介Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。

9.fpga从入门到放弃

因此,在简化硬件设计任务、提高设计效率与可靠性、语言易读性、层次化和结构化设计等方面展现了强大的生命力与潜力发展历史1983 年,Verilog 最初由 Gateway Design Automation 公司(GDA)的 Phil Moorby 创建,作为内部仿真器的语言,主要用于逻辑建模和仿真验证,被广泛使用。

10.fpga初学者入门指点

1989 年,GDA 公司被 Cadence 公司收购,Verilog 语言成为 Cadence 公司的私有财产1990 年,Cadence 公司成立 OVI(Open Verilog International)组织,公开 Verilog 语言,促进 Verilog 向公众领域发展。

1992 年,OVI 决定致力于将 Verilog OVI 标准推广为 IEEE(The Institute of Electrical and Electronics Engineers)标准1995 年,OVI 的努力获得成功,IEEE 制定了 Verilog HDL 的第一个国际标准,即 IEEE Std 1364-1995,也称之为 Verilog 1.0。

2001 年,IEEE 发布 Verilog 第二个标准(Verilog 2.0),即 IEEE Std 1364-2001, 简称为 Verilog-2001 标准由于 Cadence 在集成电路设计领域的影响力及 Verilog 语言的简洁易用性,Verilog 成为电路设计中最流行的硬件描述语言。

主要特性下面是 Verilog 的主要特性:可采用 3 种不同的方式进行设计建模:行为级描述——使用过程化结构建模;数据流描述——使用连续赋值语句建模;结构化方式——使用门和模块例化语句描述两类数据类型:线网(wire)数据类型与寄存器(reg)数据类型,线网表示物理元件之间的连线,寄存器表示抽象的数据存储元件。

能够描述层次设计,可使用模块实例化描述任何层次用户定义原语(UDP)创建十分灵活原语既可以是组合逻辑,也可以是时序逻辑可提供显示语言结构指定设计中的指定端口到端口的时延,以及路径时延和时序检查Verilog 支持其他编程语言接口(PLI)进行进一步扩展。

PLI 允许外部函数访问 Verilog 模块内部信息,为仿真提供了更加丰富的测试方法同一语言可用于生成模拟激励和指定测试的约束条件设计逻辑功能时,设计者可不用关心不影响逻辑功能的因素,例如工艺、温度等。

……主要应用专用集成电路(ASIC),就是具有专门用途和特殊功能的独立集成电路器件Verilog 作为硬件描述语言,主要用来生成专用集成电路主要通过 3 个途径来完成:1、可编程逻辑器件FPGA 和 CPLD 是实现这一途径的主流器件。

他们直接面向用户,具有极大的灵活性和通用性,实现快捷,测试方便,开发效率高而成本较低2、半定制或全定制 ASIC通俗来讲,就是利用 Verilog 来设计具有某种特殊功能的专用芯片根据基本单元工艺的差异,又可分为门阵列 ASIC,标准单元 ASIC,全定制 ASIC。

3、混合 ASIC主要指既具有面向用户的 FPGA 可编程逻辑功能和逻辑资源,同时也含有可方便调用和配置的硬件标准单元模块,如CPU,RAM,锁相环,乘法器等1.3 Verilog 环境搭建分类Verilog 教程。

学习 Verilog 做仿真时,可选择不同仿真环境FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartus II;ASIC 开发环境有 Synopsys 公司的 VCS ;很多人也在用 Icarus Verilog 和 GTKwave 的方法,更加的轻便。

虽然 ISE 或者 Quartus II 都会自带仿真器,但功能还是有欠缺所以,这里介绍下 Quartus II + Modelsim 联合仿真的测试方法,运行环境为 64bit-win10 系统Quartus II 安装

本次介绍使用的 Quartus 版本为 10.1目前 Quartus II 官网已经没有 13.1 以下版本的安装包,大家可以安装 13.1 以上版本的软件功能都是大同小异,下载地址:https://fpgasoftware.intel.com/

13.1/?edition=subscription&platform=windows下载 13.1 以上的 quartus II 时,官网也会推荐相应版本的 Modelsim,一起下载即可开始安装,修改安装路径,其他按照默认设置一步步操作即可。

下图是成功安装的截图。

如果提示需要 License file,如下图所示,则需要指定购买该软件时的 license 文件。

如果 license 文件需要替换 Host-ID,只需要 license 文件中的 HOSTID 替换为 NIC 选项中随便一个 ID 即可,如下图红色框所示:

Quartus II 10.1 安装完还需要安装 Device,即安装支持各种可编程逻辑器件型号的库文件,否则 Quartus II 不能正常建立工程安装路径需要选择 Quartus II 的安装路径,此时 Device 安装可自动识别 Quartus II。

最新 Quartus II(例如 2016 版本)已经支持一套化安装了Modelsim 安装Modelsim 选择 modelsim-win64-10.1c-se 版本也需要修改下安装路径,然后按照默认设置进行操作即可。

安装完毕后可能提示需要重启电脑,重启即可。

建立 Quartus II 工程建立工程File->New project Wizard设置工作路径与工程名字、top module名字。注意,路径与名字设置时,不能包含中文。

选择器件型号我们只进行简单的仿真,不进行下载、烧录等,所以我们不用关心具体信号,随便选一种即可。然后一直点击 Next,直到 Finish。

新建 Verilog 源文件下面就对 4 位宽 10 进制计数器进行简单的仿真点击:File->New->Verilog HDL File->OK点击:File->Save As输入 module 名字为:counter10.v。

需要注意的是,top module 名字一定要和 project 名字一致,否则会报错(如图中所示)把 Verilog 代码复制到文件 counter10.v 中,进行一键编译(实际包含了编译、综合、布局布线等)。

报错时,可通过点击 Error log 来定位错误,进行修改,直至没有 Error。

Quartus II 调用 Modelsim 仿真仿真设置为 Modelsim-altera点击:Tool->Options->EDA Tool Options将 Modelsim 后面的地址改为 Modelsim 启动程序的路径。

选择仿真器点击:Assignments -> SimulationTool name 选择 ModelSim,并设置 Format、Time scale 等,如图。。

写 testbench 文件点击:Processing->start->Start TestBench Template Writer如果设置正确,会在工程路径 simulation/modelsim 下产生

.vt 文件.vt 文件模板已经给出了端口部分的代码、接口变量的声明和例化语句映射等我们要做的就是将测试代码填入到 testbench 合适的位置这里简单的写一下时钟、复位驱动代码,如下图所示

将 testbench 添加到工程中点击:Assignments -> Settings -> Simulation在 Compile test bench 选项中,选择 new,设置 Test bench name,并通过 File name 查找的方式,将上一步生成的 .vt 文件添加到工程中。

需要注意的是,testbench 文件名字需要和 testbench 里的 top module 名字保持一致,否则后续启动 Modelsim 时会报错,不能进行正常的仿真。

重新一键编译此时,你会发现,Tasks 栏编译的状态变成了问号,需要重新进行一键编译。

调用 Modelsim 仿真点击:Tools->Run simulation Tool->RTL Simulation这时就会自动启动 Modelsim 软件Modelsim 操作这里不做具体介绍由仿真图可知,我们的设计完成了 10 进制计数的基本功能。

总结记忆中,Quartus II + Modelsim 的联合仿真功能既强大,又安装方便几年后重新进行此过程,发现步骤也有些许繁琐,花费了我一晚上的时间来搞定很多细节也在上面提出,多多注意就好不过,大家以后有机会进行大型的数字模块仿真时,就会发现此方法的有效性。

在接下来的教程里,有些简单的仿真可能用其他软件进行,截图界面可能与 Modelsim 不一致大家看到后不用怀疑仿真的准确性,这里特别说明设计模块与 testbench 源码也会全部给出,大家完全可以自己仿真、验证。

1.4 Verilog 设计方法分类Verilog 教程设计方法Verilog 的设计多采用自上而下的设计方法(top-down)即先定义顶层模块功能,进而分析要构成顶层模块的必要子模块;然后进一步对各个模块进行分解、设计,直到到达无法进一步分解的底层功能块。

这样,可以把一个较大的系统,细化成多个小系统,从时间、工作量上分配给更多的人员去设计,从而提高了设计速度,缩短了开发周期

设计流程

Verilog 的设计流程,一般包括以下几个步骤:需求分析工作人员需要对用户提出的功能要求进行分析理解,做出电路系统的整体规划,形成详细的技术指标,确定初步方案例如,要设计一个电子屏,需要考虑供电方式、工作频率、产品体积、成本、功耗等,电路实现采用 ASIC 还是选用 FPGA/CPLD 器件等。

功能划分正确地分析了用户的电路需求后,就可以进行逻辑功能的总体设计,设计整个电路的功能、接口和总体结构,考虑功能模块的划分和设计思路,各子模块的接口和时序(包括接口时序和内部信号的时序)等,向项目组成员合理分配子模块设计任务。

文本描述可以用任意的文本编辑器,也可以用专用的 HDL 编辑环境,对所需求的数字电路进行设计建模,保存为 .v 文件功能仿真(前仿真)对建模文件进行编译,对模型电路进行功能上的仿真验证,查找设计的错误并修正。

此时的仿真验证并没有考虑到信号的延迟等一些 timing 因素,只是验证逻辑上的正确性逻辑综合综合(synthesize),就是在标准单元库和特定的设计约束的基础上,将设计的高层次描述(Verilog 建模)转换为门级网表的过程。

逻辑综合的目的是产生物理电路门级结构,并在逻辑、时序上进行一定程度的优化,寻求逻辑、面积、功耗的平衡,增强电路的可测试性但不是所有的 Verilog 语句都是可以综合成逻辑单元的,例如时延语句布局布线根据逻辑综合出的网表与约束文件,利用厂家提供的各种基本标准单元库,对门级电路进行布局布线。

至此,已经将 Verilog 设计的数字电路,设计成由标准单元库组成的数字电路时序仿真(后仿真)布局布线后,电路模型中已经包含了时延信息利用在布局布线中获得的精确参数,用仿真软件验证电路的时序单元器件的不同、布局布线方案都会给电路的时序造成影响,严重时会出现错误。

出错后可能就需要重新修改 RTL(寄存器传输级描述,即 Verilog 初版描述),重复后面的步骤这样的过程可能反复多次,直至错误完全排除FPGA/CPLD 下载或 ASIC 制造工艺生产完成上面所有步骤后,就可以通过开发工具将设计的数字电路目标文件下载到 FPGA/CPLD 芯片中,然后在电路板上进行调试、验证。

如果要在 ASIC 上实现,则需要制造芯片一般芯片制造时,也需要先在 FPGA 板卡上进行逻辑功能的验证2.1 Verilog 基础语法分类Verilog 教程格式Verilog 是区分大小写的格式自由,可以在一行内编写,也可跨多行编写。

每个语句必须以分号为结束符空白符(换行、制表、空格)都没有实际的意义,在编译阶段可忽略例如下面两中编程方式都是等效的不换行(不推荐)实例wire [1:0] results ;assign results = (a == 1b0) ? 2b01 : (b==1b0) ? 2b10 : 2b11 ;。

换行(推荐)实例wire [1:0] results ;assign results = (a == 1b0) ? 2b01 : (b==1b0) ? 2b10 : 2b11 ;注释Verilog 中有 2 种注释方式:

用 // 进行单行注释:reg [3:0] counter ; // A definition of counter register用 /* 与 */ 进行跨行注释:wire [11:0] addr ; /* Next are notes with multiple lines. Codes here cannot be compiled. */ assign addr = 12b0 ;

标识符与关键字标识符(identifier)可以是任意一组字母、数字、$ 符号和 _(下划线)符号的合,但标识符的第一个字符必须是字母或者下划线,不能以数字或者美元符开始另外,标识符是区分大小写的关键字是 Verilog 中预留的用于定义语言结构的特殊标识符。

Verilog 中关键字全部为小写实例reg [3:0] counter ; //reg 为关键字, counter 为标识符input clk; //input 为关键字,clk 为标识符input CLK;

//CLK 与 clk是 2 个不同的标识符2.2 Verilog 数值表示分类Verilog 教程数值种类Verilog HDL 有下列四种基本的值来表示硬件电路中的电平逻辑:0:逻辑 0 或 "假"

1:逻辑 1 或 "真"x 或 X:未知z 或 Z:高阻x 意味着信号数值的不确定,即在实际电路里,信号可能为 1,也可能为 0z 意味着信号处于高阻状态,常见于信号(input, reg)没有驱动时的逻辑结果。

例如一个 pad 的 input 呈现高阻状态时,其逻辑值和上下拉的状态有关系上拉则逻辑值为 1,下拉则为 0 整数数值表示方法数字声明时,合法的基数格式有 4 中,包括:十进制(d 或 D),十六进制(h 或 H),二进制(b 或 B),八进制(o 或 O)。

数值可指明位宽,也可不指明位宽指明位宽:实例4b1011 // 4bit 数值32h3022_c0de // 32bit 的数值其中,下划线 _ 是为了增强代码的可读性不指明位宽:一般直接写数字时,默认为十进制表示,例如下面的 3 种写法是等效的:。

实例counter = d100 ; //一般会根据编译器自动分频位宽,常见的为32bitcounter = 100 ;counter = 32h64 ;负数表示通常在表示位宽的数字前面加一个减号来表示负数。

例如:-6d15 -15-15 在 5 位二进制中的形式为 5b10001, 在 6 位二进制中的形式为 6b11_0001需要注意的是,减号放在基数和数字之间是非法的,例如下面的表示方法是错误的:。

4d-2 //非法说明实数表示方法实数表示方法主要有两种方式:十进制:30.123 6.0 3.0 0.001科学计数法:1.2e4 //大小为12000 1_0001e4 //大小为100010000 1E-3 //大小为0.001

字符串表示方法字符串是由双引号包起来的字符队列字符串不能多行书写,即字符串中不能包含回车符Verilog 将字符串当做一系列的单字节 ASCII 字符队列例如,为存储字符串 "http://www.runoob.com

", 需要 14*8bit 的存储单元例如:实例reg [0: 14*8-1] str ;initialbegin str = "http://www.runoob.com";end2.3 Verilog 数据类型

分类Verilog 教程Verilog 最常用的 2 种数据类型就是线网(wire)与寄存器(reg),其余类型可以理解为这两种数据类型的扩展或辅助线网(wire)wire 类型表示硬件单元之间的物理连线,由其连接的器件输出端连续驱动。

如果没有驱动元件连接到 wire 型变量,缺省值一般为 "Z"举例如下:实例wire interrupt ;wire flag1, flag2 ;wire gnd = 1b0 ; 线网型还有其他数据类型,包括 wand,wor,wri,triand,trior,trireg 等。

这些数据类型用的频率不是很高,这里不做介绍寄存器(reg)寄存器(reg)用来表示存储单元,它会保持数据原有的值,直到被改写声明举例如下:实例reg clk_temp;reg flag1, flag2 ;。

例如在 always 块中,寄存器可能被综合成边沿触发器,在组合逻辑中可能被综合成 wire 型变量寄存器不需要驱动源,也不一定需要时钟信号在仿真时,寄存器的值可在任意时刻通过赋值操作进行改写例如:实例

reg rstn ;initialbegin rstn = 1b0 ; #100 ; rstn = 1b1 ;end向量当位宽大于 1 时,wire 或 reg 即可声明为向量的形式例如:。

实例reg [3:0] counter ; //声明4bit位宽的寄存器counterwire [32-1:0] gpio_data; //声明32bit位宽的线型变量gpio_data

wire [8:2] addr ; //声明7bit位宽的线型变量addr,位宽范围为8:2reg [0:31] data ; //声明32bit位宽的寄存器变量data, 最高有效位为0

对于上面的向量,我们可以指定某一位或若干相邻位,作为其他逻辑使用例如:实例wire [9:0] data_low = data[0:9] ;addr_temp[3:2] = addr[8:7] + 1b1 ;。

Verilog 支持可变的向量域选择,例如:实例reg [31:0] data1 ;reg [7:0] byte1 [3:0];integer j ;always@* beginfor

(j=0; j<=3;j=j+1) begin byte1[j] = data1[(j+1)*8-1 : j*8]; //把data1[7:0]…data1[31:24]依次赋值给byte1[0][7:0]…byte[3][7:0]

endendVerillog 还支持指定 bit 位后固定位宽的向量域选择访问[bit+: width] : 从起始 bit 位开始递增,位宽为 width[bit-: width] : 从起始 bit 位开始递减,位宽为 width。

实例//下面 2 种赋值是等效的A = data1[31-: 8] ;A = data1[31:24] ;//下面 2 种赋值是等效的B = data1[0+ : 8] ;B = data1[0:7] ;

对信号重新进行组合成新的向量时,需要借助大括号例如:实例wire [31:0] temp1, temp2 ;assign temp1 = {byte1[0][7:0], data1[31:8]}; 。

//数据拼接assign temp2 = {32{1b0}}; //赋值32位的数值0 整数,实数,时间寄存器变量整数,实数,时间等数据类型实际也属于寄存器类型整数(integer)整数类型用关键字 integer 来声明。

声明时不用指明位宽,位宽和编译器有关,一般为32 bitreg 型变量为无符号数,而 integer 型变量为有符号数例如:实例reg [31:0] data1 ;reg [3:0] byte1 [7:0];

//数组变量,后续介绍integer j ; //整型变量,用来辅助生成数字电路always@* beginfor (j=0; j<=3;j=j+1) begin byte1[j] = data1[(j+1)*8-1 : j*8];

//把data1[7:0]…data1[31:24]依次赋值给byte1[0][7:0]…byte[3][7:0]endend此例中,integer 信号 j 作为辅助信号,将 data1 的数据依次赋值给数组 byte1。

综合后实际电路里并没有 j 这个信号,j 只是辅助生成相应的硬件电路实数(real)实数用关键字 real 来声明,可用十进制或科学计数法来表示实数声明不能带有范围,默认值为 0如果将一个实数赋值给一个整数,则只有实数的整数部分会赋值给整数。

例如:实例real data1 ;integer temp ;initialbegin data1 = 2e3 ; data1 = 3.75 ;endinitialbegin

temp = data1 ; //temp 值的大小为3end时间(time)Verilog 使用特殊的时间寄存器 time 型变量,对仿真时间进行保存其宽度一般为 64 bit,通过调用系统函数 $time 获取当前仿真时间。

例如:实例time current_time ;initialbegin #100 ; current_time = $time ; //current_time 的大小为 100

end数组在 Verilog 中允许声明 reg, wire, integer, time, real 及其向量类型的数组数组维数没有限制线网数组也可以用于连接实例模块的端口数组中的每个元素都可以作为一个标量或者向量,以同样的方式来使用,形如:。

[]对于多维数组来讲,用户需要说明其每一维的索引例如:实例integer flag [7:0] ; //8个整数组成的数组reg [3:0] counter [3:0] ; 。

//由4个4bit计数器组成的数组wire [7:0] addr_bus [3:0] ; //由4个8bit wire型变量组成的数组wire data_bit[7:0][5:0] ;

//声明1bit wire型变量的二维数组reg [31:0] data_4d[11:0][3:0][3:0][255:0] ; //声明4维的32bit数据变量数组下面显示了对数组元素的赋值操作:

实例flag [1] = 32d0 ; //将flag数组中第二个元素赋值为32bit的0值counter[3] = 4hF ; //将数组counter中第4个元素的值赋值为4bit 十六进制数F,等效于counter[3][3:0] = 4hF,即可省略宽度;

assign addr_bus[0] = 8b0 ; //将数组addr_bus中第一个元素的值赋值为0assign data_bit[0][1] = 1b1; //将数组data_bit的第1行第2列的元素赋值为1,这里不能省略第二个访问标号,即 assign data_bit[0] = 1b1; 是非法的。

data_4d[0][0][0][0][15:0] = 15d3 ; //将数组data_4d中标号为[0][0][0][0]的寄存器单元的15~0bit赋值为3虽然数组与向量的访问方式在一定程度上类似,但不要将向量和数组混淆。

向量是一个单独的元件,位宽为 n;数组由多个元件组成,其中每个元件的位宽为 n 或 1它们在结构的定义上就有所区别存储器存储器变量就是一种寄存器数组,可用来描述 RAM 或 ROM 的行为例如:实例reg

membit[0:255] ; //256bit的1bit存储器reg [7:0] mem[0:1023] ; //1Kbyte存储器,位宽8bitmem[511] = 8b0 ;

//令第512个8bit的存储单元值为0参数参数用来表示常量,用关键字 parameter 声明,只能赋值一次例如:实例parameter data_width = 10d32 ;parameter。

i=1, j=2, k=3 ;parameter mem_size = data_width * 10 ;但是,通过实例化的方式,可以更改参数在模块中的值此部分以后会介绍局部参数用 localparam 来声明,其作用和用法与 parameter 相同,区别在于它的值不能被改变。

所以当参数只在本模块中调用时,可用 localparam 来说明字符串字符串保存在 reg 类型的变量中,每个字符占用一个字节(8bit)因此寄存器变量的宽度应该足够大,以保证不会溢出字符串不能多行书写,即字符串中不能包含回车符。

如果寄存器变量的宽度大于字符串的大小,则使用 0 来填充左边的空余位;如果寄存器变量的宽度小于字符串大小,则会截去字符串左边多余的数据例如,为存储字符串 "http://run.runoob.com", 需要 14*8bit 的存储单元:

实例reg [0: 14*8-1] str ;initialbegin str = "http://run.runoob.com"; end有一些特殊字符在显示字符串中有特殊意义,例如换行符,制表符等。

如果需要在字符串中显示这些特殊的字符,则需要在前面加前缀转义字符 \ 例如下表所示:转义字符显示字符\n换行\t制表符%%%\\\""\ooo1到3个8进制数字字符其实,在 SystemVerilog(主要用于 Verilog 仿真的编程语言)语言中,已经可以直接用关键字 string 来表示字符串变量类型,这为 Verilog 的仿真带来了极大的便利。

有兴趣的学者可以简单学习下 SystemVerilog


以上就是关于《FPGA入门_fpga入门必看视频》的全部内容,本文网址:https://www.7ca.cn/baike/12365.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜