热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Big5中文字输出

目的把想要輸出的字型,寫到一個File裡面,再利用讀檔的方式,透過倚天字碼查表,然後轉換成一連串的101010101,設計成一個testbench使第二組能夠接受Step1:輸入測資(中文字)Ste

目的 
把想要輸出的字型,寫到一個File裡面,再利用讀檔的方式,透過倚天字碼查表,然後轉換成一連串的101010101,設計成一個testbench使第二組能夠接受
Step1:輸入測資(中文字)
Step2:讀出輸入字的內碼(Big 5)
Step3:以內碼尋找該字在stdfont.15內的位置
Step4:將stdfont.15裡的資料取出成為bitmap 
Step5:將bitmap轉成vwf檔(讓Quartus II能夠讀取)
Step6:寫一個testbench(VHDL)讀取bitmap轉出來的vwf檔 
    以”永”字為例 
先在input檔案內輸入”永”,然後用指令” trans_big5 out.vwf ”讓輸入檔案導入C code執行檔中然後將結果導出至vwf檔
然後下圖為取出之bitmap:

 以下為導出的out.vwf檔


如何找出Big 5 code? 

4種方法:
1.code中使用現成轉Big  5 的程式
2.
自己從input的中文字找出該字的Big  5
3.
直接在程式中建立一個Big  5 的資料庫
4.
由輸入字的value計算出Big  5 (the chosen way)
Code

in = (word[0] <<8) + ( word[1] & 0xFF );

in = in & 0xFFFF;          //word = 輸入(中文字)in = Big  5

 

Make Bitmap
stdfont.15中存有大部分Big 5碼中文字的bitmap
Step1:以Big 5碼找出中文字的序列碼
    HI = in/256; // HI = 高位碼
    LO = in%256; // LO = 低位碼
    if(LO >= 161)
        SerCode = (HI - 161) * 157 + (LO - 161) + 1 + 63
    else
        SerCode = (HI - 161) * 157 + (LO - 64) + 1
Step2:以序列碼找出該字在stdfont.15中的檔案位置位移量(Offset)
Step3:該字的bitmap即存在stdfont.15中的第Offset個byte開始的30 bites。
    Code:
    if(Ser >= 472 && Ser <= 5872)
            Offset = (Ser-472)*30; //常用字
    else if(Ser >= 6281 && Ser <= 13973)
            Offset = (Ser-6281)*30+162030; //非常用字
    else
            Offset=-1000000; //該字的bitmap沒有出現在stdfont.15中

以”一”為例:
“一”的Big 5碼為0xA440
HI = 0xA4 = 164, LO = 0x40 = 64
LO <161
SerCode = (HI - 161) * 157 + (LO - 64) + 1 = 472
SerCode >= 472 && SerCode <= 5872
OffSet = (SerCode - 472) * 30 = 0
“一”的bitmap就存在stdfount.15的第0 ~ 29byte中

Transfor Bitmap
將取出來的bitmap改成以1 bit為單位的儲存格式(否則Quartus II無法讀取)
Code:
for(i = 0;i<15;++i){
        for(j = 0;j<2;++j){                

                Wait_to_trans[i][(8*j)+0] = ( bmap[i][j] >> 7 ) & 1 ;        

                Wait_to_trans[i][(8*j)+1] = ( bmap[i][j] >> 6 ) & 1 ;                     

                Wait_to_trans[i][(8*j)+2] = ( bmap[i][j] >> 5 ) & 1 ;        

                Wait_to_trans[i][(8*j)+3] = ( bmap[i][j] >> 4 ) & 1 ;                        

                Wait_to_trans[i][(8*j)+4] = ( bmap[i][j] >> 3 ) & 1 ;        

                Wait_to_trans[i][(8*j)+5] = ( bmap[i][j] >> 2 ) & 1 ;                         

                Wait_to_trans[i][(8*j)+6] = ( bmap[i][j] >> 1 ) & 1 ;        

                Wait_to_trans[i][(8*j)+7] = bmap[i][j] & 1 ;
        }
}    // bmap = 原來的bitmap  Wait_to_trans = 轉換後的bitmap

Make Testbench
有兩種方法:
1.用VHDL讀出前面轉出來的bitmap
2.使用C code印出VHDL的testbench(the chosen way)
    Code:
    printf(“……………”);
    while((c = fgetc(fptr)) != EOF){
         if(c == '0'){
            printf("        LEVEL 0 FOR 4000000.0;\n");
            i=i+4 ;
            k++ ;
         }
         else if(c == '1'){
            printf("        LEVEL 1 FOR 4000000.0;\n");
            i=i+4 ;
            k++ ;
         }
      }
    printf(“……………”);

輸入/輸出格式: 
input           :       in              std_logic ;
inclk           :       in              std_logic ;
inset           :       in              std_logic ;
output          :       out             std_logic_vector( 0 to 14 ) ;
clk_48MHz      :       in              std_logic );

輸入資料格式: 
每筆輸入的資料包含:速度(2 bits)、反白(1 bit)、閃爍(1 bit)與8個15*16 dots的陣列,合計1924 bits。
        速度的表示方式為:
00最快(1秒跳2次) 
01中快(1秒1次)
10中慢(1.5秒1次)
11最慢(2秒1次)
反白bit設成0代表不反白正常, 設成1代表全部反白。
閃爍bit設成0代表不閃爍, 設成1時移動字的時候會有閃爍特效。

啟動/資料輸入方式: 
        Inset在資料輸入的過程中設定為1,輸入完成後設定為0,並開始平移字幕。
        Input即為輸入的資料,每當inclk跳成1的時候接收1個bit的資料。

輸出方式與頻率: 
        每次送出15個bits(即為一直行的dots)。頻率為每秒送出8個字,即為每秒共送出 16 * 8 * 30 = 3840次資料,每次15 bits。

Difficulty: 
為了能夠調整速度就需要設定一個shiftclk。但是若input也設定一個clock,就需要有兩個clocks,則buffer會有multiple drive的問題。

Solution:
讓buffer只聽一個clock的指令,不過這個clock在inset = 0和1時分別為的shiftclk 與inclk訊號:
process ( inset , mixclk , inclk , shiftclk )
begin
        if ( inset = '1' ) then
                mixclk <= inclk;
        else
                mixclk <= shiftclk;
        end if;
end process;
如此一來buffer只要mixclk的訊號即可。

Difficulty:閃爍 
要達成閃爍的效果,必須要將顯示的文字與位置記錄下來,並且和空白畫面交互顯示。因此,必須每次更動顯示的文字,在執行上有相當程度的困難。

Solution: 
        另設一twinkleclk_count,配合shiftclk來控制twinkleclk:
        process
        begin
        wait until ( shiftclk'event and shiftclk = '1' );
                if ( twinkleclk_count <"01" ) then
                        twinkleclk_count <= twinkleclk_count + 1;
                else
                        twinkleclk_count <= "00";
                        twinkleclk <= not twinkleclk;
                end if;
        end process;
        並將allzero和outputbuffer交互顯示:
        -- empty
        if ( twinkleclk = '0' ) then
                output <= allzero;
        -- show
        else
                output <= outputbuffer;
        end if;



http://www.solutioninside.com/~jackiekan/2007/Project/LED_Board/Home.html

 


推荐阅读
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
author-avatar
不言不语都可以温柔_631
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有