FPGA开发基础知识

FPGA开发基础知识

    • FPGA介绍
    • FPGA硬件内部结构
    • FPGA开发流程
    • 数字信号和模拟信号的定义
    • 常用数据类型
    • IP核的使用
    • Verilog HDL基本语法
    • 注意点
    • 结束语

FPGA介绍

FPGA是一种数字集成电路芯片,英文全称为Field Programmable Gate Array,中文名称为“现场可编程逻辑门阵列”。FPGA是数字电路的物理实现方式之一[1]。与数字电路的另一种重要实现方式ASIC(Application Specific Integrated Circuit,专用集成电路)芯片相比,FPGA的一项重要特点是其可编程特性,即用户可通过程序指定FPGA实现某一特定数字电路。

FPGA硬件内部结构

1.可编程输入输出单元(IOB)(input output block)
2.可配置逻辑块(CLB)(configurable logic block)
3.嵌入式块ARM(BRAM) (block RAM)
4.互连线资源(interconnect)
5.底层内嵌功能单元
6.内嵌专用模块

FPGA开发流程

1.设计规划
2.设计输入 [原理图/程序代码]
3.功能仿真 [综合前仿真] (run behavioral simulation)
4.综合 (run synthesis)
5.仿真验证 [综合后仿真] (run post-synthesis function simulation)
6.实现 [翻译、映射、布局布线] (run implementation)
7.时序仿真 [后仿真] (run post-implementation timing simulation)
8.生成bit文件
9.FPGA配置

数字信号和模拟信号的定义

  1. 数字信号 ,是指幅度的取值是离散的,幅值表示被限制在有限个数值之内。
  2. 模拟信号 是指在时域上数学形式为连续函数的信号,可以取得连续值。

常用数据类型

一、变量
1.reg型:寄存器数据类型,常用来表示always模块内的指定信号,常代表触发器,在always模块内被赋值的每一个信号都必须定义成reg型。reg型变量具有状态保持功能,在新的幅值语句执行以前,reg型变量的值一直保持原来的值。
2.wire型:通常表示一种电气连接,采用wire类型表示逻辑门和模块之间的连线。常用来表示用以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认时自动定义为wire型。wire型可以用做任何方程式的输入,也可以用做assign语句或实例元件的输出。

二、常量
1.整数
   二进制b 八进制o 十进制d 十六进制h
2.x 和 z值
x:不定值
z:高阻态
3.参数(parameter)型
在Verilog HDL中,用parameter定义一个标识符,来代表一个常量,称为符号常量,即标识符形式的常量。其说明格式如下:
parameter 参数1名=表达式。参数名2=表达式,… ,参数名n=表达式;
parameter 参数1名=表达式。参数名2=表达式,… ,参数名n=表达式;

IP核的使用

打开IP核的窗口:IP catalog
以乘法器multiplier核为例:
1.搜索multiplier,双击打开
2.点击左上角documentation,可以打开该IP核的使用手册查询,在当前页面对IP核进行配置
3.调用IP核:
   ①选择IP sources ,展开并选择mult_gen_0 — instantiation template — mult_gen_0.veo,可以打开实例化模块文件
   ②可以在框图中画原理图,在框图页面空白处直接add IP ,直接导出来手动连线即可。也可以用例化语句,直接将实例化模块文件复制过去更改一下即可。

Verilog HDL基本语法

它能在系统级、算法级、寄存器传输级、逻辑级、门级、电路开关级等多种抽象设计层次上描述数字电路。

**1.模块 **

一个模块由两部分组成,一部分描述端口,另一部分描述逻辑功能

/*
module 模块名(端口);
    端口列表及定义;
    assign  描述电路器件的内部逻辑功能或电路结构;
endmodule
*/

module clk_div(clk_100MHz,clk_200Hz,clk_10Hz,clk_1Hz);
    input clk_100MHz;
    output clk_200Hz,clk_10Hz,clk_1Hz;
    
    reg[17:0]cnt_200Hz;
    reg[8:0]cnt_10Hz;
    reg[9:0]cnt_1Hz;
    reg clk_1KHz_reg;
    reg clk_200Hz_reg;
    reg clk_10Hz_reg;
    reg clk_1Hz_reg;
    initial
        begin
            cnt_10Hz=0;
            cnt_1Hz=0;
            clk_200Hz_reg=0;
            clk_10Hz_reg=0;
            clk_1Hz_reg=0;
        end
    always@(posedge clk_100MHz)
        begin
            if(cnt_200Hz==18'h3D08F)
                begin
                    clk_200Hz_reg<=~clk_200Hz_reg;
                    cnt_200Hz<=0;
                end
            else
                cnt_200Hz<=cnt_200Hz+1;
        end
        
    always@(posedge clk_200Hz)
        begin
            if(cnt_10Hz==4'h9)
                begin
                    clk_10Hz_reg<=~clk_10Hz_reg;
                    cnt_10Hz<=0;
                end
            else
                cnt_10Hz<=cnt_10Hz+1;
        end
    always@(posedge clk_200Hz)
        begin
            if(cnt_1Hz==7'h63)
                begin
                    clk_1Hz_reg<=~clk_1Hz_reg;
                    cnt_1Hz<=0;
                end
            else    
                cnt_1Hz<=cnt_1Hz+1;
        end
        
    assign clk_200Hz=clk_200Hz_reg;
    assign clk_10Hz=clk_10Hz_reg;
    assign clk_1Hz = clk_1Hz_reg;

endmodule

    

1.模块端口的定义:
  module 模块名(端口名1,端口名2,端口名3…);
2.I/O说明
   I/O端口说明指的是模块输入、输出说明
   输入:input[信号位宽-1:0] 端口名;
   输出:output[信号位宽-1:0] 端口名;
   输入/输出:inout[信号位宽-1:0] 端口名;
   例如:input wire[3:0] s;
   例如:input wire clk_10;
   例如:input sw;
   例如:output reg clk_10;

3.内部信号
指的是模块内部用到的、与端口有关的wire和reg类型变量的声明,例如:
     reg[7:0] out; //定义out为寄存器型

4.功能定义
模块中最重要的部分就是逻辑功能定义部分,有三种方法可以在模块中描述要实现的逻辑功能

①使用assign声明语句
只需要写一个assign,后面再添加一个方程式即可
例如:c assign a=b&c; //描述了一个有两个输入的与门

②使用实例元件
Verilog HDL中提供了一些基本的逻辑门模块,如与门(and)、或门(or)、非门(not)等。使用实例元件就像在电路原理图输入方式下调用元件库中的元件一样,直接输入元件的名字和相连的引脚即可。格式如下:

/*门类型关键字  <实例名>  (<端口列表>);*/
 and u1(c,a,b);

③使用always块
例如:

always@(posedge clk)
begin
	q=a&b;
end

使用assign语句是描述组合逻辑最常用的方法之一。always块语句既可用于描述组合逻辑,也可描述时序逻辑。“always@(<敏感信号列表>)”中的敏感信号列表表示的是敏感信号或表达式,敏感信号或表达式发生改变时,执行always语句。

注意点

1.在Verilog中。所有的过程块(如always块)、连续赋值语句、实例引用都是并行的。
2.在always块中,逻辑是按照指定的顺序执行的,always块中的语句被称为“顺序语句”,因为他们是顺序执行的。但是两个或多个always块之间时并行运行的,而模块内是顺序运行的。
3.只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分。
4.区分大小写,所有的关键字都是小写。

结束语

第一次写博客,也算是学习笔记吧。

你可能感兴趣的:(Verilog,HDL,FPGA,编程语言)