数码管的封装实验 --- verilog

数码管的封装实验。显示使能信号置高才可以显示。对于小数点不用,故不显示。

数码管分为共阴数码管和共阳数码管,数码管不同,编码不同,下面是两种数码管显示0-F以及消隐的不同编码:

共阴数码管(高有效):

parameter  seg_H_0 = 8‘h3f, seg_H_1 = 8‘h06,  seg_H_2 = 8‘h5b,
           seg_H_3 = 8‘h4f, seg_H_4 = 8‘h66,  seg_H_5 = 8‘h6d,
               seg_H_6 = 8‘h7d, seg_H_7 = 8‘h07,  seg_H_8 = 8‘h7f,
                     seg_H_9 = 8‘h67, seg_H_A = 8‘h77,  seg_H_B = 8‘h7c,
                     seg_H_C = 8‘h39, seg_H_D = 8‘h5e,  seg_H_E = 8‘h79,
               seg_H_F = 8‘h71, seg_H_X    = 8‘h00;    

共阳数码管(低有效):

parameter  seg_L_0 = 8‘hc0, seg_L_1 = 8‘hf9, seg_L_2 = 8‘ha4,
           seg_L_3 = 8‘hb0, seg_L_4 = 8‘h99, seg_L_5 = 8‘h92,
               seg_L_6 = 8‘h82, seg_L_7 = 8‘hf8, seg_L_8 = 8‘h80,
                     seg_L_9 = 8‘h98, seg_L_A = 8‘h88, seg_L_B = 8‘h83,
                     seg_L_C = 8‘hc6, seg_L_D = 8‘ha1, seg_L_E = 8‘h86,
               seg_L_F = 8‘h8e, seg_L_X = 8‘hff;

显示程序:

头文件

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name  :seg_interface.v
** CreateDate :2015.04
** Funtions   :数码管封装,6位,数据为23位,4位在一个数码管上显示
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved.
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :
** Modify Content:
*******************************************************************************/

 module seg_interface(
             clk,
                       rst_n,

                         segdisplay_en,
                       number_data,

                       seg_data,
                       seg_bit

                        );
input             clk;       /* clk = 24M */
input             rst_n;
input    [23:0]   number_data;    /* 输入的数据 */
input             segdisplay_en;  /* 数码管显示使能 */
output   [7:0]    seg_data;
output   [5:0]    seg_bit;

wire     [7:0]    seg_data;
wire     [5:0]    seg_bit;

wire   [3:0]      number_data_reg;  

 smg_control    U1(
           .clk(clk),
                     .rst_n(rst_n),

                     .segdisplay_en(segdisplay_en),

                     .number_data(number_data),           //in  23位输入数据
                     .seg_data_reg(number_data_reg),      //数据的中间变量 out  to U1
                     .seg_bit(seg_bit)                   //output 6 位数码管的位数
                        );
smg_encode    U2(
                    .number_data_reg(number_data_reg),      //In  要显示的数据的中间变量
                    .seg_data(seg_data)
                     );    

 endmodule 

底层:

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name  :smg_control.v
** CreateDate :2015.04
** Funtions   :数码管的位码控制和数据控制,状态机控制,1ms转移一位数码管
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved.
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :
** Modify Content:
*******************************************************************************/

module  smg_control(
           clk,
                     rst_n,

                     segdisplay_en,
                     number_data,
                     seg_data_reg,
                     seg_bit
                        );
 input           clk;
 input           rst_n;
 input  [23:0]   number_data;     //共使用6个数码管,每个4位数据,共24位
 input           segdisplay_en;

 output   [3:0]  seg_data_reg;
 output   [5:0]  seg_bit;
 wire     [3:0]  seg_data_reg;
 wire     [5:0]  seg_bit;

 parameter     t1ms = 15‘d23999;   /* reality */

//  parameter     t1ms = 15‘d3;      /* just fo test */
 reg     [14:0]   count1;
 always @(posedge clk or negedge rst_n)
  begin
     if(!rst_n)
          count1 <= ‘d0;
        else if(segdisplay_en)
          begin
        if(count1 == t1ms)  count1 <= ‘d0;
         else   count1 <= count1 + 1;
          end
      else
            count1 <= ‘d0;
  end

//****************************************
 reg       [2:0]   i;
 reg       [3:0]   rnumber;
 reg       [5:0]   rbit;

 always @(posedge clk or negedge rst_n)
  begin
    if(!rst_n)
      begin
            i <= ‘d0;
            rnumber <= ‘d0;
                rbit <= 6‘b111111;      /* 有消隐的作用 */
       end
    else  if(segdisplay_en)
       begin
         case(i)
          ‘d0:
             begin
                if(count1 == t1ms)
                   i <= ‘d1;
                 else
                  begin
                    rnumber <=  number_data[23:20];
                      rbit <= 6‘b011111;
                  end
             end
           ‘d1:
             begin
               if(count1 == t1ms)
                   i <= ‘d2;
                 else
                   begin
                      rnumber <=  number_data[19:16];
                        rbit <= 6‘b101111;
                    end
             end
            ‘d2:
             begin
               if(count1 == t1ms)
                   i <= ‘d3;
                 else
                   begin
                    rnumber <=  number_data[15:12];
                    rbit <= 6‘b110111;
                   end
             end
             ‘d3:
             begin
               if(count1 == t1ms)
                   i <= ‘d4;
                 else
                  begin
                    rnumber <=  number_data[11:8];
                    rbit <= 6‘b111011;
                   end
             end
             ‘d4:
             begin
               if(count1 == t1ms)
                   i <= ‘d5;
                 else
                  begin
                    rnumber <=  number_data[7:4];
                    rbit <= 6‘b111101;
                  end
             end
             ‘d5:
             begin
               if(count1 == t1ms)
                   i <= ‘d0;
                 else
                  begin
                   rnumber <=  number_data[3:0];
                   rbit <= 6‘b111110;
                   end
             end
           default :  i <= ‘d0;
        endcase
    end
    else
            begin
            i <= ‘d0;
            rnumber <= ‘d0;
                rbit <= 6‘b111111;      /* 有消隐的作用 */
       end
 end

 assign  seg_data_reg = rnumber;
 assign  seg_bit = rbit;

endmodule
           

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name  :smg_encode.v
** CreateDate :2015.04
** Funtions   :数码管的编码文件,输入4位,输出8位
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved.
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :
** Modify Content:
*******************************************************************************/

module smg_encode (
                     number_data_reg,
                     seg_data
                     );
input   [3:0]    number_data_reg;

output [7:0]     seg_data;
wire   [7:0]     seg_data;

//parameter  seg_0 = 8‘b1100_0000, seg_1 = 8‘b1111_1001, seg_2 = 8‘b1010_0100,
//           seg_3 = 8‘b1011_0000, seg_4 = 8‘b1001_1001, seg_5 = 8‘b1001_0010,
//               seg_6 = 8‘b1000_0010, seg_7 = 8‘b1111_1000, seg_8 = 8‘b1000_0000,
//               seg_9 = 8‘b1001_0000;
//            ----
//                     |    |
//                     |    |
//                      ----
//                     |    |
//                     |    |
//                      ---- 。

parameter  seg_H_0 = 8‘h3f, seg_H_1 = 8‘h06,  seg_H_2 = 8‘h5b,
           seg_H_3 = 8‘h4f, seg_H_4 = 8‘h66,  seg_H_5 = 8‘h6d,
               seg_H_6 = 8‘h7d, seg_H_7 = 8‘h07,  seg_H_8 = 8‘h7f,
                     seg_H_9 = 8‘h67, seg_H_A = 8‘h77,  seg_H_B = 8‘h7c,
                     seg_H_C = 8‘h39, seg_H_D = 8‘h5e,  seg_H_E = 8‘h79,
               seg_H_F = 8‘h71, seg_H_X    = 8‘h00;    

/*
parameter  seg_L_0 = 8‘hc0, seg_L_1 = 8‘hf9, seg_L_2 = 8‘ha4,
           seg_L_3 = 8‘hb0, seg_L_4 = 8‘h99, seg_L_5 = 8‘h92,
               seg_L_6 = 8‘h82, seg_L_7 = 8‘hf8, seg_L_8 = 8‘h80,
                     seg_L_9 = 8‘h98, seg_L_A = 8‘h88, seg_L_B = 8‘h83,
                     seg_L_C = 8‘hc6, seg_L_D = 8‘ha1, seg_L_E = 8‘h86,
               seg_L_F = 8‘h8e, seg_L_X = 8‘hff;
 */
//*********************************************************
   reg        [7:0]          rsmg;
  always @(*)
     begin
          case(number_data_reg)
             4‘h0: rsmg <= seg_H_0;
               4‘h1: rsmg <= seg_H_1;
               4‘h2: rsmg <= seg_H_2;
               4‘h3: rsmg <= seg_H_3;
               4‘h4: rsmg <= seg_H_4;
               4‘h5: rsmg <= seg_H_5;
               4‘h6: rsmg <= seg_H_6;
               4‘h7: rsmg <= seg_H_7;
               4‘h8: rsmg <= seg_H_8;
               4‘h9: rsmg <= seg_H_9;
                 4‘ha: rsmg <= seg_H_A;
               4‘hb: rsmg <= seg_H_B;
               4‘hc: rsmg <= seg_H_C;
               4‘hd: rsmg <= seg_H_D;
               4‘he: rsmg <= seg_H_E;
                 4‘hf: rsmg <= seg_H_F;
            default : rsmg <= seg_H_X;
     endcase
 end

 assign  seg_data= rsmg;

 endmodule 

测试文件:

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name  :seg_tb.v
** CreateDate :2015.04
** Funtions   : 数码管的测试文件
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved.
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :
** Modify Content:
*******************************************************************************/

 `timescale 1 ns/1 ns

 module  seg_tb;
  reg             clk;       /* clk = 24M */
    reg             rst_n;
    reg    [23:0]   number_data;    /* 输入的数据 */
  reg             segdisplay_en;

    wire   [7:0]    seg_data;
    wire   [5:0]    seg_bit;

 seg_interface  seg_interface1(
                                     .clk,
                                     .rst_n,
                                     .number_data,
                                     .segdisplay_en(segdisplay_en),

                                     .seg_data,
                                     .seg_bit
                                    ); 

  parameter  tck = 24;
    parameter  t = 1000/tck;

    always
        #(t/2) clk = ~clk;

  initial
    begin
             clk = 0;
             rst_n = 0;
             number_data = 0;
             segdisplay_en = 0;

             #(20*t)   rst_n = 1;
             #(20*t)   segdisplay_en = 1;
                   number_data = 24‘h123456;

             #(100*t) number_data = 24‘h789abc;
        end
endmodule

仿真图:

时间: 2024-08-31 14:14:02

数码管的封装实验 --- verilog的相关文章

1-ser2008系统封装实验报告

系统封装实验 1.       封装系统的原因 直接克隆系统会导致克隆后的系统和原系统的SID号一致,在许多实验中会因为SID号相同而影响实验效果(如活动目录) 2.       实验 首先看一下ser2008的封装,很简单,找到系统盘(一般是c盘),打开路径c:\windows\system32\sysprep 来自为知笔记(Wiz) 附件列表

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

一.实验目的:学习数码管封装以及显示时间.二.实验环境:FPGA开发板AX301,Quartus ii三.实验介绍:将数码管显示模块封装起来,同时通过不断读取RTC时钟的时分秒值,将之显示在数码管.实验时,将实时时间的时分秒写入程序,运行程序后可以看到数码管显示的时间会不断的刷新.四.源码 module smg_interface_demo ( input CLK, input RSTn, output RST, output SCLK, inout SIO, output [7:0]SMG_D

SPI通信实验---verilog(FPGA作为从机,使用可读可写)

本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可.cs信号上升沿作为SPI通信的结束信号.rom程序只是做测试使用. 每次发送16个时钟信号,前八个是地址和命令,后八个是数据.其中:前8个时钟接受的数据的最高位决定着这次通信是读取数据还是写入数据,最高位为1,则是读取数据,为0则是写入数据. 程序: /********************************Copyright***

2-ser2003系统封装实验报告

Ser2003需要挂载系统镜像 至此,ser2003的母盘制作完成!!! 来自为知笔记(Wiz) 附件列表

51单片机第三弹---数码管显示

先把定义拉过来: LED数码管是由多个发光二极管封装在一起组成"8"字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极.LED数码管常用的段数一般为7段,有的另加一个小数点 .LED数码管根据LED的接法不同,分为共阴和共阳两类 . 贴原理图 其实就两点 :由于板子上有8个数码管,而每个数码管有8段,称选择显示哪一个数码管的东西为位选,称单个数码管显示数字几的东西为段选,位选由P2.2  p2.3 p2.4 控制 数码管IO口为P0 对于每一个数码管,显示数字几只要控制

51瞎搞系列---独立键盘+数码管

瞎写着玩玩... /******************************************************************************* * 实 验 名 : 数码管+独立键盘实验 * 使用的IO : 数码管使用P0 独立键盘开关K1使用P3.1 * 实验效果 : 按开关K1使数码管从左侧由数字1亮至右侧8 * 注 意 : *******************************************************************

V3学院带你学习EEPROM读写实验

一.实验背景在消费者电子电讯和工业电子中看上去不相关的设计里经常有很多相似的地方例如几乎每个系统都包括一些智能控制通常是一个单片的微控制器,通用电路例如LCD驱动器远程I/O,RAM,EEPROM或数据转换器,面向应用的电路譬如收音机和视频系统的数字调谐和信号处理电路或者是音频拨号电话的DTM发生器,为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips开发了一个简单的双向两线总线实现有效的IC之间控制这个总线就称为Inter IC或I2C总线现在Philips

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} 共阴.两组四

《Java语言程序设计》上机实验

实验一   Java环境演练   [目的] ①安装并配置Java运行开发环境: ②掌握开发Java应用程序的3个步骤:编写源文件.编译源文件和运行应用程序: ③学习同时编译多个Java源文件. [内容]    1.一个简单的应用程序 ²  实验要求: 编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”. ²  程序运行效果示例: 程序运行效果如下图所示: ²  程序模板:  Hello.java public clas