FPGA学习之数码管(封装)显示时间

一、实验目的:学习数码管封装以及显示时间。
二、实验环境:FPGA开发板AX301,Quartus ii
三、实验介绍:将数码管显示模块封装起来,同时通过不断读取RTC时钟的时分秒值,将之显示在数码管。实验时,将实时时间的时分秒写入程序,运行程序后可以看到数码管显示的时间会不断的刷新。
四、源码

module smg_interface_demo
(
    input CLK,
     input RSTn,
     output  RST,
    output SCLK,
    inout SIO,
     output [7:0]SMG_Data,
     output [5:0]Scan_Sig
);

    /******************************/ 

    wire [23:0]Number_Sig;

     exp13_demo U1
     (
       .CLK( CLK ),
       .RSTn( RSTn ),
        .Number_Sig(Number_Sig),
       .RST( RST ),
       .SCLK( SCLK ),
       .SIO( SIO )
    );

     /******************************/ 

     smg_interface U2
     (
         .CLK( CLK ),
          .RSTn( RSTn ),
          .Number_Sig( Number_Sig),
         // .Number_Sig( Number_Sig ), // input - from U1
          .SMG_Data( SMG_Data ),     // output - to top
          .Scan_Sig( Scan_Sig )      // output - to top
     );

    /******************************/ 

endmodule
module exp13_demo  //将DS1302的时分秒显示在六位数码管上
(
    CLK, RSTn,
     Number_Sig,
     //Second_data0, Second_data1, Mini_data0,Mini_data1,Hour_data0,Hour_data1,
    // LED,
     RST,
     SCLK,
     SIO
);

    input CLK;
     input RSTn;
     output RST;
     output SCLK;
     inout SIO;
//     output [3:0]LED;
    // output [19:0]showdata;
    output [23:0] Number_Sig;
    // output [7:0]Row_Scan_Sig;
    // output [5:0]Column_Scan_Sig;
//     output [3:0]Second_data0;
//     output [3:0]Second_data1;
//     output [3:0]Mini_data0;
//     output [3:0]Mini_data1;
//     output [3:0]Hour_data0;
//     output [3:0]Hour_data1;
     /*******************************/

         /******************************/

     parameter T100MS = 23‘d4_999_999;

     /******************************/

     reg [22:0]C1;

     always @ ( posedge CLK or negedge RSTn )
         if( !RSTn )
              C1 <= 23‘d0;
          else if( C1 == T100MS )
              C1 <= 23‘d0;
          else
              C1 <= C1 + 1‘b1;

      /*******************************************************/

    reg [3:0]i;
    reg [7:0]isStart;
    reg [7:0]rData;
    //reg [3:0]rLED;
    reg [3:0]rSecond_data0;
    reg [3:0]rSecond_data1;
   reg [3:0]rMini_data0;
    reg [3:0]rMini_data1;
    reg [3:0]rHour_data0;
    reg [3:0]rHour_data1;
    reg [23:0]rNum;
    reg [23:0]rNumber;

//    always @ ( posedge CLK or negedge RSTn )
//          if( !RSTn )
//                begin
//                    i <= 4‘d0;
//                      rNum <= 24‘d0;
//                      rNumber <= 24‘d0;
//                 end
//           else
//                case( i )
//
//                     0:
//                      if( C1 == T100MS ) begin rNum[3:0] <= rNum[3:0] + 1‘b1; i <= i + 1‘b1; end
//
//                      1:
//                      if( rNum[3:0] > 4‘d9 ) begin rNum[7:4] <= rNum[7:4] + 1‘b1; rNum[3:0] <= 4‘d0; i <= i + 1‘b1; end
//                      else i <= i + 1‘b1;
//
//                      2:
//                      if( rNum[7:4] > 4‘d9 ) begin rNum[11:8] <= rNum[11:8] + 1‘b1; rNum[7:4] <= 4‘d0; i <= i + 1‘b1; end
//                      else i <= i + 1‘b1;
//
//                      3:
//                      if( rNum[11:8] > 4‘d9 ) begin rNum[15:12] <= rNum[15:12] + 1‘b1; rNum[11:8] <= 4‘d0; i <= i + 1‘b1; end
//                      else i <= i + 1‘b1;
//
//                      4:
//                      if( rNum[15:12] > 4‘d9 ) begin rNum[19:16] <= rNum[19:16] + 1‘b1; rNum[15:12] <= 4‘d0; i <= i + 1‘b1; end
//                    else i <= i + 1‘b1;
//
//                      5:
//                      if( rNum[15:12] > 4‘d9 ) begin rNum[19:16] <= rNum[19:16] + 1‘b1; rNum[15:12] <= 4‘d0; i <= i + 1‘b1; end
//                      else i <= i + 1‘b1;
//
//                      6:
//                      if( rNum[19:16] > 4‘d9 ) begin rNum[23:20] <= rNum[23:20] + 1‘b1; rNum[19:16] <= 4‘d0; end
//                      else i <= i + 1‘b1;
//
//                      7:
//                      if( rNum[23:20] > 4‘d9 ) begin rNum <= 24‘d0; i <= i + 1‘b1; end
//                      else i <= i + 1‘b1;
//
//                      8:
//                      begin rNumber <= rNum; i <= 4‘d0; end
//
//                 endcase

    /*******************************************************/

    always @ ( posedge CLK or negedge RSTn )
        if( !RSTn )
             begin
                  i <= 4‘d0;
                  isStart <= 8‘d0;
                    rData <= 8‘d0;
                    rNum <= 24‘d0;
                    rNumber <= 24‘d0;
                    //rLED <= 4‘d0;
              end
         else
             case( i )

                  0:
                    if( Done_Sig ) begin isStart <= 8‘d0; i <= i + 1‘b1; end
                    else begin isStart <= 8‘b1000_0000; rData <= 8‘h00; end

                    1:
                    if( Done_Sig ) begin isStart <= 8‘d0; i <= i + 1‘b1; end
                    else begin isStart <= 8‘b0100_0000; rData <= { 4‘d2, 4‘d0 }; end   //HOUR

                    2:
                    if( Done_Sig ) begin isStart <= 8‘d0; i <= i + 1‘b1; end
                    else begin isStart <= 8‘b0010_0000; rData <= { 4‘d0, 4‘d6 }; end//MINITU

                    3:
                    if( Done_Sig ) begin isStart <= 8‘d0; i <= i + 1‘b1; end//SECOND
                    else begin isStart <= 8‘b0001_0000; rData <= { 4‘d2, 4‘d2 }; end

                    4:
                    //if( Done_Sig ) begin rLED <= Time_Read_Data[3:0];rSecond_data0<= Time_Read_Data[3:0];rSecond_data1<= Time_Read_Data[7:4]; isStart <= 8‘d0; i <= 4‘d4; end
                    if( Done_Sig ) begin rNum[7:4]<=Time_Read_Data[7:4];rNum[3:0]<=Time_Read_Data[3:0];rSecond_data0<= Time_Read_Data[3:0];rSecond_data1<= Time_Read_Data[7:4]; isStart <= 8‘d0; i <= i + 1‘b1; end
                    else begin isStart <= 8‘b0000_0001; end

                    5:
                    if( Done_Sig ) begin rNum[15:12]<=Time_Read_Data[7:4];rNum[11:8]<=Time_Read_Data[3:0];rMini_data0<= Time_Read_Data[3:0];rMini_data1<= Time_Read_Data[7:4]; isStart <= 8‘d0; i <= i + 1‘b1; end
                    else begin isStart <= 8‘b0000_0010; end

                    6:
                    if( Done_Sig ) begin rNum[23:20]<=Time_Read_Data[7:4];rNum[19:16]<=Time_Read_Data[3:0];rHour_data0<= Time_Read_Data[3:0];rHour_data1<= Time_Read_Data[7:4]; isStart <= 8‘d0; i <= i + 1‘b1; end
                    else begin isStart <= 8‘b0000_0100; end

                    7:
                    if(i==7) begin rNumber <= rNum;i<= 4‘d4;end
              endcase

    /********************************************/

     wire Done_Sig;
     wire [7:0]Time_Read_Data;

     ds1302_module U1
    (
        .CLK( CLK ),
         .RSTn( RSTn ),
         .Start_Sig( isStart ),
         .Done_Sig( Done_Sig ),
         .Time_Write_Data( rData ),
         .Time_Read_Data( Time_Read_Data ),
         .RST( RST ),
         .SCLK( SCLK ),
         .SIO( SIO )
    );

     /********************************************/

    // assign LED = rLED;

//     assign Second_data0 = rSecond_data0;
//     assign Second_data1 = rSecond_data1;
//     assign Mini_data0 = rMini_data0;
//     assign Mini_data1 = rMini_data1;
//     assign Hour_data0 = rHour_data0;
//     assign Hour_data1 = rHour_data0;
     //assign Number_Sig = rSecond_data0+rSecond_data1*10+rMini_data0*100+rMini_data1*1000+rHour_data0*10000+rHour_data1*100000;
    // assign
    //assign  Number_Sig[23:20] = rHour_data1;
//    assign  Number_Sig[19:16] = rHour_data0;
//   assign  Number_Sig[15:12] = rMini_data1;
//    assign  Number_Sig[11:8] = rMini_data0;
//    assign  Number_Sig[7:4] = rSecond_data1;
//    assign  Number_Sig[3:0] = rSecond_data0;

//assign  Number_Sig={rHour_data1,rHour_data0,rMini_data1,rMini_data0,rSecond_data1,rSecond_data0};
    //assign  Number_Sig = 24‘d123456;
    assign  Number_Sig = rNumber;
     /*********************************************/

endmodule
module smg_interface
(
    input CLK,
     input RSTn,
     input [23:0]Number_Sig,
     output [7:0]SMG_Data,
     output [5:0]Scan_Sig
);

    /******************************************/

     wire [3:0]Number_Data;

     smg_control_module U1
     (
        .CLK( CLK ),
         .RSTn( RSTn ),
         .Number_Sig( Number_Sig ),    // input - from top
         .Number_Data( Number_Data )   // output - to U2
     );

     /******************************************/

    smg_encode_module U2
     (
         .CLK( CLK ),
          .RSTn( RSTn ),
          .Number_Data( Number_Data ),   // input - from U2
          .SMG_Data( SMG_Data )          // output - to top
     );

     /*******************************************/

     smg_scan_module U3
     (
         .CLK( CLK ),
          .RSTn( RSTn ),
          .Scan_Sig( Scan_Sig )  // output - to top
     );

     /*******************************************/

endmodule

五、RTL图

六、总结

前几次编译下载程序总是显示异常,最后发现是PIN管脚问题,以后需要注意检查硬件配置是否正确。

时间: 05-30

FPGA学习之数码管(封装)显示时间的相关文章

我的 FPGA 学习历程(09)&mdash;&mdash; 实验点亮单个数码管

数码管是一种常见的用于显示的电子器件,根据数码管大致可以分为共阴极和共阳极两种,下图所示的是一个共阳极的数码管的电路图(摘自金沙滩工作室的 51 开发板电路图),我的 AX301 开发板与这张图的情况类似,几乎所有的教科书上都会讲到数码管的原理,这里我就不再详述了. 由于多个数码管的段选信号(下图中的 DB0~DB7)是共用的,想要显示多个数字需要用到动态扫描,动态扫描电路需要使用时钟.冒然的使用时钟会使得初学者不知所措,所以在这篇基础的组合逻辑电路中只点亮单个数码管,这样就不必涉及到时钟了.时

Android中通过反射来设置显示时间

这个Toast的显示在Android中的用途还是很大的,同时我们也知道toast显示的时间是不可控的,我们只能修改他的显示样式和显示的位置,虽然他提供了一个显示时间的设置方法,但是那是没有效果的(后面会说到),他有两个静态的常量Toast.SHORT和Toast.LONG,这个在后面我会在源码中看到这个两个时间其实是2.5s和3s.那么我们如果真想控制toast的显示时间该怎么办呢?真的是无计可施了吗?天无绝人之路,而且Linux之父曾经说过:遇到问题就去看那个操蛋的源代码吧!!下面就从源代码开

Sharepoint2013搜索学习笔记之自定义结果显示模板(九)

搜索结果通过套用定义好的显示模板来展示结果,显示模板由js和html组成,我们可以通过修改显示模板,然后将修改好的显示模板跟搜索结果绑定起来,来修改搜索结果的显示效果,例子如下图: 修改前 修改后 第一步,确定显示需要修改的显示模板,打开ie,摁f12,定位到搜索结果列表项找到需要修改的搜索项模板 第二步,从搜索中心进入网站设置页面 第三步,点击web设计器库的母版页和页面布局 第四步,进入母版页样式库的 Display Templates/search目录,该目录就是存放搜索结果显示模板的地方

如何学习FPGA?FPGA学习必备的基础知识

如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望跨进FPGA的大门.网络上各种开发板.培训班更是多如牛毛,仿佛在告诉你不懂FPGA你就OUT啦.那么我们要玩转FPGA必须具备哪些基础知识呢?下面我们慢慢道来. (一) 要了解什么是FPGA 既然要玩转FPGA,那我们首先最重要的当然是要了解什么FPGA.FPGA(Field-Programmable Gate

Android中通过反射来设置Toast的显示时间

这个Toast的显示在Android中的用途还是非常大的,同一时候我们也知道toast显示的时间是不可控的.我们仅仅能改动他的显示样式和显示的位置,尽管他提供了一个显示时间的设置方法.可是那是没有效果的(后面会说到).他有两个静态的常量Toast.SHORT和Toast.LONG,这个在后面我会在源码中看到这个两个时间事实上是2.5s和3s. 那么我们假设真想控制toast的显示时间该怎么办呢?真的是无计可施了吗?天无绝人之路,并且Linux之父以前说过:遇到问题就去看那个操蛋的源码吧.!以下就

51单片机 数码管的显示与译码器

共阳极数组0~9:display[]={0xC0,0xF9,0xA4,0xB0,0x91,0xA2,0x82,0xF8,0x80,0x90} 共阳极数组A~F:display[]={0x88,0x83,0xA6,0xC1,0x86,0x8E} 共阴极数组0~9:display[]={0x3F,0x06,0x5B,0x4F,0x6E,0x6D,0x7D,0x07,0x7F,0x6F} 共阴极数组A~F:display[]={0x77,0x7C,0x59,0x3E,0x79,0x71} 共阴.两组四

Toast拓展--自定义显示时间和动画

Toast拓展–自定义显示时间和动画 我们在Android应用开发中经常会需要在界面上弹出一个对界面操作无影响的小提示框来提示用户一些信息,这时候一般都会使用Android原生的Toast类 Toast.makeText(mContext, "消息内容", Toast.LENGTH_SHORT).show(); 一开始觉得,挺好用的,就有点什么消息都用Toast显示了. 但是用久了就发现,Toast的显示和消失动画不符合自己的要求,显示时间也只有SHORT和LONG两种选择,好像不太够

javascript 学习小结 (三) jQuery封装ajax尝试 by FungLeo

javascript 学习小结 (三) jQuery封装ajax尝试 by FungLeo 前言 在JS学习中,对于原生的很多东西我理解得并不透彻.但是使用jQuery来操作DOM,基本上还是非常熟练的.但是对于AJAX数据交互的处理,我不是很理解. 近期团队交给我一个后端全接口提供给我的项目.我要利用这些接口来自己组织前端代码.为了学习,我决定不使用VUE或者其他的前端框架来做.而是只使用jQuery框架,数据的部分全部使用拼接字符串的形式实现. 获取数据,显示数据,提交数据. 在这个项目中(

转载FPGA学习之内嵌乘法器调用

补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块. 上课的时候一直听老师说真正实践的时候你别想着要自己写一个乘法器,那样子做的孩子是笨蛋. 不管老师说得对不对,总之,既然FPGA内部有硬件乘法器那么为啥不直接使用呢,而且在写verilog使用是非常简单的,只是用个*号就轻易搞定. 只要所使用的FPGA内嵌有乘法器,则综合软件在综合的时候就会自动帮你调用乘法器实现. 下面是一段简单代码: m