FPGA知识大梳理(二)verilogHDL语法入门

  此文是写给0基础学习者,也是对自己知识点总结水平的考验。  

  对于有C基础的人来说,学习verilog应该是轻而易举 —— 类比法学习。

  第一步:格式。

  对于C来说我们前面会写   

‘include“stdio.h”

int main {.....};

  直接转化到verilog中是

module   module_name (....);

........

endmodule

  对于C 的意思就是告诉编辑器,我要在有这个库的前提下,建立这么一个函数,它实现的功能是......。而对于Verilog来说就是告诉编辑器,我要建立一个数字模块,这个模块实现..... 功能。OK 我们再讨论省略部分的内容。

  第二步:运算符

  大家知道HDL 是数字电路的描述性语言,所以需要一点点数字电路的基础就行了,数字电路中三个最小最基本的逻辑是 与,或,非。在verilog中的运算符就是 &,|,! 。OK ,知道这么多就可以开始我们的verilog程序设计了。

  现在我们要实现一个下图所示的电路功能,这是一个a和b输入,c输出,内部实现与功能的电路图

设计开始和C一样先写格式,取一个工程的名字叫project_a .

module  project_a  ();

endmodule

好了,我们要想想看,我们拿到一个芯片做top view的时候我们看到的是什么? 是pin脚。所以我们要把pin脚的信息告诉编辑器,那么代码就变成了

  module  project_a  (
                                 input   a,
                                  input  b,
                                  output c
                                  );  

endmodule                     

格式很灵活,还可以是

 1   module  project_a  (
 2                                   a,
 3                                    b,
 4                                    c
 5                                   );
 6   input  a ;
 7   input  b;
 8   output c ;
 9
10
11
12 endmodule 

或者是将6,7 两行合并成 input a ,b ;

个人比较推荐第二种,原因以后再说。格式问题,不用纠结。只是要注意一下哪里是 “;” 哪里是 “,”  就可以了。

现在整个top view 已经做完了,现在要说说具体实现了。在C语言中赋值是直接给的,在Verilog中赋值要借助两个关键字  always 和assign才可以把值赋过去。先说assign 的格式

assign  c = a&b ;

意思就是左边变量c 这根线上的信号结果等于右边信号运算的结果。那么最终的程序就是

 1 module digtal_HDL_test (
 2                          a ,
 3                          b ,
 4                          c
 5                         );
 6 input  a;
 7 input  b ;
 8 output  c ;
 9
10  assign c = a&b ;
11
12 endmodule 

再看always ,因为语法要求always里面所有赋值等式左边的变量都必须是reg,所以得把c的类型改一下,就是在always的前面加上一条语句  : reg c ;那么最终的程序就是

 1 module digtal_HDL_test (
 2                          a ,
 3                          b ,
 4                          c
 5                         );
 6 input  a;
 7 input  b ;
 8 output  c ;
 9
10 reg  c ;
11
12  always @ (a or b)
13     c = a&b ;
14
15 endmodule 

第12行的意思是  “经常(always)在(@) a或者b (a or b)发生变化的时候去执行下面的语句”

好了,现在我们程序设计就完毕了。现在让我们来回顾一下我们的程序包含了哪些东西

1,模块的结构和端口。端口还有inout 双向口(这个高级一点,http://www.cnblogs.com/sepeng/p/5126424.html 里面有介绍,可以先不追究)

2,运算符。verilog的运算符分为单目运算和双目运算符,以及三目运算符。部分和C的是一样的。

3,常量及变量。分为,数字,参数,变量(wire,reg ,memory)

4,连续赋值语句assign 以及过程赋值语句always。

具体说明就是念书了,请参照 夏宇闻老师的《Verilog数字系统设计教程》

练习流水灯实验,熟悉设计流程以及工具的使用,下板看到效果才行。

(流水灯实验中要贯穿,三目运算符,拼接移位操作,数字,常量,变量)

作业:硬件抽奖小模型。

  一共有16个号码,其中有两个号码是中奖号码(具体号码是机密,程序内部定义),输入一个数字,按下使能键。如果不正确两个灯一直是亮的,如果正确,对应的那个灯就会灭。

附加功能:1,

  

时间: 2024-10-15 23:06:23

FPGA知识大梳理(二)verilogHDL语法入门的相关文章

FPGA知识大梳理(四)FPGA中的复位系统大汇总

本文整合特权(吴厚航)和coyoo(王敏志)两位大神的博文.我也很推崇这两位大神的书籍,特权的书籍要偏基础一下,大家不要一听我这么说就想买coyoo的.我还是那一句话,做技术就要step by step.闲言少叙,直入正题. 一,异步复位 先看这个电路,就是异步复位的例子.reset使用了reg的复位端 用代码实现的话是这个样子 1 module reset_test ( 2 clk , 3 rst_n , 4 i_data, 5 o_data 6 ); 7 8 input clk ; 9 in

FPGA知识大梳理(一)对FPGA行业的一点感言

今天想开始把这FPGA行业的知识点做一个大整理,从个人感想,到语法,到器件基础,难点攻克,到项目应用.把自己这几年接触到的知识做一个全面的回顾,看看自己这几年走过的路. 人生无常,几年的跌跌撞撞勉强算是在FPGA行业大门前.之前一直都是看别人的感言,逛别人的论坛笔记.或许自己应该有一个突破. 我经常把工程师比喻成农民伯伯,相同之处有两点,第一他们都是沉默寡言 老老实实的辛勤的工作者.第二,技术的世界像耕地一样,你无法投机取巧,也没有捷径,所有的知识点都需要你脚踏实地的去开辟.你多努力一点就回报多

FPGA知识大梳理(二)verilogHDL语法入门(2)

1,时序逻辑.将上次的练习修改成时序逻辑会如何设计. 2,block 与unblocking  A,有clock的always中通常使用nonblocking. B,无clock的always中通常使用blocking. C,assign中使用的 blocking D,同块中,blocking 与nonblocking不并存 3,行为建模 A,if-else 与case   锁存器. B,循环 forever,repeat,while,for,generate 4,常用IP.fifo,ram,r

ASP.NET知识重新梳理(二)------关于ASP.NET知识学习流程的一些理解

ASP.NET知识的学习流程我大概是这么理解的,首先我们必须打好C#的基础,若是之前没有学过C++之类的面向对象语言作为基础,还是要好好看看继承派生多态之类的区别和联系的:其次,当今的编程不仅仅只是我们在学校课堂上所学的控制台应用程序,我们还要学习winfom,WPF之类的本地窗体应用:第三,每个公司的技术方向都是不同的,但是共同的地方是都需要数据库来存储自己的数据,而且sqlserver,mysql,oracle都是大同小异的,所以如果你之前的编程学的不是很好,做一个DBA吧,入门难度也不是很

ASP.NET知识重新梳理(三)------C#基础语法

C#基础语法:1.基本语法:无论代码中是否有空格,回车符,tab字符(统称为空白字符),C#编译器都不考虑这些字符: C#字符由一系列语句组成,每个语句由一个分号来结束: C#是一个块结构的语言,所有的语句都是代码块的一部分,这些块用花括号来界定("{"和"}"): C#中的注释:标记注释/*...*/ 单行注释//... 单行注释/// (可以配置VS,在编译项目时,提取这些注释后面的文本,创建一个特殊格式的文本文件,该文件可用于 创建文档说明书): C#代码是区

Python基本语法[二],python入门到精通[四]

在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解.之所以将python的基本语法分为两部分,是因为园子里大部分人都是有编程基础的,所以在学习Python的时候可以先出个预览版的,预览版都是根据Python的语法与其他语言(java/C#/php)比较类似又不完全一样的地方,便于大家对Python有个基本理解.在大家差不多有个了解以后,我们再深入讲讲

jQuery 入门教程(二): 基本语法

学习jQuery之前需要你有下面几个方面的基本知识 HTML CSS JavaScript jQuery 的基本语法 $(selector).action() $ 符合定义这是一个jQuery语句 (selector) 用来选择某个HTML元素,其语法和CSS的selector语法一样. action() 定义操作该HTML元素的方法. 比如: $(this).hide() – 隐藏当前元素. $("p").hide() – 隐藏所以 <p> 元素. $(".te

JS基础知识回顾:ECMAScript的语法(二)

ECMAScript中有五种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String ECMAScript还有一种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的. ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述六种数据类型之一,由于ECMAScript的数据类型具有动态性,因此的确没有再定义其他数据类型的必要了. 监狱ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据

C#基础知识简单梳理

C#基础知识简单梳理 本文是转发博友的总结,方便自己以后随时温习: 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引用类型的数据存放在托管堆上面(它的引用地址却存放在堆栈上面)! 栈:它是一个内存数组,是一个先进后出的数据结构! 栈的特征:数据只能从栈顶进,从栈顶出! 堆:它是一个内存区域,可以分配大块区域存储某类型的数据,与栈不同的是它里面的数据可以任意排序和移除! 下面是园子的一张图,贴上来供大家参考啊! 问     题 值  类  型 引 用 类 型 这个类型分配在哪里