(本连载共七部分,这是第一部分)

作者:McuPlayer2013   (EETOP FPGA版块版主) 原帖地址:http://bbs.eetop.cn/thread-385362-1-1.html

以下是正文:

这是一个大任务,但我打算只是引门外汉入门,大约7个帖子来完成,一周入门FPGA。

1、假设读者对硬件数字电路熟悉,比如自己可以用74芯片做跑马灯
2、C语言都比较熟悉,因为下面用的Verilog语言就跟它很类似,暂时规避晦涩的VHDL

我打算分几个部分
1、Verilog语法
2、组合逻辑设计
3、时序逻辑设计
4、阻塞和非阻塞
5、同步和异步设计
6、有限状态机
7、设计一个只有4条指令的CPU

如果你不需要自己设计,只需要看懂一些代码,理解Team中别人的意思。
这个帖子就是教你一周学会XXOO的

如果你已经入门而登堂入室了,这个帖子真的不应该看了,否则会退步的。

1、Verilog语法

没错,我们就是拿C语言照猫画虎,下面是一个“老虎”的模型。
我们一个个看他跟“猫”不一样的地方

module nand(
            input   in1,
            input   in2,
            output   out
);

wire    tmp;
    assign tmp = in1 & in2;
    assign out = ~tmp;

endmodule

模块定义跟C语言的函数很相似吧
1、模块必须使用“module”关键字,他也没有返回值。
2、模块没有beginmodule,只有endmodule
3、模块对外接口有input,output,inout,但为了入门着想,只谈input和output

模块内部还有个中间变量耶,是不是看见了tmp就有很熟悉的感觉了。
没错,他就是中间“变量”,在硬件上他就是一根导线,wire望文生义即可。

看见了“=”就应该猜到这是赋值语句了,没错,但Verilog的语法要求前面必须有个苦B的assign关键字

至于“&”和“~”这2个运算符号,就不讲了吧,C语法搞不清的兄弟,对不住了

有人会说,你这“变量”到底是int还是long还是flot抑或double呢?
好了,咱继续照猫画虎,不过老虎毕竟跟猫是不一样的,比如老虎会虎啸,猫只会喵喵。

wire[7:0]   tmp;
这一下子把tmp从一根线,扩展成了8根线,觉得是7根线的自己去看C语言课本去。

好了,我们要虎啸了,同时喵喵几下,对比着看

wire[7:0]   tmp;
wire[3:0]   high;

assign high = tmp[7:4];     //虎啸的Verilog
high = tmp<<4;              //喵喵的C语言

硬件就是硬件,可以随意飞线,你甚至可以把tmp里面的bit6,bit3,bit1,bit7组成一个Nibble
不知道Nibble不要紧,它就是Half Byte的

assign high = {tmp[6],tmp[3],tmp[1],tmp[7]};        //虎啸的Verilog

high  = (tmp & 0x40) ? 0x08 : 0;                //喵喵的C语言
high |= (tmp & 0x08) ? 0x04 : 0;                //喵喵的C语言
high |= (tmp & 0x02) ? 0x02 : 0;;               //喵喵的C语言
high |= (tmp & 0x80) ? 0x01 : 0;;               //喵喵的C语言

这下知道喵喵跟虎啸的差距了吧,C语言,把如猫添翼?表达式都用上了,还是4行代码才表达出自己的意图。
当然,Verilog也有他的?表达式,那用上了,就真的是如虎添翼了

C语言的switch/case语句
switch(tmp)
{
    case 1:
        high =1;
        break;
    case 3:
        high =5;
        break;
    case 5:
        high =2;
        break;
    case 9:
        high =1;
        break;
    default:
        high =11;
}
Verilog的case语句
case(tmp)
    1:          high =1;
    2:          high =5;
    3:          high =1;
    4:          high =1;
    default:    high = 1;

发现了没,首先打字要少敲很多case了吧,case已经升级当主管了,小罗罗们直接跟这冒号就可以了。
细心的文艺青年,应该发现了一个大秘密,那个四处张扬,到处留种的break居然不见了。
Verilog不需要break了,它默认每个语句自动break,这时有人又担心,那我有2个语句咋办?

问得好,又有2个keyword要粉末登场了,begin/end
学会Pascal语言的朋友,肯定认得他俩,在C语言中被{和}所替代

Verilog本来也想用{和}的,毕竟写代码是要敲键盘的,能少敲谁也不愿意多敲。
可惜{和}被用掉了,用在了哪里?到上面找去,

case(tmp)
    1,2,3,4:
    begin
        high =1;
        high1 =3;
        high8 =9;
    end
    default:
        high = 1;

这个排版,是不是又点更像C语言的风格了
你也许已经看到了,C语言中多个case项公用一段代码的情况,在Verilog里面也有,而且更TMD的简洁

if/else语句就不讲了,这方面猫和老虎太像了,照猫画虎就**不离十了。

好了,下面有个用得非常多的always语句

always(tmp1, tmp2)
    begin
        out1 = tmp1 ^ tmp2;
        out2 = tmp1 + tmp2;
    end
又是喵喵和虎啸的区别了,C语言的while也是always的意思,但while不如always忠诚。
C的while语句,是随着CPU的时钟节奏,一步一步的走,然后Loop循环回来,直到永远或者有人叫她出台(霸王的break或者while条件不满足了)
Verilog的always可就忠诚多了,只要tmp1和tmp2中的任何一个变动,out1和out2都跟着动,clk来不来都会工作,这就是主动和被动的差别

好了,看到这里,你应该知道,文艺青年和苦B青年其实也有很多共同之处的,如果你认识文艺青年,那跟苦B青年交朋友也不难了。

跟着我从零开始入门FPGA(一周入门XXOO系列)-1、Verilog语法的更多相关文章

  1. Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1

    摘要: Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1 安装遇到问题请文末留言. 悦动智能公众号:aibbtcom AI这个概念好像突然就 ...

  2. 从零开始的微信小程序入门教程(一)

    之前说要和同事一起开发个微信小程序项目,现在也在界面设计,功能定位等需求上开始实施了.所以在还未正式写项目前,打算在空闲时间学习下小程序.本意是在学习过程中结合实践整理出一个较为入门且不是很厚的教程, ...

  3. 强烈推荐visual c++ 2012入门经典适合初学者入门

    强烈推荐visual c++ 2012入门经典适合初学者入门 此书循序渐进,用其独特.易于理解的教程风格来介绍各个主题,无论是编程新手,还是经验丰富的编程人员,都很容易理解. 此书的目录基本覆盖了Wi ...

  4. Sping Boot入门到实战之入门篇(一):Spring Boot简介

    该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...

  5. Quartz入门例子简介 从入门到菜鸟(一)

    转: Quartz入门例子简介 从入门到菜鸟(一) 2016年11月19日 22:58:24 爱种鱼的猫 阅读数:4039   刚接触quartz这个词并不是在学习过程中...而是WOW里面的界面插件 ...

  6. 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!

    本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...

  7. (多核DSP快速入门)SYS/BIOS入门

    (多核DSP快速入门)SYS/BIOS入门   原创文章 转载请注册来源http://blog.csdn.net/tostq 系列教程目录:http://blog.csdn.net/tostq/art ...

  8. 毫无基础的人入门Python,Python入门教程

    随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...

  9. Seven xxx in Seven Weeks ebooks | 七周七 xxx 系列图书 电子书| share 分享 | free of charge 免费!

    Seven xxx  in Seven Weeks ebooks |  七周七 xxx 系列图书  电子书| share  分享 | free of charge  免费! Seven Languag ...

随机推荐

  1. vscode的go插件安装

    vscode安装go的很多插件都是失败,如下: Installing 5 tools at E:\www\go_project\bin go-symbols guru gorename goretur ...

  2. 使用JAX-RS创建RESTful Web Service

    guice resteasy http://www.cnblogs.com/ydxblog/p/7891224.html http://blog.csdn.net/withiter/article/d ...

  3. inline-block,vertical-align:middle

    现在inline-block貌似可以替代float来实现多个item的排列分布吧 div是块级元素,如果不设置他的明确的宽度,那他就等于父元素的宽度,如果想让他其它随着子元素的变化而变化,需要改变他的 ...

  4. Java学习笔记(十三一)——Xml 常用知识总结

    [前面的话] 在学习spring框架,发现很多地方都用到了Xml的知识,所以会过头来再学习学习Xml. 本章学习的是Xml的基础,所以基础性文章,选择性阅读. [Xml] 一.Xml初步了解 XML ...

  5. Java学习之路(转)

    Java学习之路(书籍推荐)   一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多 ...

  6. 牛刀小试之Django二

    model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  7. 如何去除windows下文本的^M

    使用vi编辑,输入命令: :%s/^M/\r/g 用来把^M换成回车 注意的是^M要使用CTRL-V CTRL-M生成,而不是直接键入^M

  8. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...

  9. 【数论】bzoj1968 [Ahoi2005]COMMON 约数研究

    对于i属于[1,n],i只能成为[1,n]中n/i个数的约数,易证. #include<stdio.h> int n,i; long long ans; int main() { scan ...

  10. 【并查集】POJ2236-Wireless Network

    [题目大意] 已知每一台电脑只能与它距离为d的电脑相连通,但是两台电脑间可以以第三台作为媒介连接.现在电脑全被损坏.每次可以进行两个操作中的一个,或是修好一台电脑,或是查询两台电脑是否连通. [思路] ...