• Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)


    1.同步动态扫描

        多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作。

    2.数码管驱动电路实现思路

         

        如果要求数码管显示我们想要的数字,首先需要写一个数据接收模块,这个模块接收数据之后需要做什么样的处理呢?这时候我们会想到两个数码管,其中一个显示十位数字,另一个显示各位数字,即把这个数据的十位传给其中一个数码管,各位数字传给另一个数码管来显示。这样我们就会明确了:数据接收模块需要将接收的数据进行拆分,分别输出其十位数据与个位上的数据

        程序风格:

        1.always块语句中,总是先写出复位信号到来时候的情况,即输出全部置零。

        2.always块语句中的变量都是reg型,因此在写always块语句前需要事先定义好,定义好reg型变量的位宽与名字。

      3.尽管always块语句里面是对输出量的处理,但reg型的变量名最好不用输出量的名字,应先用其它的变量名代替,最后通过assign语句传递给输出量。(以后的工作中需要弄清楚为什么是这种编码风格)。

        注意:

        1.给变量赋值时,应带上数据的位宽与进制,总之,在编码的过程中,时刻注意变量的位宽与进制。多敲代码,养成良好的编码习惯。

        2.写条件语句时,注意里面的代码,通常是以begin开头,end结尾,很重要,即使逻辑正确,少了这些,都无法通过编译。

     

         当我们获得输入数据的十位与个位信号后,我们并不能直接传输给数码管,让其显示。当然八段数码管的显示方式并不陌生,因此十位与个位信号需要经过一个翻译的过程,把这两个信号翻译成数码管能识别的代码,这是一个加码的过程。

      

        以上为八段数码管的显示编码,在程序中以参数的形式给出,方便以后调用。其中,当复位信号到来时,给输出信号赋值为“8’b1111_1111”此时八段数码管处于熄灭状态。

     注意:似乎有大量参数的程序,都会用到case/endcase程序段,类似一个查表的过程,当case(输入量),在以下的代码中找到相匹配的输入量后,执行对应的语句(对输出量进行操作,赋值等)。

     

        在我们获得了数码管的显示代码后,为什么不直接传给数码管呢,直接显示应该没问题呀,但为什么需要加一个行扫描模块与列扫描模块,希望有看到这篇博客的人能告诉为原因。

        先说说列扫描,扫描频率制定为50Hz,即周期为0.02s,即从左至右,把两个灯扫一遍需要20ms,分配给两个灯,一个灯亮10ms,即每隔10ms换一个数码管使能。列扫描的工作机制如下:无需额外的输入,内部需要计数器,产生10ms的时间,然后通过内部逻辑控制数码管的使能。输出的列扫描信号即为数码管的片选信号,在实际的引脚分配中要注意。

         以下为计数器的典型写法。

         写完计数器之后,就应该写对输出语句的操作了。结合两个always块语句来看,前一个always块语句里面的变量t用在了下一个always块语句里面的case里面。

         这其中涉及到一个状态机的编码技巧(哈哈,前几天看视频才弄明白的)。

         分析:

                输出信号有两种状态0rColumn_Scan <= 2’b10; 个位数码管使能

                                          1: rColumn_Scan <= 2b01;十位数码管使能

                前一个always块语句专门用来控制状态变量t的跳变,即在什么条件下由一个状态跳变到另外一个状态中呢?绘制如下状态图:

        状态机与相应的操作分开写,会让程序更加清晰。

        最后是行扫描模块,数码管的十位与个位显示代码是传给行扫描模块的,最后模块输出一个行扫描信号。行扫描模块的工作机制如下:

      因为行扫描与列扫描是同步进行的,因此也需要一个10ms的计数器,假设初始时间是0,过了10ms后,十位的数码管被使能,这时候,行扫描模块应该把十位上的数据传给十位数码管,再过10ms,个位的数码管被使能,这时候,行扫描模块应该把个位上的数据传给个位数码管。这其中也有一个状态的跳变过程,需要写状态机。

        至此,数码管驱动电路各个模块已经完成,最后只需要通过一个顶层文件用wire将各个模块连接起来。

  • 相关阅读:
    【dp】船
    【dp】PKU 1952 buy low,buy lower
    【dp】合唱队形
    【dp】导弹拦截
    【dfs】POJ1321 棋盘问题
    工程师工作与学习的模式
    如何进行大规模在线数据迁移(来自Stripe公司的经验)
    Laravel事件监听器listener与事件订阅者Subscriber的区别
    微信小程序时间处理问题
    [翻译] Facebook HHVM 团队封闭开发三周成果展
  • 原文地址:https://www.cnblogs.com/chensimin1990/p/5768545.html
Copyright © 2020-2023  润新知