我的课程设计学习——动态LED动态显示屏设计

我的课程设计学习——动态LED动态显示屏设计

最近在做课程设计,选题为动态LED动态显示屏设计,要求使用logisim平台实现
一开始本来啥都不会的,可是咱不会可以学呀,年轻最不缺的就是学习能力
写这篇文章算是对自己学习的记录,后续的同学如果遇到相同的问题,也可以参考学习
加油加油!


要求:

  •     (1)汉字编码、汉字字库
  •     (2)图像的动态显示
  •     (3)显示方式包括左移、右移、上移、下移和频率控制
  •     (4)采用仿真软件设计和调试完成

文章目录

    我的课程设计学习——动态LED动态显示屏设计
        一、1小时学习logisim
        二、构建一个最简单的数字电路
            输入输出引脚
            最简单的逻辑电路
            在其他电路中使用子电路
            使用颜色来表示电路的状态
            自动生成组合逻辑电路
        三、汉字编码实验
            1.实验目的:
            2.汉字表示法
            3.实验任务:
                3.1 实验原理:
                3.2 子电路及实验步骤
                    `国标转区位码字电路`
                    `汉字存储子电路`
                3.3 开始做实验
                    第一步,国标码转区位码
                    第二步,使用在线工具获取汉字的机内码传入GB2312ROM存储器中
        四、汉字字库显示
            1、什么是汉字字库
            2、汉字字库子电路
            3、字库显示原理
        五、汉字动态移动(左右,上下)
        六、几个疑惑的问题
            1、国标码转区位码子电路的原理
            2、国标码,区位码,机内码三者如何转换
                首先记住几个公式
                步骤
                举个例子
                那这个过程大概是怎样的呢?(非常重要)
        七、文章迭代说明
        八、参考文献
            相关参考博客和PPt
            相关Mooc课程和配套学习资料
            进制转换及三码相关知识
            相关工具
        吐槽一下下

一、1小时学习logisim

组件库

wiring(线路库)
在线路库里有一些常用的组件,比如分离器,引脚,探测器,隧道,上下拉电阻,时钟等。
Gates(逻辑门库)
Plexers(复用器)
Arithmetic(运算器)
Memory(存储器)
Input/Output(输入输出器)


二、构建一个最简单的数字电路

logisim采用原理图的方式来构建电路,每个子电路都是一个模块,都包括输入信号,输出信号(通过引脚来实现的)

输入引脚通常是方角,输出引脚是圆角

当连接完成后,输出引脚就会变成输入引脚的值

点击输入引脚,可以修改输入引脚的值,从而改变输出引脚的值

点击芯片封装
朝向向左的,会放在芯片的左侧,朝向向右的,会放在芯片的右侧,朝向向下上的引脚,会放在芯片的底部

在logisim中,每一个电路都可以进行封装,而在其他的电路中作为公共模块进行调用,输入输出引脚就是我们调用的接口,类似于c语言中函数调用的参数
这是logisim中非常重要的特性,所有的电路都可以作为子电路来进行封装,在其他的电路中进行调用。从而构建复杂的电路系统,甚至是CPU


输入输出引脚

输入引脚和输出引脚其实都是引脚,只不过输出的属性不一样,可以

  •     更改朝向
  •     更改是否输出
  •     更改数据的位宽(1-32位,快捷键alt+数字)
  •     更改是否三态(0,1,x高阻态)
  •     未定义处理(不变,上拉,下拉) 指的就是在没有连接或高阻态的情况下电路如何处理引脚的值,可以选择三种状态(保持原状,上拉成1,下拉成0)
  •     添加自定义标签

最简单的逻辑电路

采用数据选择器来进行或非门的选择
数据选择器有一个使能端和一个选择端,两个输入引脚,和一个输出引脚
使能端可以不接,可以自己在属性选择中去掉使能端

当选择端为0时为与门

当选择端为1是为或门

可以整体修改数据的宽度,例如将数据位宽改为4位


在其他电路中使用子电路

将子电路的封装进行排版,然后新建测试电路,用鼠标拖动子电路到测试电路,即可使用子电路的封装形式

子电路封装

测试电路使用子电路
可以看出和之前的子电路的效果相同


使用颜色来表示电路的状态

亮绿色表示高电平
深绿色表示低电平
蓝色表示高阻态或者悬浮态(未知状态) 电路中应该尽量消除这种状态,电路的引脚没有连接也有可能会产生高阻态
灰色表示飞线 表示两端并没有连接,通常使用灰线表示边框
红色表示信号冲突或者引脚类型不对

不兼容的位宽
黑色表示多位总线
橙色表示位宽不匹配


自动生成组合逻辑电路

logisim可以根据真值表或者表达式自动生成电路

但是只能生成组合逻辑,并且输入引脚只能是一位的引脚
输入引脚的个数最多只能有八个,输出引脚最多只能有12个

生成一位全加器的电路

选择project菜单栏里的分析电路

然后选择输入和输出引脚

使用真值表构建电路
真值表只适合引脚数目较少来构件电路
故采用表达式来进行构建

使用表达式来构建电路

构建电路

仅使用两个输入的逻辑门

采用最小项为和之积范式或积之和范式


三、汉字编码实验


1.实验目的:

    1、理解汉字机内码
    通过工具批量获取一段文字的机内码
   2、 理解汉字区位码
    利用简单电路实现汉字机内码和区位码的转换
   3、 理解汉字字型码
    在实验环境中实现汉字机内码的点阵显示

2.汉字表示法

    1、机内码:计算机内存储字符时使用的编码


    英文字符采用ASCII码标准,只需要七个字节数即可表示对应的字符,通常采用单字节(8位)存储,MSB(最高有效位为0)
    汉字字符采用GB2312标准,采用了双字节(16位)字节表示,有效位为14位,两个最高有效位(MSB)都为1,最多可以表示2^14个汉字
    2、区位码:采用四位十进制来表示汉字的一种方法,通常用于汉字的检索,配合GB2312标准一起使用
    通常将汉字放入一个94*94的矩阵当中,每一个行列坐标对应一个汉字

区号7位,位号也是7位,所以区位码是14位

    行号对应区号,列号对应位号,编号从1开始,最大值为94   

    区位码和机内码之间的转换: GB2312 汉字机内码 = 区位码 + 0xA0A0

    3、字形码:输出汉字点阵的信息编码

比如显示一个汉字,汉字的显示是采用像素点的方式,输出汉字对应的图形

  •     汉字字形码点阵信息量大,所占的存储空间大,一般情况下字形码用来做输出
  •     用来构成汉字字库,不能用于机内存储

通常汉字的字形码用来构建汉字的字库文件


3.实验任务:

3.1 实验原理:

把这个弄明白后面就好做了

  •     计数器连接时钟,计数器累加技术,每来一个时钟计数加1
  •    计数器的值直接连接到了GB2312的地址端,每一个时钟都会从存储器中取出一个16位的机内码
  •     对应的机内码传入国标转区位码,这时16位的机内码就转化为14位的区位码(7位的区号和7位的位号)
  •     14位的区位码传入字库电路,通过区位码检索字库电路中预先存储的字形码,并将汉字对应的1024位信息输出到32_32位的矩阵,从而显示汉字的内容 这时就是32_32位的字形码

重点:

    为了显示班级,姓名,学号和一段自选文字,需要将这些汉字转换为GB2312机内码
    获取到的机内码,存入GB2312的ROM存储器中

3.2 子电路及实验步骤


国标转区位码字电路

    1、输入输出引脚区

GB2312机内码的输入引脚16位,输出为两个7位的引脚,分别是区号和位号

    2、探测区

GB2312的十六进制信息,区号和位号的十进制信息

    3、转换的目的就是

将16位的GB2312码转换为7位的区号和7位的位号


汉字存储子电路

在此子电路中修改GB2312ROM存储器的内容,将获取到汉字的机内码存储存储器中

   1、 将汉字转为机内码存入GB2312存储器中,利用Windows记事本输入一段汉字,另存为数据文件,在编码选项框中选择ANSI编码,将对应的文字存储为GB2312标准的机内码。
   2、 这样就得到了GB2312标准的机内码,使用工具(文本编辑器或编程)即可获取机内码
    3、将获得的一批汉字机内码批量的存入GB2312ROM存储器中
    4、设置时钟频率为8HZ,驱动时钟,汉字即可实现

3.3 开始做实验

使用logisim打开data.circ,进入子电路


第一步,国标码转区位码

由前面的学习,可以知道

    GB2312 汉字机内码 = 区位码 + 0xA0A0H

所以

    区位码 = GB2312汉字机内码 - 0xA0A0H

而实验又要求采用加法器进行实现,并且输出区号和位号,采用补码的形式进行加法器实现

    区位码 = GB2312汉字机内码 +(- 0xA0A0H)的补码

**而-0xA0A0H的补码为5F60H,两个字节的最高位+1,即等于0xDFE0 **
这里两个字节的最高位为什么加1呢?因为这是为了将国标码转换为机内码,存入GB2312存储器的就是机内码,而不是国标码,在后续的电路中转换成了国标码,从而转换成区位码


这里有点绕,可能会不好理解,请移步下文第六大点,有详细说明过程
所以

    区位码 = 国标码 - 2020H
    区位码 = 国标码 + 0xDFE0

添加一个DFE0常量,转为区位码


第二步,使用在线工具获取汉字的机内码传入GB2312ROM存储器中

    1、利用在线工具查询汉字的机内码

    2、将获取到的机内码传入GB2312ROM存储器中


   3、 查看汉字显示电路,准备开始仿真

    4、设置时钟频率,使能时钟,计数器开始运行,LED显示屏开始显示

    显示效果


四、汉字字库显示


1、什么是汉字字库

    利用区号和位号进行检索的字形码存储器

2、汉字字库子电路


区位码转逻辑电路

    (区号-1)*94 + 位号-1

电路的输入和输出

    输入: 区号(7位) 位号(7位)
    输出:((区号-1)*94 + 位号)-1
    输出的是1024位点阵信息

3、字库显示原理

一个汉字的字形码需要32*32 = 1024位 ,而在logisim中ROM存储器最多为32位,所以应该进行位扩展 ,需要32片 16k X 32位的ROM

这样就达到了1024位的效果,将区号和位号进行传入,即可
输出1024位点阵信息,汉字即可显示



五、汉字动态移动(左右,上下)
六、几个疑惑的问题


1、国标码转区位码子电路的原理

    国标码 = 区位码 + 2020H

所以

    区位码 = 国标码 - 2020H

而要求使用加法器实现
所以源码的减法采用补码的加法实现,-2020H的补码就是DEF0H

    区位码 = 国标码 + DFE0H

2、国标码,区位码,机内码三者如何转换

在查看了一些文章和资料后,还是有点懵,经过几次理解后,终于弄明白了


首先记住几个公式

    国标码 = 区位码 + 2020H
    机内码 = 国标码 + 8080H
    GB2312 机内码 = 区位码 + A0A0H

步骤

根据以下步骤进行

    1、将区位码转换为十六进制表示
    2、将区位码 + 2020H 转换为国标码
    3、将得到的国标码 + 8080H 转换为机内码

举个例子

    汉字一的区位码为5027(十进制)
    说明区号为50,位号为27

       1、 转换为16进制表示 ,就是 321b
        2、321bH + 2020H = 523B 国标码
        3、523B + 8080H = D2BB 机内码

而这个GB2312机内码就是我们需要的到的数据
我们设计的GB2312机内码就得出来了,即直接向GB2312ROM存储器中存入D2BB,驱动时钟,显示汉字一


那这个过程大概是怎样的呢?(非常重要)

存入存储器中的D2BB机内码,存储汉字的机内码在前文说过,是16位双字节的,14位有效字节,所以拿之前的一字来举例,它的机内码为D2BB,14位字节有效,两个最高有效位为1

而我们只需要看数据有效字节就可以了,即14位有效字节,把D2BB-8080H得出523B,即是国标码,通过国标码转区位码电路转换成区位码321B,区号为32(16进制),位号为1B(16进制)

懂了吧,应该很浅显易懂,hhhhh,就这些原理,花了两个半小时才弄懂

原文作者:藕粉-