zoukankan      html  css  js  c++  java
  • (原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (Nios II) (SOPC Builder) (DE2-70)

    Abstract
    本文討論如何在Nios II控制8位數的七段顯示器。

    Introduction
    使用環境:Quartus II 8.0 + Nios II EDS 8.0 + DE2-70 (Cyclone II EP2C70F896C6N)

    (原創) 如何在Nios II顯示8位數的七段顯示器? (IC Design) (DE2) (Nios II)討論的是DE2平台,到了DE2-70平台,控制七段顯示器的方式有些改變:

    1.七段顯示器多了8個小數點可控制。
    2.友晶科技提供了新的七段顯示器ip,其HAL也不太一樣。

    本文使用(原創) 哪裡有DE2-70的Nios II reference design可以參考? (SOC) (DE2-70) (Nios II) (SOPC Builder)所提供的範例為基礎討論。

    SOPC Builder部分
    使用友晶科技所提供SEG7_IF ip

    de2_70_seg7_00

    Top Module部分
    請參考(原創) 哪裡有DE2-70的Nios II reference design可以參考? (SOC) (DE2-70) (Nios II) (SOPC Builder)

    使用HAL控制七段顯示器

    將DE2_70_NIOS_10_seg7ipTERASIC_SEG7software的SEG7.c與SEG7.h 複製到DE2_70_NIOS_10_seg7softwarehello_world_0,必須將SEG7.h與SEG7.c做些修改。

    SEG7.h / C 

    1 #ifndef SEG7_H_
    2 #define SEG7_H_
    3 
    4 #include "alt_types.h"
    5 
    6 void SEG7_Clear(void);
    7 void SEG7_Full(void);
    8 void SEG7_Hex(alt_u32 Data, alt_u8 point_mask);
    9 void SEG7_Decimal(alt_u32 Data, alt_u8 point_mask);
    10 void SEG7_Number(void);
    11 
    12 #endif /*SEG7_H_*/


    4行

    #include "alt_types.h"


    增加inlucde alt_types.h,因為alt_u32定義在alt_types.h

    6行

    void SEG7_Clear(void);
    void SEG7_Full(void);
    void SEG7_Hex(alt_u32 Data, alt_u8 point_mask);
    void SEG7_Decimal(alt_u32 Data, alt_u8 point_mask);
    void SEG7_Number(void);


    提供5個HAL讓我們可以在Nios II用C去控制七段顯示器。

    SEG7_Clear():將8個七段顯示器全部清空不顯示(不是0,是完全不顯示)。
    SEG7_Full():將8個七段顯示器全部顯示8。
    SEG7_Hex():將8個七段顯示器以16進位顯示,第2個參數可控制小數點,如0x10表示顯示第5個小數點。
    SEG7_Decimal():將8個七段顯示器以10進位顯示,第2個參數可控制小數點,如0x10表示顯示第5個小數點。
    SEG7_Numer(): 將8個七段顯示器從左至右顯示76543210。

    SEG7.c / C

    1 #include "system.h"
    2 #include "alt_types.h"
    3 #include "io.h"
    4 #include "SEG7.h"
    5 
    6 #define SEG7_SET(index, seg_mask) IOWR(SEG7_BASE,index,seg_mask)
    7 #define SEG7_NUM 8
    8 
    9 static unsigned char szMap[] = {
    10   63, 6, 91, 79, 102, 109, 125, 7,
    11   127, 111, 119, 124, 57, 94, 121, 113
    12 };  // 0,1,2,.9, a, b, c, d, e, f
    13    
    14 void SEG7_Clear(void) {
    15   int i;
    16  
    17   for(i=0; i<SEG7_NUM; i++)
    18     SEG7_SET(i, 0x00);
    19 }
    20 
    21 void SEG7_Full(void) {
    22   int i;
    23  
    24   for(i=0; i<SEG7_NUM; i++)
    25     SEG7_SET(i, 0xFF);
    26 }
    27 
    28 void SEG7_Number(void) {
    29   int i;
    30 
    31   for(i=0;i<SEG7_NUM;i++)
    32     SEG7_SET(i, szMap[i]);
    33 }
    34 
    35 void SEG7_Hex(alt_u32 Data, alt_u8 point_mask) {
    36   alt_u8 mask = 0x01;
    37   alt_u8 seg_mask;
    38   int i;
    39    
    40   seg_mask = 0;
    41   for(i = 0; i < SEG7_NUM; i++) {
    42     seg_mask = szMap[Data & 0x0F];
    43     Data >>= 4;
    44 
    45     if (point_mask & mask)
    46       seg_mask |= 0x80;
    47      
    48     mask <<= 1;
    49     SEG7_SET(i, seg_mask);
    50   }
    51 }
    52 
    53 void SEG7_Decimal(alt_u32 Data, alt_u8 point_mask) {
    54   alt_u8 mask = 0x01;
    55   alt_u8 seg_mask;
    56   int i;
    57   seg_mask = 0;
    58  
    59   for(i = 0; i < SEG7_NUM; i++) {
    60     seg_mask = szMap[Data%10];
    61     Data /= 10;
    62    
    63     if (point_mask & mask)
    64       seg_mask |= 0x80;
    65      
    66     mask <<= 1;
    67     SEG7_SET(i, seg_mask);
    68   }
    69 }


    1行

    #include "system.h"
    #include
    "alt_types.h"
    #include
    "io.h"
    #include
    "SEG7.h"


    將原來的include改成如上所示。io.h定義了IOWR()。

    hello_world.c / C

    1 /* 
    2 (C) OOMusou 2008 http://oomusou.cnblogs.com
    3 
    4 Filename    : hello_world.c
    5 Compiler    : Nios II gcc
    6 Description : Demo how to display 7 seg. on DE2-70
    7 Release     : 10/20/2008 1.0
    8 */
    9 #include <stdio.h>
    10 #include "system.h"
    11 #include "unistd.h" // usleep()
    12 #include "SEG7.h"   // SEG7_Hex()
    13 
    14 int main() {
    15   int i;
    16   for(i = 0; i != 100; i++)  {
    17     usleep(1 * 1000 * 1000);
    18     SEG7_Hex(i, 0x10);
    19   }
    20 }


    使用SEG7_Hex()從1數到100。

    完整程式碼下載
    DE2_70_NIOS_10_seg7.7z

    Conclusion
    七段顯示器是大家常用的debug工具,無論是寫Verilog或是寫C,利用友晶提供的TERASIC_SEG7 ip,我們也可以在Nios II利用C控制七段顯示器。

    See Also
    (原創) 如何在Nios II顯示8位數的七段顯示器? (IC Design) (DE2) (Nios II)
    (原創) 哪裡有DE2-70的Nios II reference design可以參考? (SOC) (DE2-70) (Nios II) (SOPC Builder)

  • 相关阅读:
    VMWare 桥接模式
    什么是交叉编译,为什么要使用交叉编译
    最常用的四种大数据分析方法
    C#的Dispose模式复习
    Oracle Data Provider for .NET Support for Microsoft .NET Core
    微软发布了量子计算开发包
    关于Oracle分区表的理解
    html 中video标签视频不自动播放的问题
    input 修改placeholder颜色
    正则表达式 手机号验证、邮箱验证、6~16位数字加字母组合、身份证号码验证
  • 原文地址:https://www.cnblogs.com/twodog/p/12135349.html
Copyright © 2011-2022 走看看