• FPGA学习笔记(二)模块建立及变量连接


        Verilog所写的工程是由一个一个的模块连接起来的,每个文件代表一个模块,模块的名字和文件名要保持一致,一个模块的基本声明方法为:

    //FileName:main_module
    module main_module(
        CLK, RSTn, IO_In, IO_Out
    );
        input CLK;
        input RSTn;
        input IO_In;
        output IO_Out;
    
    endmodule

        对于顶层文件,所有声明的input、output变量都可分配引脚。所谓的input和output是相对于自己来说的,如果要利用此变量读入内容,则声明为input,要利用此变量输出内容,则声明为output。

        为了捕获顶层文件的CLK,RSTn,IO_In,同时处理后输出IO_Out,需要另外建立一个模块(文件),如下:

    //File_Name:io_changer
    module io_changer(
        myCLK, myRSTn, myIO_In, myIO_Out;
    );
        input myCLK;
        input myRSTn;
        input myIO_In;
        output myIO_Out;
    
    endmodule

        要连接这两个模块,也就是顶层main_module连接到io_changer,则需要在顶层文件内做如下声明:

    wire Out_Receiver;
    io_changer U1(
        .myCLK( CLK ),
        .myRSTn( RSTn ),
        .myIO_In( IO_In ),
        .myIO_Out( Out_Receiver )
    );

        由于前三个变量都声明为了input,因此会将顶层的三个变量值传入,而第四个变量声明为了output,因此会将io_changer中的myIO_Out的值传入顶层的wire变量Out_Receiver。这类似于C++中的类内赋值,可以想象为.前面有一个this指针,在io_changer类内,this.myCLK就是io_changer的myCLK变量,括号是一种赋值手段,当然这里也增加了输出的功能。

        当建立起这样的两个模块并且完成编译后,会自动完成文件连接,将io_changer作为main_module的子文件。

        在模块io_changer内,要改变myIO_Out的值,一般采用assign赋值

        在always循环结构内,一般使用reg变量而不能是wire变量,假设存在一个计数器Counter的值由0到50000000代表1秒,要使得IO_Out每500ms翻转一次,则要如下书写:

    reg rIO_Out;
    always @ (posedge myCLK or negedge myRSTn)
    
            if (!myRSTn)
                rIO_Out = 1'b0;
            else if(Counter >= 2500_0000)
                rIO_Out = 1'b1;
            else
                rIO_Out = 1'b0;
    assign myIO_Out = rIO_Out

        为了将变化回传到顶层,还需要在顶层内将接收到的Out_Receiver赋值到IO_Out引脚,如下:

    assign IO_Out = Out_Receiver;


  • 相关阅读:
    数据库事务的特性以及隔离级别
    非受检异常(运行时异常)和受检异常的区别等
    在测试crontab执行脚本的时候,修改了linux的系统时间,crontab不执行了。
    perl的foreach循环的坑
    javascript中快速求数组的全部元素的相加之和
    js 百度地图
    PHP 取前一天或后一天、一个月时间
    php截取字符串函数
    js jquery 基本元素操作
    PHP 替换标签和标签内的内容
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154266.html
Copyright © 2020-2023  润新知