zoukankan      html  css  js  c++  java
  • 跟着我从零开始入门FPGA(一周入门XXOO系列)-1、Verilog语法

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

    作者: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青年交朋友也不难了。

  • 相关阅读:
    进程通信之信号通信
    分数化小数
    台湾大学公开课《概率》第五周一道不会作的作业题 ,一种看不懂的解法
    网络子系统53_ip协议分片重组_内存阈值
    Centos 6.3 Realtek Audio Driver Compile
    I.MX6 PHY fixup 调用流程 hacking
    I.MX6 AR8031 寄存器操作
    I.MX6 ethtool 移植
    I.MX6 U-Boot ping网络
    Android tcpdump 使用
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7623710.html
Copyright © 2011-2022 走看看