精华内容
下载资源
问答
  • FPGA学习心得分享(一)
    千次阅读
    2019-07-10 20:07:24

    FPGA学习之进阶之路

    阶梯式学习法

    有幸成为了一名准研究生后,我被定下的研究方向是FPGA+DSP算法,对于FPGA,我只在本科课程中接触过一些,学的一般般,既然FPGA是我未来三年甚至是三十年的“饭碗”,因此不能浅尝辄止,更不能功夫停于表面,我需要系统性的由浅入深学习并配合足量的实践,换句话说,我需要一份进阶指南,因此,我翻找了各大论坛、博客及贴吧等处的经验之谈,终于找到一份完备的FPGA学习指导手册,我还特地将其在XMIND思维导图上整理了一番,其博客的原地址如下晓灰灰(博主是FPGA吧的吧主),整理出的思维导图可以去我空间下载,本人以此为导向学习了一段时间,收获颇丰,本着温故而知新的学习原则,特开此系列博客对知识进行整理与分享,此后我的博客将按照进阶指南的顺序进行分享。
    FPGA进阶学习XMIND思维导图


    更多相关内容
  • fpga学习心得

    2018-12-21 11:16:15
    对于fpga学习产生了自己的一点心得,完全自己的心得体会,可以借鉴下
  • FPGA学习心得

    千次阅读 2020-11-21 13:34:14
    目录 关于赋值的一些说明 关于一些符号的含义 初始化一些设定 分频 制作mif表 always语句的使用 注释和宏定义 软核 QSYS集成开发工具创建使用的软核(CPU) FPGA设计部分 关于赋值的一些说明 与= 在不同的情况下可以...

    关于赋值的一些说明

    <==

    <=在不同的情况下可以表达不同的意思
    在条件判断的时候即(a <= 5)中是小于等于的意思
    在()之外的是非阻塞型赋值语句例如 a <= 5是赋值的含义
    且表示为赋值的时候是非阻塞赋值语
    即后面的相关语句同时执行,可以理解为并行执行。
    

    =为阻塞赋值语句,是在这句之后所有语句执行之前执行的
    也就是这句没有执行的话后面的语句就无法执行,这也是“阻塞”的意思。
    可以理解为为顺序执行
    

    举个例子初始值a=0,b=1,c=1
    begin a=b;b=c;c=aend结果是a=1;b=1;c=a=1
    (此时a=1已经有效了)
    begin a<=b;b<=C;c<=a;end 结果是a=1;b=1;c=O
    (a=1在当前begin-end内是无效的,整体执行完后,才有效)
    组合逻辑用=,时序逻辑用<
    =

    关于一些符号的含义

    命名规则: reg[n-1:0] 存储器名[m-1:0]
    说明: 这是m个n位的存储器 该存储器的地址范围是0- (m-1)
    举例: reg[7:0] DiG[3:0];
    说明: 这是16个8位存储器,该存储器地址范围是0-15


    命名规则: n'hm n位十六进制值为m
    说明: 这是 n位十六进制值为m的一个数据值,其中h可换位b标志二进制,换为o为八进制。
    举例: 1’b1
    说明: 这是1位二进制值为1的数
    举例: 4’h12
    说明: 这是4位十六进制值为12的数


    初始化一些设定

    • 在有输出端口的时候,为了能把一个输出信号赋给输出端口,必须要设定一个和输出端口名一样的reg寄存器,这样才能够将输出信号输出到端口
      reg[1:0] Key_Value; output[1:0] Key_Value;
      不然就会报错的:
      Error (10137): Verilog HDL Procedural Assignment error at TimeSystem.v(121): object “Key_Value” on left-hand side of assignment must have a variable data type
      (输入端口没有这个问题)

    • 可以将初始化的值直接写在寄存器后面
      reg [12:0] CNT_R0 = 5;


    分频

    分为两种方式,一种是分屏数刚好为2的次方,还有一种不是2的次方

    1. 为2的次方
    reg  [5:0]   Cnt_R0;
    always @(posedge Clk)  //64分频
    begin
       if(Cnt_R0 < 32)
       begin
          Clk_1M <= 0;
       end
       else
       begin
          Clk_1M <= 1;
       end
       Cnt_R0 <= Cnt_R0 + 1;
    end
    
    1. 不是2的次方
    reg  [6:0]   Cnt_R0;//128 = 31 + 97
    always @(posedge Clk)   
    begin
       if(Cnt_R0 < 31)   //31分频
       begin
          Cnt_R0 = Cnt_R0 + 1;
          Clk_1M = 0;   
       end   
    	else
    	begin
          Cnt_R0 = Cnt_R0 + 97;     
          Clk_1M = 1; 
    	end 
    end
    

    制作mif表

    mif_Maker下载
    下载完后
    在这里插入图片描述
    首先选择全局参数,根据需要设定宽度以及长度等,然后选定波形
    在这里插入图片描述
    最后点击另存为即可
    在这里插入图片描述
    然后添加到quartus中
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如果是在别人已有的代码下更改一定要注意更改代码中
    i
    地址的宽度,不然可能你的波形明明点的是正弦波结果出来的是方波等…

    always语句的使用

    always语句其实就是一个敏感函数,只要其后的敏感型号量符合其特性,即可调用此函数
    posedge上升沿
    negedge下降沿
    比如:

    //Clk上升沿即可激活
    lways @(posedge Clk)    //分频创建Clk_Scan信号
    begin
       CNT_R0 <= CNT_R0 + 1'b1;
       
       if(CNT_R0 < 4095)
       begin
          Clk_Scan <= 1;
       end
       else
       begin
          Clk_Scan <= 0;
       end
    end
    

    并且还可以通过or来添加其可以激活的敏感信号量

    always @(posedge Clk_Scan or negedge nRST)
    begin
       if(nRST == 0)
    	begin
    	   Key_Flag_Clear <=	1'b0;
    	end
    	else
    	begin
    	   if((Key_Flag == 1) && (Key_Flag_Clear == 0))
    	   begin
    	      SEG_M[0]       <= SEG_M[0] +1'b1;
    		   Key_Flag_Clear <=	1'b1;
    	   end
    		else if(Key_Flag == 2'h0)
    		begin
    		   Key_Flag_Clear <=	1'b0;
    		end
    	end	
    end
    

    但是其敏感信号量不能超过三个!
    否则会报错

    always语句中,已经被赋值的寄存器是不能够在其他always语句中再次使用赋值语句的!
    否则,会报错:
    Error (10028): Can't resolve multiple constant drivers for net "K_freq[3]" at DDS.v(196)
    不过可以使用其寄存器进行逻辑的判断等,也就是说不能写,只能读
    只有再使用一个寄存器作为中间量来进行赋值。

    当有两个及以上的敏感量的时候,一定要在程序后面处理当中用if以及else等去判断到底是哪个敏感量来了做什么事情,才是正确的做法,而不是想当然的直接将处理程序写在后面,不做处理
    如果不做处理,其报错如下:
    Error (12153): Can't elaborate top-level user hierarchy
    错误程序如下
    在这里插入图片描述
    正确如下
    在这里插入图片描述


    注释和宏定义

    • 注释:
      Verilog有两种注释方式,一种以/*开始 */结束 ,还有一种就是双反斜杠//
    • 宏定义:
      宏定义方式为
      define on 1'b1
      define OFF 1'b0

    软核

    QSYS集成开发工具创建使用的软核(CPU)

    软核资源确定
    首先要确定软核需要使用到哪些资源的外设,才方便从FPGA开发板上面给软核进行资源分配。

    软核类型选择
    点击Tools→Qsys,创建Qsys模块。
    进入后,点击右方Library子框中的Embedded Processors项,然后点击此项目中的Nios II Processor创建软核处理器,然后会弹出窗口让我们选择软核的一些属性
    首先要选择内核的类型,这里提供了三种类型,需要用户根据设计的需求和设计所用到的芯片资源来决定,这里选择Nios II/f。
    在这里插入图片描述

    系统ID选择
    在Library子窗口中选择Peripherals -> Debug and Performance -> System ID Peripheral设定系统ID,点击后选择Finish结束选择
    在这里插入图片描述

    添加On-Chip ROM和RAM
    点击Library子窗口中Memories and Memory Controllers -> On-Chip -> On-Chip Memory (RAM or ROM)
    RAM:
    在这里插入图片描述
    ROM:
    在这里插入图片描述

    同时在创建完一个需要点击System Contents子窗口中的onchip_memory2_0选中刚才创建的rom or ram右键rename修改名字,方便后面的使用不至于混乱,如果设置的rom就修改为onchip_rom,如果设置的ram就修改为onchip_ram
    在这里插入图片描述

    添加定时器
    在Library子窗口点击Peripherals -> Microcontroller Peripherals -> Interval Timer添加定时器模块,定时时间设置为1ms
    在这里插入图片描述

    自动生成中断号以及基地址
    点击QSYS栏上方菜单栏System -> Assign Base Addresses自动生成基地址
    点击System -> Assign Interrupt Numbers自动生成中断号

    在这里插入图片描述

    数据端口添加
    按键数据端口:
    根据设计方案,数据端口选择1个2bit输入数据口,点击Peripherals -> Microcontroller Peripherals -> PIO进行IO的选择
    在这里插入图片描述

    数码管数据端口选择:
    根据分析数码管数据端口需要6个4bit的数据输出IO。

    在这里插入图片描述

    蜂鸣器数据端口选择:
    根据分析需要1个1bit输出IO即可。

    模块连接
    将各个模块之间的线连接起来
    在这里插入图片描述

    确定复位源以及IO外部连接号

    在这里插入图片描述

    点击reset_n确定复位输入
    在这里插入图片描述

    将其中的Reset vectir memory 以及 Exception vector memory 确定为rom
    在所有IO选择完毕后,选择IO中的external_connection确定其号,每个IO根据其名字更改即可

    在这里插入图片描述
    在这里插入图片描述

    保存并编译
    将其保存后,点击菜单栏Generate,编译软核CPU
    在这里插入图片描述

    FPGA设计部分

    FPGA设计部分即为底层驱动部分,其中包含数码管驱动、蜂鸣器驱动以及按键的驱动,设计需要使用Verilog语言来完成这三个部分的程序编写。
    5.2.1 创建工程
    点击Home子窗口中的New Project Wizard创建工程
    在这里插入图片描述

    将其保存在工程文件夹中,并Next,添加设备
    在这里插入图片描述

    然后点击Finish的完成添加工程。
    编写FPGA部分代码
    点击File -> New
    在这里插入图片描述

    点击创建Verilog程序,编写数码管驱动、蜂鸣器驱动以及按键驱动程序。
    在这里插入图片描述

    然后分配引脚
    在这里插入图片描述

    完成后,点击Processing -> Start Compilation,编译。
    编译通过后,点击Files ->Create Symbol Files for Current File生成原理图文件
    在这里插入图片描述

    连接软核CPU以及所生成的底层模块
    新建一个原理图文件File -> New->Block Diagram/Schematic File
    点击文件夹,添加刚才的软核cpu_info.qsys
    在原理图中添加TimeSystem以及cpu_info两个模块,并相连,连接完成后进行编译。
    在这里插入图片描述

    完成后,连接开发板,将FPGA端程序烧录进去。

    展开全文
  • FPGA 学习心得体会

    2011-01-10 22:47:31
    回想起自己学FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目.
  • FPGA学习心得--01

    2021-01-28 00:02:08
    另外由于FPGA中没有现成的锁存器资源,消耗底层资源。 锁存器产生的原因往往是代码逻辑不完整。例如,if语句缺少else与之对应,case语句中没有default等。 1.6 状态机 1.6.1 状态机适用的场景 某项工作需要按照固定...

    1. Verilog

    1.1 数字表示形式

    例 : 多 少 位 的 什 么 进 制 数 → 4 ′ d 8 ( 4 位 的 十 进 制 数 8 ) 例:多少位的什么进制数 \rightarrow 4'd8 (4位的十进制数8) 4d8(48)
    如果将 ′ ' 一撇读作汉字 的 的 ,Verilog的数字表示语法符合口头语言的习惯。

    1.2 数据类型

    Verilog作为硬件描述语言,数据类型与硬件有直接对应关系。

    数据类型介绍符号
    寄存器可以理解为一个抽象化的数据存储单元,这与其他编程语言的变量概念很相近,只是Verilog以硬件寄存器作为变量的实现载体,而高级编程语言将使用一段内存来存储变量值(或是CPU中的寄存器)reg、integer、real
    线网连接各个硬件功能单元的连线wire
    参数有点类似于高级编程语言中的宏定义parameter

    1.3 运算符

    1.3.1 算数运算符

    种类和功能和C其他编程语言一样。
    值得注意的是,乘除运算在底层实现时往往会比较消耗资源

    1.3.2 拼接运算符

    这个运算符是Verilog特有的运算符,作用是将两个信号绑定为一个信号,例如:
    { a , b } → 将 a , b 两 个 信 号 拼 接 起 来 作 为 一 个 新 信 号 \{a, b\} \rightarrow 将a, b两个信号拼接起来作为一个新信号 {a,b}a,b

    1.3.3 赋值

    符号=<=
    含义阻塞赋值语句并行赋值语句
    介绍在always块中,该赋值语句只有当前面的语句都执行完毕后才会执行,和其他顺序执行的编程语言中赋值语句功能相同在always块中和其他语句并行执行,不等待上一条语句的执行结果
    应用场景1. assign语句
    2. 不带时钟的always块(组合逻辑)
    带时钟的always块

    1.3.4 其他

    关系运算符; 逻辑运算符; 三目运算符 (条件运算符); 移位运算符

    1.4 程序框架

    model model_name (
    	input	input_var_name
    	output	output_var_name
    	...
    	);
    	
    parameter PAR_NAME	=123
    reg	[:]		reg_name
    wire		wire_name
    
    assign	wire_name = ...
    
    always @(posedge clk) begin
    	if (...)
    	else if (...)
    	else
    	end begin
    		case(...)
    			... : ...;
    			... : ...; 
    			...
    			default : ;
    		endcase
    	end
    end
    
    endmodule
    

    上面的伪代码定义了Verilog一个模块,begin、end的作用与C语言中的 " { } " "\{ \}" "{}"作用相同,begin、end代码段中的语句是顺序执行的(并行赋值语句是例外)。为了保证代码的规范性,即使逻辑判断分支中仅有一条语句,也可以用begin、end打包起来。

    1.5 锁存器

    锁存器与寄存器的最大区别是:锁存器属于组合逻辑,输出电平变化仅与输入信号有关,不受时钟约束。
    锁存器对输入脉冲敏感,容易产生毛刺,这种瞬时的不确定性在后级电路中引发的BUG难以察觉。
    另外由于FPGA中没有现成的锁存器资源,消耗底层资源。
    锁存器产生的原因往往是代码逻辑不完整。例如,if语句缺少else与之对应,case语句中没有default等。

    1.6 状态机

    1.6.1 状态机适用的场景

    某项工作需要按照固定的流程或步骤来完成,工作过程中总在各个阶段之间切换。例子:升降机。

    1.6.2 状态机的优势

    开发人员在编写代码时不需要考虑到所有状态的排列组合,仅需要考虑各个工作状态或工作阶段之间的转换条件。例如:升降机的控制程序不需要各个楼层分别编写,而是通过状态机来完成开关门、上升下降等动作。

    1.6.3 状态机的分类

    状态机全称“有限状态机”。在电路实现上可以看作组合电路和时序电路的组合,状态机的各个状态往往是时序电路,而状态之间的切换和输出往往是组合逻辑实现的。根据状态机的输出是否和输入相关,状态机又分成“摩尔型状态机”和“米勒型状态机”。

    状态机分类介绍
    米勒型状态机(Mealy)组合逻辑的输出不仅取决于当前状态还取决于状态机的输入
    摩尔型状态机(Moore)组合逻辑的输出仅取决于当前的状态

    在这里插入图片描述

    米勒型状态机示意图(该插图来自正点原子教程)

    在这里插入图片描述

    摩尔型状态机示意图(该插图来自正点原子教程)

    1.6.4 状态机在Verilog中的写法

    1.6.4.1 二段式

    一个always模块适用同步时序描述状态转移。
    另一个always模块采用组合逻辑判断状态转移条件,以及描述状态机输出。

    1.6.4.2 三段式

    一个always模块使用同步时序描述状态转换
    一个always模块使用组合逻辑判断状态转移条件
    最后一个always模块用于描述状态机输出,可以采用时序电路,也可以使用组合电路。

    展开全文
  • FPGA学习心得_寇飞强

    2009-08-07 18:48:11
    FPGA学习感想,如何学习fpga,从零开始学习fpga的方法
  • FPGA在目前应用领域非常,在目前的单板设计里面,几乎都可以看到它的身影。从简单的逻辑组合,到高端的图像、通信协议处理,从单片逻辑到复杂的ASIC原型验证,从小家电到航天器,都可以看到FPGA应用,它的优点在这里...
  • 谈谈FPGA学习心得

    2020-08-14 13:05:05
    作为新手,在初次使用FPGA前,是要走好多弯路的。不妨听听过来人的意见,让你快速掌握这门技术。
  • FPGA学习心得(转载)

    2010-08-17 16:29:56
    以实际应用为目的进行了切身说明,适合初学者阅读
  • FPGA,配置ADC芯片,模块化编程。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    针对每个输出信号,单独编写程序。
    cnt0
    cnt1
    cnt2
    adc_sclk
    adc_cs
    adc_din
    dout
    dout_vld
    输入信号,不需要单独编写程序。
    clk
    rst_n
    adc_dout

    展开全文
  • 学习下各类接口、驱动及基于FPGA电子小制作,很有意思。 刷题整理(一) Verilog语法原则要注意 一个reg最好只在一个always块里进行赋值操作 if-else或case等条件选择语句需要完备的条件,防止综合出...
  • (1)case语句会综合出mux或decoder,而if-else语句会综合出mux和比较器comparator; (2)always块中赋值的变量为reg型,否则会出现error:“illegal LHS in quasi continuous assignment” ...
  • 个人FPGA学习心得

    千次阅读 2014-08-02 01:15:25
    回想起自己学FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计... 废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段:    ①、Verilog语言的学习,熟悉Verilog语言的各种语法。  
  • 本文主要通过作者FPGA学习历程,总结出一些心得体会,希望对你的学习有所帮助。
  • FPGA入门学习心得

    2010-04-18 15:37:50
    fpga主要是要有电路的思想,作为初学者,往往对器件可能不是熟悉,那么应该对于数字电路的知识很熟悉
  • FPGA内部主要三块:可编程的逻辑单元、可编程的连线和可编程的IO模块。(1)可编程的逻辑单元是什么?其基本结构某种存储器(SRAM、FLASH等)制成的4输入或6输入1输出地“真值表”加上一个D触发器构成。(2)通常...
  • FPGA学习心得——矩阵键盘

    万次阅读 2012-08-09 15:16:02
    FPGA 实现主要解决三个问题,一是如何检测是否有按键按下并防止采集到干扰信号;二是在按键闭合时如何防止抖动;三是如何判断为哪一个按键位动作,并对其进行译码 。因此,为了解决这些问题,程序中使用不同的进程...
  • FPGA学习心得——分频器

    千次阅读 2012-07-30 17:08:30
    分频器是FPGA设计过程中使用频率非常高的基本单元之一。其基于FPGA的实现主要包括:1、通过FPGA芯片内部集成锁相环(如altera的PLL,Xilinx的DLL)来进行时钟的分频、倍频以及相移设计;2、对于时钟要求不太严格的设计...
  • FPGA设计心得(3)Aurora IP core 的理论学习记录

    千次阅读 多人点赞 2020-05-12 01:30:17
    文章目录Aurora IP核介绍整体介绍大小端Framing or Streaming User ...FPGA之间通过Aurora 8B/10B IP核进行通信的示意图如下: 通信的双方经过各自例化IP核,通过通道传输数据,用户能够操作的是User Application以及I
  • fpga入门学习心得笔记

    2019-12-05 21:10:32
    今天开始写一些关于fpga学习心得,前面的基本语法已经掌握,总结一些代码的实现方法。 关于UART的收发 1.使用两个计数器 一:计数以产生序列机的基本计数单位 二:每当第一个基本计数器计数一轮,这个计数器...
  • FPGA培训学习心得(北京至芯_兴洪).pdf 一个人的心得,新的挺有激情的,大家在学腻了的时候可以看看
  • 编程语言、器件特性固然重要,但他们应当是学习FPGA的基础,而不应该是学习FPGA的目的,古语说得好:“文以载道”,说的是写文章的目的是讲出“道”来,而不在文章本身——不必计较文字几何,重要的是“道”讲明白了...
  • 如何学习FPGA

    2021-09-19 09:41:47
    笔者从2007年初次接触并系统学习FPGA及工作后应用FPGA做产品至今已有7年的时间,初次接触学习FPGA时由于没有专业老师的指导,自己摸索学习FPGA走了很多的弯路。有过问题迎刃而解的快乐,也有过苦苦寻求结果和答案的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,858
精华内容 743
关键字:

fpga学习心得