FPGA--点阵屏模块(代码)

`timescale 1ns / 1ps



module dzp_mk(
    input       clk     ,
    input       rst_n   ,
    input [10:0]   cnt_number,   //显示的模式
    input  [2:0]    mode,   //流动方向
    input  [31:0]   speed,  //屏幕移动完所需要的时间
    
    output reg   DI      ,      //led状态 串行数据输入端口
    output reg   RCK      ,      //上升沿将数据放入LED
    output       SCK    //5M        50M->5M;    锁相环(PLL)     //时钟---当时钟一个上升沿时 点阵屏锁存器保存一位DI电平信息
    );
wire        locked          ;
wire            en          ;//点阵屏工作的开关
assign en = rst_n & locked;
reg [15:0]  data_reg ;
reg [3 :0]  cnt_bit;    //用以记录第几bit


//**********************************///
reg [7:0] data_hsm;
reg [7:0] data [7:0];


 
parameter delay_1ms = 50_000_000/1000;
reg [31:0]cnt_1ms ;
reg [3:0]   cnt_number_h;
always @(posedge clk )
if (!rst_n)
    cnt_1ms <= 0;
else if (cnt_1ms >= delay_1ms)
    cnt_1ms <= 0;
else 
    cnt_1ms <= cnt_1ms + 1;


always @(posedge clk )
if (!rst_n)
    cnt_number_h <=0;
else if(cnt_number_h >= 8)
    cnt_number_h <= 0;
else if (cnt_1ms == delay_1ms -1)
    cnt_number_h <= cnt_number_h + 1;
else
    cnt_number_h <= cnt_number_h ;

always @(posedge clk)
if(!rst_n)
    data_hsm <= 8'b0000_0001;
else if(cnt_1ms == delay_1ms -1)
    data_hsm <= {data_hsm[6:0],data_hsm[7]};
else
    data_hsm <= data_hsm;
    
always @(posedge clk )
if (!rst_n)
    data_reg <= 0;
else
    data_reg <= {data_hsm[7:0],data[cnt_number_h]};
        

//**********************************/


/产生驱动时钟  SCK   

clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(SCK),     // output clk_out1
    // Status and control signals
    .resetn(rst_n), // input resetn
    .locked(locked),    //标志输出时钟的稳定   // output locked
   // Clock in ports
    .clk_in1(clk));      // input clk_in1


//clock     == 时钟
//can_bit
always @(posedge SCK)
if(!rst_n)
    cnt_bit <= 0;
else if (en == 1 && cnt_bit >= 4'd15)
    cnt_bit <= 0;
else if (en == 1)
    cnt_bit <= cnt_bit + 1;
else
    cnt_bit <= 0;

//DI赋值
always @(negedge SCK)
if(!rst_n)
    DI<= 0;
else if (en)begin
    DI <= data_reg[cnt_bit];
    end
else
    DI <=0;
    
    
//*************************//
//RCK
reg [3:0]       cnt;    ///0-9
always@(posedge clk )
if(!rst_n )
    cnt <= 0;
else if(en == 1)begin
    if(cnt_bit == 0)
        if(cnt >= 9)    cnt<=0;
        else            cnt <= cnt +1;
     else
        cnt <= 0;
    end
else
    cnt <= 0;

//RXK=0  传数据
always @(posedge clk)
if (!rst_n)
    RCK<=1;
else if(en==1)begin
    if(cnt_bit == 0 && cnt >= 5 && cnt<=8)
        RCK<= 1;
    else
        RCK <= 0;    
    end
else
    RCK <= 1;


//**********************************************/


/***********数字库*******************
wire [7:0] number_1 [7:0];
assign number_1[0] = 8'hFF  ;
assign number_1[1] = 8'hEF  ;
assign number_1[2] = 8'hCF  ;
assign number_1[3] = 8'hEF  ;
assign number_1[4] = 8'hEF  ;
assign number_1[5] = 8'hEF  ;
assign number_1[6] = 8'hC7  ;
assign number_1[7] = 8'hFF  ;

wire [7:0] number_2 [7:0];
assign number_2[0] = 8'hFF   ;
assign number_2[1] = 8'hC7   ;
assign number_2[2] = 8'hF7   ;
assign number_2[3] = 8'hC7   ;
assign number_2[4] = 8'hDF   ;
assign number_2[5] = 8'hC7   ;
assign number_2[6] = 8'hFF   ;
assign number_2[7] = 8'hFF   ;


wire [7:0] number_3 [7:0];
assign number_3[0] = 8'hFF   ;
assign number_3[1] = 8'hC7   ;
assign number_3[2] = 8'hF7   ;
assign number_3[3] = 8'hC7   ;
assign number_3[4] = 8'hF7   ;
assign number_3[5] = 8'hC7   ;
assign number_3[6] = 8'hFF   ;
assign number_3[7] = 8'hFF   ;

wire [7:0] number_4 [7:0];
assign number_4[0] = 8'hFF   ;
assign number_4[1] = 8'hF7   ;
assign number_4[2] = 8'hE7   ;
assign number_4[3] = 8'hD7   ;
assign number_4[4] = 8'h81   ;
assign number_4[5] = 8'hF7   ;
assign number_4[6] = 8'hF7   ;
assign number_4[7] = 8'hFF   ;


wire [7:0] number_5 [7:0];
assign number_5[0] = 8'hFF   ;
assign number_5[1] = 8'hC7   ;
assign number_5[2] = 8'hDF   ;
assign number_5[3] = 8'hC7   ;
assign number_5[4] = 8'hF7   ;
assign number_5[5] = 8'hC7   ;
assign number_5[6] = 8'hFF   ;
assign number_5[7] = 8'hFF   ;


wire [7:0] number_6 [7:0];
assign number_6[0] = 8'hFF   ;
assign number_6[1] = 8'hC7   ;
assign number_6[2] = 8'hDF   ;
assign number_6[3] = 8'hC7   ;
assign number_6[4] = 8'hD7   ;
assign number_6[5] = 8'hC7   ;
assign number_6[6] = 8'hFF   ;
assign number_6[7] = 8'hFF   ;


wire [7:0] number_7 [7:0];
assign number_7[0] = 8'hFF   ;
assign number_7[1] = 8'hC7   ;
assign number_7[2] = 8'hF7   ;
assign number_7[3] = 8'hF7   ;
assign number_7[4] = 8'hF7   ;
assign number_7[5] = 8'hF7   ;
assign number_7[6] = 8'hFF   ;
assign number_7[7] = 8'hFF   ;



wire [7:0] number_8 [7:0];
assign number_8[0] = 8'hFF   ;
assign number_8[1] = 8'hC7   ;
assign number_8[2] = 8'hD7   ;
assign number_8[3] = 8'hC7   ;
assign number_8[4] = 8'hD7   ;
assign number_8[5] = 8'hC7   ;
assign number_8[6] = 8'hFF   ;
assign number_8[7] = 8'hFF   ;



wire [7:0] number_9 [7:0];
assign number_9[0] = 8'hFF   ;
assign number_9[1] = 8'hC7   ;
assign number_9[2] = 8'hD7   ;
assign number_9[3] = 8'hC7   ;
assign number_9[4] = 8'hF7   ;
assign number_9[5] = 8'hC7   ;
assign number_9[6] = 8'hFF   ;
assign number_9[7] = 8'hFF   ;


wire [7:0] number_0 [7:0];
assign number_0[0] = 8'hFF   ;
assign number_0[1] = 8'hC7   ;
assign number_0[2] = 8'hD7   ;
assign number_0[3] = 8'hD7   ;
assign number_0[4] = 8'hD7   ;
assign number_0[5] = 8'hC7   ;
assign number_0[6] = 8'hFF   ;
assign number_0[7] = 8'hFF   ;

//10        SDK
wire [63:0] pattern_1I = 64'hEF_C7_D7_01_D7_C7_EF_EF;
wire [7:0] pattern_1 [7:0];
assign pattern_1[7] = pattern_1I[7:0]   ;
assign pattern_1[6] = pattern_1I[15:8]   ;
assign pattern_1[5] = pattern_1I[23:16]   ;
assign pattern_1[4] = pattern_1I[31:24]   ;
assign pattern_1[3] = pattern_1I[39:32]   ;
assign pattern_1[2] = pattern_1I[47:40]   ;
assign pattern_1[1] = pattern_1I[55:48]   ;
assign pattern_1[0] = pattern_1I[63:56]   ;


wire [63:0] pattern_2I = 64'hFF_99_00_00_81_C3_E7_FF;
wire [7:0] pattern_2 [7:0];
assign pattern_2[7] = pattern_2I[7:0]   ;
assign pattern_2[6] = pattern_2I[15:8]   ;
assign pattern_2[5] = pattern_2I[23:16]   ;
assign pattern_2[4] = pattern_2I[31:24]   ;
assign pattern_2[3] = pattern_2I[39:32]   ;
assign pattern_2[2] = pattern_2I[47:40]   ;
assign pattern_2[1] = pattern_2I[55:48]   ;
assign pattern_2[0] = pattern_2I[63:56]   ;



//**********************************************/



//速度显示
reg [31:0] speed_cnt ;
wire [31:0] speed_delay = speed/8;

//数据切换
always @(posedge clk)
if(!rst_n)
    speed_cnt<=0;
else if(speed_cnt >= speed_delay)
    speed_cnt <= 0;
else
    speed_cnt <= speed_cnt + 1;


parameter left = 1; //左移
parameter right = 2;//右移
parameter up    = 3;//上移
parameter decline = 4;//下移
parameter stop = 0;   //不移动

reg [31:0] zq_cnt_number;
reg zt;
always @(posedge clk)
if(!rst_n)begin
    zq_cnt_number <= 0;
    zt <= 0;
end
else if(zq_cnt_number != cnt_number)begin
    zq_cnt_number <= cnt_number;
    zt <= 1;
end
else    begin
    zt <= 0;
    zq_cnt_number <= zq_cnt_number;
end
    


always @(posedge clk)
if(!rst_n)begin
    data[0] <= 0;
    data[1] <= 0;
    data[2] <= 0;
    data[3] <= 0;
    data[4] <= 0;
    data[5] <= 0;
    data[6] <= 0;
    data[7] <= 0;   
    end
else if(speed_cnt == speed_delay - 1)begin
        case(mode)
            stop:begin
                data[0] <= data[0];
                data[1] <= data[1];
                data[2] <= data[2];
                data[3] <= data[3];
                data[4] <= data[4];
                data[5] <= data[5];
                data[6] <= data[6];
                data[7] <= data[7];   
                end
            left     :begin
                data[0] <= {data[0][6:0],data[0][7]};
                data[1] <= {data[1][6:0],data[1][7]};
                data[2] <= {data[2][6:0],data[2][7]};
                data[3] <= {data[3][6:0],data[3][7]};
                data[4] <= {data[4][6:0],data[4][7]};
                data[5] <= {data[5][6:0],data[5][7]};
                data[6] <= {data[6][6:0],data[6][7]};
                data[7] <= {data[7][6:0],data[7][7]};   
                end
            right    :begin
                data[0] <= {data[0][0],data[0][7:1]};
                data[1] <= {data[1][0],data[1][7:1]};
                data[2] <= {data[2][0],data[2][7:1]};
                data[3] <= {data[3][0],data[3][7:1]};
                data[4] <= {data[4][0],data[4][7:1]};
                data[5] <= {data[5][0],data[5][7:1]};
                data[6] <= {data[6][0],data[6][7:1]};
                data[7] <= {data[7][0],data[7][7:1]};   
                end
            up       :begin
                data[0] <= data[1];
                data[1] <= data[2];
                data[2] <= data[3];
                data[3] <= data[4];
                data[4] <= data[5];
                data[5] <= data[6];
                data[6] <= data[7];
                data[7] <= data[0];   
                end
            decline  :begin
                data[0] <= data[7];
                data[1] <= data[0];
                data[2] <= data[1];
                data[3] <= data[2];
                data[4] <= data[3];
                data[5] <= data[4];
                data[6] <= data[5];
                data[7] <= data[6];   
                end
            
            default:begin
                data[0] <= data[0];
                data[1] <= data[1];
                data[2] <= data[2];
                data[3] <= data[3];
                data[4] <= data[4];
                data[5] <= data[5];
                data[6] <= data[6];
                data[7] <= data[7];   
                end
        endcase
    end
else if(zt == 1)    //图案发生变化
    case(cnt_number)
    1:begin
    data[0] <= number_1[0];
    data[1] <= number_1[1];
    data[2] <= number_1[2];
    data[3] <= number_1[3];
    data[4] <= number_1[4];
    data[5] <= number_1[5];
    data[6] <= number_1[6];
    data[7] <= number_1[7];   
    end
    2:begin
    data[0] <= number_2[0];
    data[1] <= number_2[1];
    data[2] <= number_2[2];
    data[3] <= number_2[3];
    data[4] <= number_2[4];
    data[5] <= number_2[5];
    data[6] <= number_2[6];
    data[7] <= number_2[7];   
    end
    3:begin
    data[0] <= number_3[0];
    data[1] <= number_3[1];
    data[2] <= number_3[2];
    data[3] <= number_3[3];
    data[4] <= number_3[4];
    data[5] <= number_3[5];
    data[6] <= number_3[6];
    data[7] <= number_3[7];   
    end
    4:begin
    data[0] <= number_4[0];
    data[1] <= number_4[1];
    data[2] <= number_4[2];
    data[3] <= number_4[3];
    data[4] <= number_4[4];
    data[5] <= number_4[5];
    data[6] <= number_4[6];
    data[7] <= number_4[7];   
    end
    5:begin
    data[0] <= number_5[0];
    data[1] <= number_5[1];
    data[2] <= number_5[2];
    data[3] <= number_5[3];
    data[4] <= number_5[4];
    data[5] <= number_5[5];
    data[6] <= number_5[6];
    data[7] <= number_5[7];   
    end
    6:begin
    data[0] <= number_6[0];
    data[1] <= number_6[1];
    data[2] <= number_6[2];
    data[3] <= number_6[3];
    data[4] <= number_6[4];
    data[5] <= number_6[5];
    data[6] <= number_6[6];
    data[7] <= number_6[7];   
    end
    7:begin
    data[0] <= number_7[0];
    data[1] <= number_7[1];
    data[2] <= number_7[2];
    data[3] <= number_7[3];
    data[4] <= number_7[4];
    data[5] <= number_7[5];
    data[6] <= number_7[6];
    data[7] <= number_7[7];   
    end
    8:begin
    data[0] <= number_8[0];
    data[1] <= number_8[1];
    data[2] <= number_8[2];
    data[3] <= number_8[3];
    data[4] <= number_8[4];
    data[5] <= number_8[5];
    data[6] <= number_8[6];
    data[7] <= number_8[7];   
    end
    9:begin
    data[0] <= number_9[0];
    data[1] <= number_9[1];
    data[2] <= number_9[2];
    data[3] <= number_9[3];
    data[4] <= number_9[4];
    data[5] <= number_9[5];
    data[6] <= number_9[6];
    data[7] <= number_9[7];   
    end
    0:begin
    data[0] <= number_0[0];
    data[1] <= number_0[1];
    data[2] <= number_0[2];
    data[3] <= number_0[3];
    data[4] <= number_0[4];
    data[5] <= number_0[5];
    data[6] <= number_0[6];
    data[7] <= number_0[7];  
    end 
    10: begin
    data[0] <=pattern_1[0] ;
    data[1] <=pattern_1[1] ;
    data[2] <=pattern_1[2] ;
    data[3] <=pattern_1[3] ;
    data[4] <=pattern_1[4] ;
    data[5] <=pattern_1[5] ;
    data[6] <=pattern_1[6] ;
    data[7] <=pattern_1[7] ; 
    end
    
    11: begin
    data[0] <=pattern_2[0] ;
    data[1] <=pattern_2[1] ;
    data[2] <=pattern_2[2] ;
    data[3] <=pattern_2[3] ;
    data[4] <=pattern_2[4] ;
    data[5] <=pattern_2[5] ;
    data[6] <=pattern_2[6] ;
    data[7] <=pattern_2[7] ; 
    end
    default:begin
    data[0] <= data[0];
    data[1] <= data[1];
    data[2] <= data[2];
    data[3] <= data[3];
    data[4] <= data[4];
    data[5] <= data[5];
    data[6] <= data[6];
    data[7] <= data[7];   
    end
    endcase
else begin
    data[0] <= data[0];
    data[1] <= data[1];
    data[2] <= data[2];
    data[3] <= data[3];
    data[4] <= data[4];
    data[5] <= data[5];
    data[6] <= data[6];
    data[7] <= data[7];   
    end

endmodule

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0X78

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值