当前位置:   article > 正文

初探FPGA(二)之建模框架_fpga框架下的模型后缀名

fpga框架下的模型后缀名

低级建模框架

功能模块(最基本的动作)

例子实现一个灯闪烁
//第一步模块的输入输出
    module flash_module
    (
        //模块输入输出
        CLK,RSTn,LED_Out
    );
    //第二步定义输入输出
        input CLK;
        input RSTn;
        output LED_Out;

    //第三步模块内容
        parameter T50MS = 22'd2_499_999;//定义常量
        reg[21:0] Count1;//定义变量or寄存器
        //仿顺序用法模板  复位;计数;计满清零;//功能延时
        always@(posedge CLK or negedge RSTn)
        if(!RSTn)
            Count1<=0;
            else if(Count1 == T50MS)
                Count1 <=0;
                else
                Count1 <= Count1+1'b1;
    /****************************************************/      
            //实现功能部分
            reg rLED_Out;

            always@(posedge CLK or negedge RSTn)
            if(!RSTn)
                rLED_Out <= 1'b0;
            else if(Count1 == T50MS)
                    rLED_Out <= ~rLED_Out;

    //第四部链接输入输出
            assign LED_Out = rLED_Out;

    endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

控制模块(动作的控制步骤)

三个灯的流水效果
    //第一步模块的输入输出
    module run_module
    (
        CLK,RSTn,LED_Out
    );
    //第二步定义输入输出
        input CLK;
        input RSTn;
        output [2:0]LED_Out;//输出位数要标注
        /*定义时间//晶振50Mhz 
    //第三步功能实现1延时
        0.001s*50_000_000-1 = 49_999*/
        parameter T1MS = 16'd49_999;

        /***************************/
        reg [15:0] Count1;
        always@(posedge CLK or negedge RSTn)
        if(!RSTn)
            Count1 <= 16'd0;
            else if(Count1 == T1MS)
                    Count1 <= 16'd0;
                else
                    Count1 <= Count1+1'b1;
        /*******************************/
        //控制
        reg [9:0] Count_MS;
        always@(posedge CLK or negedge RSTn)
        if(!RSTn)
            Count_MS <= 10'd0;
            else if(Count_MS == 10'd100)
                    Count_MS     <=  10'd0;
                    else if(Count1 == T1MS)
                        Count_MS <= Count_MS + 1'd1;

        /*********************************/
        reg[2:0]rLED_Out;
        always@(posedge CLK or negedge RSTn)
        if(!RSTn)
            rLED_Out <= 3'b001;
                else if(Count_MS == 10'd100)
                    begin 
                        if(rLED_Out == 3'b000)
                            rLED_Out <= 3'b001;
                        else
                            rLED_Out <= {rLED_Out[1:0],1'b0}; //rLED_Out后两位取出,末尾添加0,作为新的rLED_Out
                                                                            //当rLED_Out为000时,执行39行变为001
                                                                            //当rLED_Out为001时,执行41行,取后两位01,末尾添0,为010
                                                                            //当rLED_Out为010时,执行41行,取后两位10,末尾添0,为100
                                                                            //当rLED_Out为100时,执行41行,取后两位00,末尾添0,为000转第一行
                    end
        /****************************/
        //第四步链接输入输出
        assign LED_Out = rLED_Out;
        /****************************/
    endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

组合模块

将以上两个功能组合在一起
//第一部分模块的书输入输出
    module mix_module
    (
        CLK,RSTn,Flash_LED,Run_LED
    );
    //2定义输入输出
        input CLK;
        input RSTn;
        output Flash_LED;
        output [2:0]Run_LED;

        /***************************/
        //3模块1的实例化
        wire Flash_LED;//连线Flash_LED
        flash_module U1
        (
            .CLK(CLK),//模块1的CLK由CLK输入
            .RSTn(RSTn),//模块1的RSTn由RSTn输入
            .LED_Out(Flash_LED)//模块1的LED_Out输出给Flash_Out
        );
        //3模块2的实例化 
        wire [2:0]Run_LED;
        run_module U2
        (
            .CLK(CLK),
            .RSTn(RSTn),
            .LED_Out(Run_LED)
        );
        /*******************/
        //4链接
        assign Flash_LED = Flash_LED;
        assign Run_LED = Run_LED;
        /*******************/
    endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

一些问题和想法

1.reg和wire的区别

reg只能在initial和always中赋值,reg使用在过程赋值语句中。
wire只能被assign连续赋值,wire使用在连续赋值语句中。
reg相当于存储单元,wire相当于物理连线
input可以是wire和reg;output必须是wire
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial

2.
wire [2:0]Run_LED;
不是必须的;

3.
关于功能模块和控制模块的区别
功能模块是一些基本动作,
而控制模块是动作的集合,实现更加复杂的动作

4.
感谢VerilogHDL那些事儿_建模篇

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/614049
推荐阅读
相关标签
  

闽ICP备14008679号