这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 小荷进程贴

共24条 3/3 1 2 3 跳转至
工程师
2013-03-07 16:48:26     打赏
21楼

蜂鸣器作业2

自动播放音乐

参考的是 http://wenku.baidu.com/view/42a39e22aaea998fcc220e7a.html

具体是什么音乐不太清楚

 

 

 

代码

module yinyue(sys_clk,
            sys_rstn,
    beep
    );
input       sys_clk;
input       sys_rstn ;
output      beep;


reg         beep_r;
reg  [7:0]  state;
reg  [15:0] count,
            count_end;
reg  [23:0] count1;


parameter   L_5=16'd63775,
            L_6=16'd56818,
            M_1=16'd47773,
            M_2=16'd42567,
            M_3=16'd37919,
            M_5=16'd31887,
            M_6=16'd28409,
            H_1=16'd23923;

parameter TIME=12000000;

assign beep=beep_r;
always@(posedge sys_clk or negedge sys_rstn)
begin
 if(!sys_rstn)
  count<=25'd0;
 else
 begin
    count<=count+1'b1;
    if(count==count_end)
    begin
      count<=16'h0;
      beep_r<=!beep_r;
     end
  end
end
always@(posedge sys_clk or negedge sys_rstn)
begin
 if(!sys_rstn)
     count1<=25'd0;
  else begin
      if(count1<TIME)
      count1=count1+1'b1;
     else
   begin
   count1=24'd0;
   if(state==8'd147)
     state=8'd0;
   else
     state=state+1'b1;
   case(state)
    8'd0,8'd1:                              count_end=L_5;
    8'd2,8'd3,8'd4,8'd5,8'd6,8'd7,8'd8:     count_end=M_1;
    8'd9,8'd10:                             count_end=M_3;
    8'd11,8'd12,8'd13,8'd14:                count_end=M_2;
    8'd15:                                  count_end=M_1;
    8'd16,8'd17:                            count_end=M_2;
    8'd18,8'd19:                            count_end=M_3;
    8'd20,8'd21,8'd22,8'd23,8'd24:          count_end=M_1;
    8'd25,8'd26:                            count_end=M_3;
    8'd27,8'd28:                            count_end=M_5;
    8'd29,8'd30,8'd31,8'd32,8'd33:          count_end=M_6;
    8'd34,8'd35,8'd36,8'd37,8'd38:          count_end=M_6;
    8'd34,8'd35,8'd36,8'd37:                count_end=M_5;
    8'd34,8'd35,8'd36:                      count_end=M_3;
    8'd46,8'd47:                            count_end=M_1;
    8'd48,8'd49,8'd50,8'd51:                count_end=M_2;
    8'd52:                                  count_end=M_1;
    8'd53,8'd54:                            count_end=M_2;
    8'd55,8'd56:                            count_end=M_3;
    8'd57,8'd58,8'd59,8'd60:                count_end=M_1;
    8'd61,8'd62,8'd63:                      count_end=M_6;
    8'd64,8'd65:                            count_end=M_5;
    8'd66,8'd67,8'd68,8'd69:                count_end=M_1;
    8'd70,8'd71,8'd72,8'd73:                count_end=M_1;
    8'd74,8'd75:                            count_end=M_6;
    8'd76,8'd77,8'd78,8'd79:                count_end=M_5;
    8'd80,8'd81,8'd82:                      count_end=M_3;
    8'd83,8'd84:                            count_end=M_1;
    8'd85,8'd86,8'd87,8'd88:                count_end=M_2;
    8'd89:                                  count_end=M_1;
    8'd90,8'd91:                            count_end=M_2;
    8'd92,8'd93:                            count_end=M_6;
    8'd94,8'd95,8'd96,8'd97:                count_end=M_5;
    8'd98,8'd99,8'd100:                     count_end=M_3;
    8'd101,8'd102:                          count_end=M_5;
    8'd103,8'd104,8'd105,8'd106:            count_end=M_6;
    8'd107,8'd108,8'd109,8'd110:            count_end=M_6;
    8'd111,8'd112:                          count_end=H_1;
    8'd113,8'd114,8'd115,8'd116:            count_end=M_5;
    8'd117,8'd118,8'd119:                   count_end=M_3;
    8'd120,8'd121:                          count_end=M_6;
    8'd122,8'd123,8'd124,8'd125:            count_end=M_2;
    8'd126:                                 count_end=M_1;
    8'd127,8'd128:                          count_end=M_2;
    8'd129,8'd130:                          count_end=M_3;
    8'd131,8'd132,8'd133,8'd134:            count_end=M_1;
    8'd135,8'd136,8'd137:                   count_end=L_6;
    8'd138,8'd139:                          count_end=M_5;
    8'd140,8'd141,8'd142,8'd143:            count_end=M_1;
    8'd144,8'd145,8'd146,8'd147:            count_end=M_1;
    
    
    default:count_end=16'hffff;
     
    endcase
  end
  end
end
endmodule


工程师
2013-03-07 18:45:27     打赏
22楼

液晶屏作业显示其他字符

只是把原程序改动了一下显示

“xiaohe    eepw  FPGA  DIY!!!”

 

代码

`timescale 1ns / 1ps

module lcd1602(sys_clk    ,
      sys_rstn   ,
      lcd_rs     ,
      lcd_rw     ,
      lcd_en     ,
      lcd_data
      );
//输入输出信号定义
input          sys_clk    ;//系统时钟输入
input          sys_rstn   ;//系统复位信号,低电平有效
output         lcd_rs     ;//lcd的寄存器选择输出信号
output         lcd_rw     ;//lcd的读、写操作选择输出信号
output         lcd_en     ;//lcd使能信号
output  [7:0]  lcd_data   ;//lcd的数据总线(不进行读操作,故为输出)
//寄存器定义
reg            lcd_rs     ;
reg            clk_div    ;
reg     [17:0] delay_cnt  ;
reg     [7:0]  lcd_data   ;
reg     [4:0]  char_cnt   ;  
reg     [7:0]  data_disp  ;
reg     [9:0]  state      ;  
parameter    idle   = 10'b000000000, //初始状态,下一个状态为CLEAR
      clear  = 10'b000000001,  //清屏
      set_function = 10'b000000010,  //功能设置:8位数据接口/2行显示/5*8点阵字符
      switch_mode = 10'b000000100,  //显示开关控制:开显示,光标和闪烁关闭
      set_mode     = 10'b000001000,  //输入方式设置:数据读写操作后,地址自动加一/画面不动
      shift    = 10'b000010000,  //光标、画面位移设置:光标向左平移一个字符位(光标显示是关闭的,所以实际上设置是看不出效果的)
      set_ddram1   = 10'b000100000,  //设置DDRAM的地址:第一行起始为0x00(注意输出时DB7一定要为1)
      set_ddram2   = 10'b001000000,  //设置DDRAM的地址:第二行为0x40(注意输出时DB7一定要为1)
      write_ram1   = 10'b010000000,  //数据写入DDRAM相应的地址
      write_ram2   = 10'b100000000;  //数据写入DDRAM相应的地址

assign lcd_rw = 1'b0;      //没有读操作,R/W信号始终为低电平
assign lcd_en = clk_div; //E信号出现高电平以及下降沿的时刻与LCD时钟相同
//时钟分频
always@(posedge sys_clk or negedge sys_rstn)
begin
 if(!sys_rstn)
  begin
   delay_cnt<=18'd0;
   clk_div<=1'b0;
  end
 else if(delay_cnt==18'd249999)
  begin
   delay_cnt<=18'd0;
   clk_div<=~clk_div;
  end
 else
  begin
   delay_cnt<=delay_cnt+1'b1;
   clk_div<=clk_div;
  end
end
always@(posedge clk_div or negedge sys_rstn) //State Machine
begin
 if(!sys_rstn)
  begin
   state   <= idle;
   lcd_data <= 8'bzzzzzzzz;
   char_cnt <= 5'd0;   
  end
 else
  begin
  case(state)
  idle: begin      //初始状态
     state <= clear;
     lcd_data <= 8'bzzzzzzzz;
    end
  clear: begin      //清屏
     state <= set_function;
     lcd_rs<=1'b0;
     lcd_data <= 8'b00000001;   
    end  
  set_function:      //功能设置(38H):8位数据接口/2行显示/5*8点阵字符
    begin
     state <= switch_mode;
     lcd_rs<=1'b0;
     lcd_data <= 8'b00111000;    
    end
  switch_mode:       //显示开关控制(0CH):开显示,光标和闪烁关闭
    begin
     state <= set_mode;
     lcd_rs<=1'b0;
     lcd_data <= 8'b00001100;
    end 
  set_mode:begin      //输入方式设置(06H):数据读写操作后,地址自动加一/画面不动
     state <= shift; 
     lcd_rs<=1'b0;
     lcd_data <= 8'b00000110;
    end
  shift: begin      //光标、画面位移设置(10H):光标向左平移一个字符位(光标显示是关闭的,所以实际上设置是看不出效果的)
     state <= set_ddram1;
     lcd_rs<=1'b0;
     lcd_data <= 8'b0001_0000;   
    end  
  set_ddram1:          //设置DDRAM的地址:第一行起始为00H(注意输出时DB7一定要为1) 
    begin
     state <= write_ram1;
     lcd_rs<=1'b0;
     lcd_data <= 8'b1000_0000;//Line1
    end
  set_ddram2:       //设置DDRAM的地址:第二行为40H(注意输出时DB7一定要为1)
    begin
     state <= write_ram2;
     lcd_rs<=1'b0;
     lcd_data <= 8'b1100_0000;//Line2  
    end
  write_ram1:    
    begin         
     if(char_cnt <=5'd10)
      begin
       char_cnt <= char_cnt + 1'b1;
       lcd_rs<=1'b1;
       lcd_data <= data_disp;
       state <= write_ram1;
      end
     else
      begin
       state <= set_ddram2; 
      end    
    end
  write_ram2:    
    begin         
     if(char_cnt <=5'd26)
      begin
       char_cnt <= char_cnt + 1'b1;
       lcd_rs<=1'b1;
       lcd_data <= data_disp;
       state <= write_ram2;
      end
     else
      begin
       char_cnt <=5'd0;
       state <= shift; 
      end    
    end
  default:  state <= idle;
  endcase
  end
end

always @(char_cnt)   //输出的字符
begin
 case (char_cnt)
 5'd0: data_disp  = "x"; 
 5'd1: data_disp  = "i"; 
 5'd2: data_disp  = "a"; 
 5'd3: data_disp  = "o"; 
 5'd4: data_disp  = " "; 
 5'd5: data_disp  = "h"; 
 5'd6: data_disp  = "e"; 
 5'd7: data_disp  = " "; 
 5'd8: data_disp  = " "; 
 5'd9: data_disp  = " "; 
 5'd10: data_disp = " "; 
 5'd11: data_disp = "e"; 
 5'd12: data_disp = "e"; 
 5'd13: data_disp = "p"; 
 5'd14: data_disp = "w"; 
 5'd15: data_disp = " "; 
 5'd16: data_disp = "F"; 
 5'd17: data_disp = "P"; 
 5'd18: data_disp = "G"; 
 5'd19: data_disp = "A"; 
 5'd20: data_disp = " "; 
 5'd21: data_disp = "D"; 
 5'd22: data_disp = "I"; 
 5'd23: data_disp = "Y"; 
 5'd24: data_disp = "!";
 5'd25: data_disp = "!";
 5'd26: data_disp = "!";
    default :   data_disp =""; 
 endcase
end
endmodule

 


工程师
2013-03-07 20:21:01     打赏
23楼

 

液晶屏作业向右滚动显示

 

 

只改动了源代码shift 里的lcd_data的赋值为“8'b0001_1100”

 

 set_mode:begin      //输入方式设置(06H):数据读写操作后,地址自动加一/画面不动
     state <= shift; 
     lcd_rs<=1'b0;
     lcd_data <= 8'b00000110;
    end
  shift: begin      //光标、画面位移设置(10H):光标向左平移一个字符位(光标显示是关闭的,所以实际上设置是看不出效果的)
     state <= set_ddram1;
     lcd_rs<=1'b0;
     lcd_data <= 8'b0001_1100;   
    end  


工程师
2013-03-07 20:24:10     打赏
24楼
手上没有12846的液晶屏这个实验做不了

共24条 3/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]