FPGA技术笔记1(20240903)

1.FPGA技术背景:

        因此只有在高速大规模集成电路设计制造技术进步的基础上,才有可能实现真正有意义的实时数字信号处理系统。对实时数字信号处理系统的要求不断提高,也推动了高速大规模集成电路设计制造技 术的进步。

2.Verilog 语言与C语言的特点:

      C语言程序代码是一条指令一条指令来执行的。 CPU 首先通过总线,读取一条指令,然 后解析这条指令,再然后执行这条指令。我们写的 C 代码总是一条一条地执行。(很多个时钟周期做一件事)
        FPGA 的并行性,不管 是扫描键盘,还是扫描 VGA ,都可以把它们做成独立的模块,时间上没有冲突,每个模块可以同时执行。(一个时钟周期可以做很多事)

3.FPGA顺序执行的方法:

1.顺序控制的第一种办法——状态机设计

        可以说,我们用 Verilog 来写程序,状态机无处不在。顾名思义,通过设计状态机,我们可可以控制 Verilog 让 他该快的时候快,该慢的时候慢,该做什么的时候就做什么。这才是我们想要的。状态机是很不错的东西,初学者 对他望而生畏,而熟悉 Verilog 语言的人都对其会爱不释手。

2.顺序控制的第二种方法——FPGA 中运行 CPU   (软核和硬核)

        FPGA 也可以运行 CPU? 是的,没错, FPGA 也可以像单片机一样使用,这样我们就可以用 C 代码来一条条指令来执行了,这不是太强大了?是的,没错。关键的问题是,我们是可以把一些逻辑控制顺序复杂的事情用 C 代码 来实现,而实时处理的部分仍然用 Verilog 来实现。并且那部 Verilog 可以被 C 代码控制。
       1 )软核就是用代码就是能实现的 CPU 核,这种核配置灵活,成本较低。但是要占用 FPGA 宝贵的资源。
       2 )硬核就是一块电路,做到 FPGA 内部,方便使用,性能更高。比如 Xilinx DDR 内存控制器,就是一种硬
核,其运行速度非常高,我们只要做些配置,就可以方便使用。

4.Verilog 基础语法

1.module:

2.input output:

      input 关键词,模块的输入信号,比如 input Clk,Clk 是外面关键输入的时钟信号;
      output 关键词,模块的输出信号,比如 output[3:0]Led; 这个地方正好是一组输出信号。其中[3:0]表示 0~3
共 4 路信号。
      inout 模块输入输出双向信号。这种类型,我们的例子 24LC02 中有使用。数总线的通信中,这种信号被广泛应
用;
      wire 关键词,线信号。例如:wire C1_Clk; 其中 C1_Clk 就是 wire 类型的信号;
线信号,三态类型,我们一般常用的线信号类型有 input,output,inout,wire;
       reg 关键词,寄存器。 和线信号不同,它可以在 always 中被赋值,经常用于时序逻辑中。 比如 reg[3:0]Led; 表示了一组寄存器。

3.always:

       always@()括号里面是敏感信号。这里的 always@(posedge Clk)敏感信号是 posedge Clk 含义是在上升沿的时 候有效,敏感信号还可以 negedge Clk 含义是下降沿的时候有效,这种形式一般时序逻辑都会用到。还可以是*这 个一符号,如果是一个*则表示一直是敏感的,一般用于组合逻辑。

4.assign:

       assign 用来给 output,inout 以及 wire 这些类型进行连线。assign 相当于一条连线,将表达式右边的电路直 接通过 wire(线)连接到左边,左边信号必须是 wire 型(output 和 inout 属于 wire 型)。当右边变化了左边立马 变化,方便用来描述简单的组合逻辑。

5.if...else...

      这些语句含义上都和高级语言一样

6.case...endcase

      case...endcase 作用域用于状态机的编写

7.begin...and

      begin..... end 作用域范围,类似于 C 的大括号。用法举例

8.parameter

      parameter 定义一个符号 a 为常数(十进制 180 找个常量的定义等效方式):

9.include&define

      Include define 都是预处理命令,用于常量阐述的定义

10.符号

“;”分号用于每一句代码的结束,以表示结束,和 C 语言一样。
“:”冒号,用在数组,和条件运算符以及 case 语句结构中。case 结构会在后面讲解。
“<=”赋值符号,非阻塞赋值,在一个 always 模块中,所有语句一起更新。 它也可以表示小于等于,具体是 什么含义编译环境根据当前编程环境判断,如果“<=”是用在一个 if 判断里如:if(a <= 10);当然就表示小于等 于了。
“=”阻塞赋值,或者给信号赋值,如果在 always 模块中,这条语句被立刻执行。 阻塞赋值和非阻塞赋值将再 后面详细举例说明。
“+,-,*,/,% ”是加、减、乘、除运算符号,这些使用和 C 语言基本是一样的,当你用到这些符号时,编 译后会自动生成或者消耗 FPGA 原有的加法器或是乘法器等。其中符号/,%会消耗大量的逻辑,谨慎使用。
“<”小于,比如 A<B 含义就是 A 和 B 比较,如果 A 小于 B 就是 TURE,否则为 FALSE。
“<=”小于等于,比如 A<=B 含义就是 A 和 B 比较,如果 A 小于等于 B 就是 TURE,否则为FALSE。
“>”大于,比如 A>B 含义就是 A 和 B 比较,如果 A 大于 B 就是 TURE,否则为 FALSE。
“>=”大于等于,比如 A>=B 含义就是 A 和 B 比较,如果大于等于 B 就是 TURE,否则为 FALSE。
“==”等于等于,比如 A==B 含义就是 A 和 B 比较,如果 A 等于 B 就是 TURE,否则为 FALSE。
“!=”不等于,A!=B 含义是 A 和 B 比较,如果 A 不等于 B 就是 TURE,否则为 FALSE.
“>>”右移运算符,比如 A>>2 表示把 A 右移 2 位。
“<<”左移运算符,比如 A<<2 表示把 A 左移 2 位。
“~”按位取反运算符,比如 A=8’b1111_0000;则~A 的值为 8’b0000_1111;
“&”按位于与,比如 A=8’b1111_0000;B=8’b1010_1111;则 A&B 结果为 8’b1010_0000;
“^”异或运算符,比如 A=8’b1111_0000;B=8’b1010_1111;则 A^B 结果为 8’b0101_1111;
“&&”逻辑与,比如 A==1,B==2;则 A&&B 结果为 TRUE;如果 A==1,B==0,则 A&&B 结果为FALSE,一般用于条件判 断。
A = B ? C : D 是一个条件运算符,含义是如果 B 为 TRUE 则把 C 连线 A,否则把 D 连线 A。B 通常是个条件判断, 用小括弧括起:
assign C1_Clk = (C1==25'd24999999) ? 1 : 0 ; C1_Clk,是一个 wire 类型的信号,当C1==25'd24999999 时候,连线到 1,否则连线到 0.
“{}”在 Verilog 中表示拼接符,{a,b}这个的含义是将括号内的数按位并在一起,比如{1001,1110}表示 的是 10011110。拼接是 Verilog 相对于其他语言的一大优势,在以后的编程中请慢慢体会。

11.阻塞赋值和非阻塞赋值

    阻塞赋值:当时钟上升沿来临的时刻,首先 A 会被置 1,然后 B 寄存 器再置 1。区别就是 A 和 B 不再同时置 1。A 要比 B 提前零点几纳秒。这样就出现了先后顺序。这个过程还是在一个 时钟内完成的,但是数据到达 B 寄存器相比上面两段程序晚了那么零点几纳秒! 当我们的时钟跑的比较慢的时候,比如 50M,一个周期有 20ns,那么这么短暂的延时基本可以忽略不计,但是 随着设计的复杂,以及时钟速度的提高,这样的语句就要小心。

5.Verilog 状态机设计

        定义:根据状态机的输出信号是否与电路的输入有关分为 Mealy 型状态机和 Moore 型状态机。电路的输出信号不仅与 电路当前状态有关,还与电路的输入有关,称为 Mealy 型状态机,即次态=f( 现状,输入 ) ,输出 =f (现状,输入); 而电路的输出仅仅与各触发器的状态,不受电路输入信号影响或无输入,称为 Moore 型状态机, 次态 =f( 现状,输 入) ,输出 =f (现状)。
       一段式状态机 :一段式状态机是应该避免使用的,该写法仅仅适用于非常简单的状态机设计,不符合组合逻辑与时序逻辑分开的原 则,整个结构代码也不清晰,不利用维护和修改。

       两段式状态机:两段式状态机采用两个 always 模块实现状态机的功能,其中一个 always 采用同步时序逻辑描述状态转移,另一个 always 采用组合逻辑来判断状态条件转移。两段式状态机是推荐的状态机设计方法。

      三段式状态机:三段式状态机在第一个 always 模块采用同步时序逻辑方式描述状态转移,第二个 always 模块采用组合逻辑方 式描述状态转移规律,第三个 always 描述电路的输出。通常让输出信号经过寄存器缓存之后再输出,消除电路毛 刺。这种状态机也是比较推崇的,主要是由于维护方便,组合逻辑与时序逻辑完全独立。

6.Verilog Test bench 文件设计

时钟激励设计,复位信号设计 双向信号设计,特殊信号设计,仿真控制语句及系统任务描述

7.其他知识点涉及:

 1.VIVADO开发流程

 2.zynq固化流程

 3.VIVADO自定义IP核

  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值