Xilinx FPGA:vivado实现点阵屏点亮一个灯

一、工作原理

       8*8点阵内部由8行8列共64个LED灯组成。通过控制其中部分LED灯亮可以组成图形或者数字,和前面使用的数码管类似。点阵也分为共阳极(BS)和共阴极(AS),行控制线接的 LED 阳极的点阵称为共阳极点阵,行控制线接的ID阴极的点阵称为共阴极点阵。

行8个,列8个,所以只需要16个电平信号就可以控制点阵屏,需要点亮【R1,C1】那个灯的话,就需要[R1,R2,R3,R4,R5,R6,R7,R8]=[1,0,0,0,0,0,0,0],[C1,C2,C3,C4,C5,C6,C7,C8]=[0,1,1,1,1,1,1,1]

点阵屏的驱动芯片74HC596:

所以根据原理图,我们确定从数据的低位进行输出。

二、模块划分

三、程序设计

采用IP的方式生成5M的SCK,具体方法参照我之前的文章https://blog.csdn.net/loveyousosad/article/details/139745966?spm=1001.2014.3001.5501

SCK模块:

`timescale 1ns / 1ps
module PLL_clk_5M(
      input           sys_clk ,
      input           rst_n   ,
      output          SCK     ,     //74HC595时钟
      output          locked 
    );

      clk_5M instance_name
   (
    // Clock out ports
    .clk_5M(SCK),     // output clk_5M
    // Status and control signals
    .resetn(rst_n), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .sys_clk(sys_clk));      // input sys_clk
endmodule

74HC595模块:

`timescale 1ns / 1ps
module HC_595(
    input                   sys_clk     ,
    input                   rst_n       ,
    output                   SCK        , //SCK:点阵屏驱动时钟
    output   reg             RCK        ,  //数据锁存信号
    output   reg             DI           //数据
    );
  
     wire     locked     ;
     wire     en         ;
     
     reg    [3:0]   cnt_bit ;
     reg    [3:0]   cnt     ;
     reg    [15:0]  data_reg = 16'b0000_0001_0111_1111  ;
     
     
     assign    en = ( locked & rst_n )? 1:0 ;  //locked信号是SCK平稳运行的标志信号
     
     //cnt_bit
     always@(posedge SCK )
           if(!rst_n)
           cnt_bit <= 0 ;
           else if ( en == 1 )begin
                if( cnt_bit == 15 )
                    cnt_bit <= 0 ;
                else
                    cnt_bit <= cnt_bit +1 ;
           end
           else
           cnt_bit <= 0 ;
     
     /DI
     always@(negedge SCK )    //在时钟下降沿赋值,保证数据准确
           if(!rst_n)
              DI <= 0 ;
           else if( en == 1 )
              DI <= data_reg[cnt_bit]  ;
           else
              DI <= 0  ;
       
      /RCK信号在数据传输完成之后拉高3~5个时钟周期
      always@(posedge sys_clk)
            if(!rst_n)
            cnt <= 0 ;
            else if ( en == 1 )begin
                 if ( cnt_bit == 0 )begin
                     if ( cnt == 9 )
                        cnt <= 0 ;
                     else
                        cnt <= cnt +1 ; 
                 end
                 else
                 cnt <= 0;
            end
            else
            cnt <= 0;
            
     always@(posedge sys_clk)
           if(!rst_n)
             RCK <= 1'b0 ;
           else if(en==1)begin
                if(cnt_bit == 0 && cnt >=5 && cnt <=7)
                   RCK <= 1'b1 ;
                else
                   RCK <= 1'b0 ;
           end 
           else
                RCK <= 1'b0 ; 
         
PLL_clk_5M  PLL_clk_5M_u1(
     . sys_clk(sys_clk) ,
     . rst_n  (rst_n  ) ,
     .locked(locked)    ,
     . SCK (SCK )

    );
            
endmodule

管脚绑定:

set_property PACKAGE_PIN U15 [get_ports clk_5M]
set_property PACKAGE_PIN W15 [get_ports DI]
set_property PACKAGE_PIN U17 [get_ports RCK]
set_property PACKAGE_PIN M20 [get_ports req]
set_property PACKAGE_PIN Y18 [get_ports rst_n]
set_property PACKAGE_PIN K17 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk_5M]
set_property IOSTANDARD LVCMOS33 [get_ports RCK]
set_property IOSTANDARD LVCMOS33 [get_ports req]
set_property IOSTANDARD LVCMOS33 [get_ports DI]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]

四、仿真结果

五、实验结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值