查看: 1305|回复: 0

小脚丫STEP-MXO2 二代 试用(二)数码管驱动

[复制链接]
  • TA的每日心情

    2018-3-13 13:50
  • 签到天数: 299 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2016-9-19 08:48:40 | 显示全部楼层 |阅读模式
    分享到:
    在上一篇试用中,我编写了一个最简单的fpga程序,只是简单按键控制引脚。如果这一篇试用还是只是编写简单的功能就有点对不起小编给我提供的试用机会了,所以本文我要提高一下程序的复杂度(当然提高的有限,原谅我只是一个刚开始接触fpga的小白!)。
    在这一篇中,使用板载的数码管来实现一个秒表的功能(其实就是一个0~59的计数器,每秒加一),瞬间高大上了有没有!!!!
    话不多说先上原理图

    至于数码管的原理我就不讲解了网上一搜一大把!!!
    module seg(input wire clk,input wire key,output wire[8:0] SEG_ONE, //output, MSB~LSB = SPGFEDCBAoutput wire[8:0] SEG_TWO  //output, MSB~LSB = SPGFEDCBA);reg[24:0] cnt_clk;reg clk_1_hz_pulse;reg[3:0] the_unit_cnt;reg the_unit_pulse;reg[3:0] decade_cnt;reg[8:0] mem [15:0]; //Segment_led output, MSB~LSB = SPGFEDCBAinitial         begin                mem[0] = 9'h3f;   //  0                mem[1] = 9'h06;   //  1                mem[2] = 9'h5b;   //  2                mem[3] = 9'h4f;   //  3                mem[4] = 9'h66;   //  4                mem[5] = 9'h6d;   //  5                mem[6] = 9'h7d;   //  6                mem[7] = 9'h07;   //  7                mem[8] = 9'h7f;   //  8                mem[9] = 9'h6f;   //  9                mem[10]= 9'h77;   //  A                mem[11]= 9'h40;   //  b                mem[12]= 9'h39;   //  C                mem[13]= 9'h5e;   //  d                mem[14]= 9'h79;   //  E                mem[15]= 9'h71;   //  F        endalways@(posedge clk or negedge key)        begin                if(!key)                        begin                                cnt_clk <=0;                                clk_1_hz_pulse <= 0;                        end                else if(cnt_clk >= ((12000000 >> 1) - 1))                        begin                                cnt_clk <= 0;                                clk_1_hz_pulse <= ~clk_1_hz_pulse;                        end                else                        begin                                cnt_clk <= cnt_clk + 25'b1;                        end        endalways@(posedge clk_1_hz_pulse or negedge key)        begin                if(!key)                        begin                                the_unit_cnt <=0;                                the_unit_pulse <= 0;                        end                else if(the_unit_cnt < 9)                        begin                                the_unit_cnt <= the_unit_cnt + 4'b1;                                the_unit_pulse <= 0;                        end                else                        begin                                the_unit_cnt <= 0;                                the_unit_pulse <= 1;                        end        end        always@(posedge the_unit_pulse or negedge key)        begin                if(!key)                        begin                                decade_cnt <= 0;                        end                else if(decade_cnt < 5)                        begin                                decade_cnt <= decade_cnt + 1;                        end                else                        begin                                decade_cnt <= 0;                        end        endassign SEG_ONE = mem[decade_cnt];assign SEG_TWO = mem[the_unit_cnt];endmodule这次的代码比上一篇长了好多,好有成就感!!!
    照例来简单介绍一下代码的执行流程:
    1、首先是数码管的显示定义也就是17行~32行的代码,每一个寄存器代表一个数码管显示数字。小脚丫二代开发板板载的数码管是共阴极数码管,所以,当将引脚拉高就可以点亮数码管上相应的部分;
    2、接下来35行到51行代码实现的功能是一个1秒为单位的pwm脉冲。由于板子上是12MHz的晶振,说以我们每6000000个时钟周期产生一次io翻转;
    3、53行到70行是秒表的个位计数器,每一个clk_1_hz_pulse的上升沿都进行一次计数值加一;
    4、72行到86行是秒表的十位计数器,每一个the_unit_pulse的上升沿都进行计数值加一。
    其实实现起来还是很简单的。

    总结:
    很感谢小编给我提供这次试用的机会,说实话文章写的很菜,还请大家多多见谅。
    对于初学者来说小脚丫二代真的很适合,与一代相比它提供了丰富的外设,对于入门学习来说足够了,当然对于创客们来说它的体积和它的扩展性,也可以满足日常的开发需求,真是一款很棒的开发板!!!
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 14:34 , Processed in 0.110025 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.