⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.v

📁 用VERILOG语言写的RS485通信程序,经调试可以直接使用
💻 V
字号:
////////////////////////////////////////////////////////////////////////
//Company      : 伟杰电子                                             //                  
//Web address  : http://www.weijay.com                                //
//Engineer     : Jaylee                                               //
//QQ           : 54304441                                             //
//Email        : jay_lee2008@163.com                                  //
//实验名称     :CH451控制数码管显示实验                              //
//功能实现     :以固定时钟周期让8个LED从0~9循环显示                  //
////////////////////////////////////////////////////////////////////////                                                     
//--------------------------system clk 50MHz-------------------------///
`timescale 1ns/1ns
`define CH451_RESET     12'h201 //cmd_rst
`define CH451_SYSON1    12'h401 //cmd_open_display
//`define CH451_SYSON2    12'h403 //cmd_open_display_scan
`define CH451_DSP       12'h500 //cmd_set_default_decode_mode
`define CH451_BCD       12'h580 //cmd_set_BCD_decode_mode
//`define CH451_KEY       12'h700 //cmd_read_keyvalue
module DISPLAY (
                clk,
                rst_n,
                data,
                CH451_DCLK,
                CH451_DIN,
                CH451_LOAD
               );
//reference define
parameter   clk_div_factor     = 4'b1001;         //5MHz serial clk generate factor
parameter   point_i            = 8'b0000_0000;    //decimal point select,'1'select
parameter   digit_on_num       = 4'b1000;         //the num of the LED used

//display top_cmd
parameter   CH451_DISPLAY  = 32'hf_e_d_c_b_a_9_8; //cmd_display the right LED

//define main state machine
parameter   CH451_Idle               = 9'b0_0000_0001;
parameter   CH451_Enable_serial_port = 9'b0_0000_0010;      
parameter   CH451_Reset              = 9'b0_0000_0100;
parameter   CH451_Set_display_mode   = 9'b0_0000_1000;
parameter   CH451_Open_display       = 9'b0_0001_0000;
parameter   CH451_Get_data           = 9'b0_0010_0000;
parameter   CH451_Display_ready      = 9'b0_0100_0000;
parameter   CH451_Display            = 9'b0_1000_0000;
parameter   CH451_Display_temp       = 9'b1_0000_0000;

//define shift state machine
parameter   Shift12_out_idle         = 7'b000_0001;
parameter   Pull_down_ch451_load     = 7'b000_0010;
parameter   Get_shift_out_data       = 7'b000_0100;
parameter   Pull_down_ch451_dclk     = 7'b000_1000;
parameter   Pull_up_ch451_dclk       = 7'b001_0000;
parameter   Shift_paralell_data      = 7'b010_0000;
parameter   Pull_up_ch451_load       = 7'b100_0000;


//input decaration
input                         clk;             //system clk
input                         rst_n;           //system rst,'0' valid
input [4*digit_on_num-1:0]    data;            //display data input
//output decaration
output                        CH451_DIN;       //ch451 serial input
output                        CH451_DCLK;      //ch451 serial input clk
output                        CH451_LOAD;      //ch451 data/cmd load

reg                           CH451_DIN;
reg                           CH451_DCLK;
reg                           CH451_LOAD;
//---------------------------define led display reg-----------------------
reg                           trans_over_flag;
reg [3:0]                     clk_div_counter;
reg [3:0]                     shift_counter;
reg [11:0]                    CH451_cmd;
reg [2:0]                     transfer_count;
reg[digit_on_num-1:0]         decemial_point_sel;
reg [4*digit_on_num-1:0]      display_led_sel;
reg [4*digit_on_num-1:0]      display_data;
reg [10:0]                    state;
reg [6:0]                     shift_state;

//clk divide for the main state machine
always @(posedge clk or negedge rst_n) begin //default factor=10 or 5MHz
  if(!rst_n) clk_div_counter<=0;
  else if(clk_div_counter==clk_div_factor) clk_div_counter<=0;
  else clk_div_counter<=clk_div_counter+1'b1;
end

//main state
always @(posedge clk or negedge rst_n) begin
  if(!rst_n) begin
    state<=CH451_Idle;
	shift_state<=Shift12_out_idle;
    CH451_DIN<=1'b1;
    CH451_DCLK<=1'b1;
    CH451_LOAD<=1'b1;
    transfer_count<=0;
    shift_counter<=0;
	 display_data<=0;          
    decemial_point_sel<=0;    
    display_led_sel<=0;       
	 CH451_cmd<=12'h000;       
    trans_over_flag<=1'b0;
  end
  else if(clk_div_counter==clk_div_factor) begin
    case(state)
    CH451_Idle:begin
      CH451_DIN<=1'b0;
      state<=CH451_Enable_serial_port;
    end
    CH451_Enable_serial_port: begin
      CH451_DIN<=1'b1;
      trans_over_flag<=1'b0;
      CH451_cmd<=`CH451_RESET;
      state<=CH451_Reset;
    end
    CH451_Reset:begin
      if(trans_over_flag==1'b0)
        shift12_out;
      else begin
        trans_over_flag<=1'b0;
        CH451_cmd<=`CH451_BCD;
        state<=CH451_Set_display_mode;
      end
    end
    CH451_Set_display_mode:begin
      if(trans_over_flag==0)
        shift12_out;
      else begin
        trans_over_flag<=1'b0;
        CH451_cmd<=`CH451_SYSON1;
        state<=CH451_Open_display;
      end
    end
    CH451_Open_display:begin
      if(trans_over_flag==0)
        shift12_out;
      else begin
        trans_over_flag<=1'b0;
        state<=CH451_Get_data;
      end
    end
    CH451_Get_data:begin
      display_data[4*digit_on_num-1:0]<=data[4*digit_on_num-1:0];
      decemial_point_sel<=point_i[7:8-digit_on_num];
      display_led_sel<=CH451_DISPLAY[4*digit_on_num-1:0];
      state<=CH451_Display_ready;
    end
    CH451_Display_ready:begin
      CH451_cmd<={
	              display_led_sel[3:0],
                  decemial_point_sel[digit_on_num-1],
                  3'b000,
                  display_data[3:0]
                 };
      state<=CH451_Display;
    end
    CH451_Display:begin
      if(trans_over_flag==0)
        shift12_out;
      else begin
        trans_over_flag<=1'b0;
        state<=CH451_Display_temp;
      end
    end
    CH451_Display_temp:begin
      if(transfer_count==digit_on_num-1) begin
		state<=CH451_Get_data;
        transfer_count<=0;
	  end
      else begin
        state<=CH451_Display_ready;
        transfer_count<=transfer_count+1'b1;
        display_data<={
		               display_data[3:0],
                       display_data[4*digit_on_num-1:4]
                      };
        decemial_point_sel<={
                             decemial_point_sel[digit_on_num-2:0],
                             decemial_point_sel[digit_on_num-1]
                            };
        display_led_sel<={
                          display_led_sel[3:0],
                          display_led_sel[4*digit_on_num-1:4]
                         };
      end
    end
    default:state<=CH451_Idle;
    endcase
  end
end

//send the 12 bits display cmd to the CH451(12 bits shift register)
task shift12_out;
begin
  casex(shift_state)
  Shift12_out_idle:begin
    shift_state<=Pull_down_ch451_load;
  end
  Pull_down_ch451_load:begin
    shift_state<=Get_shift_out_data;
    CH451_LOAD<=1'b0;
  end
  Get_shift_out_data:begin
    shift_state<=Pull_down_ch451_dclk;
    CH451_DIN<=CH451_cmd[0];
  end
  Pull_down_ch451_dclk:begin
    CH451_DCLK<=1'b0;
    shift_state<=Pull_up_ch451_dclk;
  end
  Pull_up_ch451_dclk:begin
    CH451_DCLK<=1'b1;
    shift_state<=Shift_paralell_data;
  end
  Shift_paralell_data:begin
    if(shift_counter==11)begin
	  shift_state<=Pull_up_ch451_load;
	  shift_counter<=0;
	end
    else begin
      shift_counter<=shift_counter+1'b1;
      CH451_cmd<={1'b0,CH451_cmd[11:1]};
      shift_state<=Get_shift_out_data;
    end
  end
  Pull_up_ch451_load:begin
    trans_over_flag<=1'b1;
    shift_state<=Shift12_out_idle;
    CH451_LOAD<=1'b1;
  end
  default:begin
    shift_state<=Shift12_out_idle;
	end
  endcase
end
endtask
   
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -