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

共19条 2/2 1 2 跳转至
菜鸟
2012-11-05 23:12:19     打赏
11楼

实验一  数码管静态显示

代码

//Name:  led_display.v
//Function:
//   SW8---SW1             hgfedcba                         select  
//   sw[7:0]                      seg8[7:0]                         bit8[7:0]
//Author:  YanceyLu

module led_display(sw,seg8,bit8);
input [7:0] sw;
output [7:0] seg8;
output [7:0] bit8;

reg [7:0] seg8;

assign bit8=0;

always @(sw)
begin
 case(sw)
 8'b11111110: seg8<=8'hf9;//1
 8'b11111101: seg8<=8'ha4;//2
 8'b11111011: seg8<=8'hb0;//3
 8'b11110111: seg8<=8'h99;//4 
 8'b11101111: seg8<=8'h92;//5
 8'b11011111: seg8<=8'h82;//6
 8'b10111111: seg8<=8'hf8;//7
 8'b01111111: seg8<=8'h80;//8
 default:  seg8<=8'hc0;//0
 endcase
end
endmodule



效果视频


菜鸟
2012-11-05 23:18:38     打赏
12楼
数码管第一个实验我做好了。你是碰到什么问题了?解决了没?

菜鸟
2012-11-06 11:42:01     打赏
13楼

实验二  数码管动态显示

代码

//Name:  scan_led.v
//Function:  counter 60
//              KEY8                50MHz PIN_27                 SW8                hgfedcba             select
//              in                       clk                                        rst                   seg8                      bit8
//Author:  YanceyLu
   
module scan_led(in,clk,rst,seg8,bit8);
input in,clk,rst;
output [7:0] seg8;
output [7:0] bit8;

reg [7:0] seg8;
reg [7:0] bit8;

reg [15:0] delay_cnt;
reg display_bit;
reg [5:0] cnt;

wire [3:0] data10;
wire [3:0] data1;
reg [7:0] map_data10;
reg [7:0] map_data1;

always @(posedge clk or negedge rst)
begin
 if(!rst)
  delay_cnt<=0;
 else
  begin
   if(delay_cnt==49999)
    delay_cnt<=0;
   else
    delay_cnt<=delay_cnt+1;
  end
end

always @(posedge clk or negedge rst)
begin
 if(!rst)
  display_bit<=0;
 else
  begin
   if(delay_cnt==49999)
    display_bit<=display_bit+1;
   else
    display_bit<=display_bit;
  end
end

always @(display_bit)
begin
 case(display_bit)
 0: bit8<=8'b11111110;
 1: bit8<=8'b11111101;
 endcase
end

always @(bit8)
begin
 case(bit8)
 8'b11111110: seg8<=map_data1;
 8'b11111101: seg8<=map_data10;
 endcase
end

always @(data10 or data1)
begin
 case(data10)
 0: map_data10<=8'hc0;//0
 1: map_data10<=8'hf9;//1
 2: map_data10<=8'ha4;//2
 3: map_data10<=8'hb0;//3
 4: map_data10<=8'h99;//4
 5: map_data10<=8'h92;//5
 endcase
 
 case(data1)
 0: map_data1<=8'hc0;//0
 1: map_data1<=8'hf9;//1
 2: map_data1<=8'ha4;//2
 3: map_data1<=8'hb0;//3
 4: map_data1<=8'h99;//4
 5: map_data1<=8'h92;//5
 6: map_data1<=8'h82;//6
 7: map_data1<=8'hf8;//7
 8: map_data1<=8'h80;//8
 9: map_data1<=8'h90;//9
 endcase
end

assign data10=cnt/10;
assign data1=cnt%10;

always @(negedge in or negedge rst)
begin
 if(!rst)
  cnt<=0;
 else
  begin
   if(cnt==59)
    cnt<=0;
   else
    cnt<=cnt+1;
  end
end
endmodule



效果视频

由于没有对按键做处理,包括与时钟同步和变成单周期脉冲,所有按键计数有时会有些异常。
哈哈,多包涵!


菜鸟
2012-11-13 17:19:28     打赏
14楼

实验一  按键控制数码管(未消抖)

代码

//Name: key.v
//Function:
//            SW8           KEY8          hgfedcba             select
//            rst                key             seg8[7:0]              bit8[7:0] 
//Author: Yancey

module key(rst,key,seg8,bit8);
input rst,key;
output [7:0] seg8;
output [7:0] bit8;

assign bit8=8'b11111110;

reg [7:0] seg8;
reg [3:0] cnt;

always @(negedge key or negedge rst)
begin
 if(!rst)
  cnt<=0;
 else
  begin
   if(cnt==9)
    cnt<=0;
   else
    cnt<=cnt+1;
  end
end

always @(cnt)
begin
 case(cnt)
 0: seg8<=8'hc0;//0
 1: seg8<=8'hf9;//1
 2: seg8<=8'ha4;//2
 3: seg8<=8'hb0;//3
 4: seg8<=8'h99;//4
 5: seg8<=8'h92;//5
 6: seg8<=8'h82;//6
 7: seg8<=8'hf8;//7
 8: seg8<=8'h80;//8
 9: seg8<=8'h90;//9
 endcase
end
endmodule



视频效果

按键未消抖的情况下,有时会检测到多次按下。


菜鸟
2012-11-13 17:22:58     打赏
15楼

实验二  按键控制数码管(消抖)

代码

//Name: key_xiaodou.v
//Function:
//             PIN_27 50MHz              SW8              KEY8            hgfedcba               select
//             clk                                    rst                  key                 seg8[7:0]               bit8[7:0] 
//Author: YanceyLu

module key_xiaodou(clk,rst,key,seg8,bit8);
input clk,rst,key;
output [7:0] seg8;
output [7:0] bit8;

key_delay_xiaodou key_delay(clk,rst,key,okey);

reg [7:0] seg8;
reg [3:0] cnt;
assign bit8=8'b11111110;

always @(posedge clk or negedge rst)
begin
 if(!rst)
  cnt<=0;
 else if(!okey)
  begin
   if(cnt==9)
    cnt<=0;
   else
    cnt<=cnt+1;
  end
 else
  cnt<=cnt;
end

always @(cnt)
begin
 case(cnt)
 0: seg8<=8'hc0;//0
 1: seg8<=8'hf9;//1
 2: seg8<=8'ha4;//2
 3: seg8<=8'hb0;//3
 4: seg8<=8'h99;//4
 5: seg8<=8'h92;//5
 6: seg8<=8'h82;//6
 7: seg8<=8'hf8;//7
 8: seg8<=8'h80;//8
 9: seg8<=8'h90;//9
 endcase
end
endmodule




//Name: key_delay_xiaodou.v
//Function:
//  push key: 0
//  pop key: 1
//  xiao dou,using delay.
//Author: YanceyLu 

module key_delay_xiaodou(clk,rst,i_pulse,o_pulse);
input clk,rst,i_pulse;
output o_pulse;

reg [19:0] delay_cnt;
reg [1:0] pulse_reg;
reg [1:0] pulse_reg_new;
wire low;
wire low_new;

//Test falling edge
always @(posedge clk or negedge rst)
begin
 if(!rst)
  pulse_reg[0]<=1;
 else
  pulse_reg[0]<=i_pulse;
end

always @(posedge clk or negedge rst)
begin
 if(!rst)
  pulse_reg[1]<=1;
 else
  pulse_reg[1]<=pulse_reg[0];
end

assign low=pulse_reg[1]&(~pulse_reg[0]);

//Delay 20ms
always @(posedge clk or negedge rst)
begin
 if(!rst)
  delay_cnt<=0;
 else if(low)
  delay_cnt<=0;
 else
  delay_cnt<=delay_cnt+1;
end

//Test falling edge again
always @(posedge clk or negedge rst)
begin
 if(!rst)
  pulse_reg_new[0]<=1;
 else if(delay_cnt==20'hfffff)
  pulse_reg_new[0]<=i_pulse;
end

always @(posedge clk or negedge rst)
begin
 if(!rst)
  pulse_reg_new[1]<=1;
 else
  pulse_reg_new[1]<=pulse_reg_new[0];
end

assign low_new=pulse_reg_new[1]&(~pulse_reg_new[0]);
//Output
assign o_pulse=~low_new;
endmodule


视频效果


菜鸟
2012-12-01 20:30:55     打赏
16楼

实验一 蜂鸣器发出救护车鸣笛

代码

//Name: jiuhuche.v
//Function:
//   50MHz PIN27           SW8                   BEEP
//   clk                               rst                       beep
//Author: YanceyLu
module jiuhuche(clk,rst,beep);
input clk,rst;
output beep;

reg beep;
reg [24:0] div_cnt;
reg [14:0] delay_cnt;
wire [14:0] delay_end;

parameter clk1=56817;   //50000000/2*440-1
parameter clk2=28408;   //50000000/4*440-1
assign delay_end=div_cnt[24]?clk1:clk2;

always @(posedge clk or negedge rst)
begin
 if(!rst)
  div_cnt<=0;
 else
  div_cnt<=div_cnt+1;
end

always @(posedge clk or negedge rst)
begin
 if(!rst)
  delay_cnt<=delay_end;
 else if(delay_cnt==0)
  begin
   beep<=~beep;
   delay_cnt<=delay_end;
  end
 else
  delay_cnt<=delay_cnt-1;
end
endmodule



效果视频


菜鸟
2012-12-01 20:35:59     打赏
17楼

实验二 蜂鸣器演奏音乐:两只老虎

代码

//Name: music.v
//Function:  Play the music of two tigers
//  50MHz PIN27                      SW8                         BEEP
//  clk                                          rst                             beep
//
//Author: YanceyLu
module music(clk,rst,beep);
input clk,rst;
output beep;

reg beep;
reg [15:0] delay_cnt;
reg [15:0] delay_end;
reg [24:0] delay_cnt1;
reg [4:0] state;
reg [3:0] music;
reg clk_2Hz;

always @(posedge clk or negedge rst)
begin
 if(!rst)
  begin
  clk_2Hz<=0;
  delay_cnt1<=0;
  end
 else if(delay_cnt1==12499999)
  begin
   clk_2Hz<=~clk_2Hz;
   delay_cnt1<=0;
  end
 else
  delay_cnt1<=delay_cnt1+1;
end

always @(posedge clk_2Hz or negedge rst)
begin
 if(!rst)
  begin
   state<=0;
   music<=0;
  end
 else
  case(state)
   0:  begin music<=1;state<=1; end
   1:  begin music<=2;state<=2; end
   2:  begin music<=3;state<=3; end
   3:  begin music<=1;state<=4; end
   4:  begin music<=1;state<=5; end
   5:  begin music<=2;state<=6; end
   6:  begin music<=3;state<=7; end
   7:  begin music<=1;state<=8; end
   8:  begin music<=3;state<=9; end
   9:  begin music<=4;state<=10; end
   10:  begin music<=5;state<=11; end
   11:  begin music<=3;state<=12; end
   12:  begin music<=4;state<=13; end
   13:  begin music<=5;state<=14; end
   14:  begin music<=5;state<=15; end
   15:  begin music<=6;state<=16; end
   16:  begin music<=5;state<=17; end
   17:  begin music<=4;state<=18; end
   18:  begin music<=3;state<=19; end
   19:  begin music<=1;state<=20; end
   20:  begin music<=5;state<=21; end
   21:  begin music<=6;state<=22; end
   22:  begin music<=5;state<=23; end
   23:  begin music<=4;state<=24; end
   24:  begin music<=3;state<=25; end
   25:  begin music<=1;state<=26; end
   26:  begin music<=3;state<=27; end
   27:  begin music<=5;state<=28; end
   28:  begin music<=1;state<=29; end
   29:  begin music<=3;state<=30; end
   30:  begin music<=5;state<=31; end
   31:  begin music<=1;state<=0; end
  endcase  
end

always @(posedge clk or negedge rst)
begin
 if(!rst)
  delay_cnt<=0;
 else if((delay_cnt==delay_end)&(!(delay_end==16'hffff)))
  begin
   delay_cnt<=0;
   beep<=~beep;
  end
 else
  delay_cnt<=delay_cnt+1;
end

always @(music)
begin
 case(music)
    1: delay_end<=23912; //gaoyin 1
    2: delay_end<=21282; //gaoyin 2
    3: delay_end<=18961; //gaoyin 3
    4: delay_end<=17897; //gaoyin 4
    5: delay_end<=31888; //zhongyin 5
    6: delay_end<=14205; //gaoyin 6
    7: delay_end<=12655; //gaoyin 7
  default:  delay_end<=16'hffff;
 endcase
end
endmodule


效果视频


菜鸟
2012-12-20 18:06:09     打赏
18楼

实验一 lcd1602显示:静态显示

论坛提供的开发板LCD1602的电路好像有点问题,调显示对比度的那个引脚直接接了固定电阻,导致LCD显示的都是白块,不过可以看得出来确实有字符显示。


应该接可调电阻的,可以调节对比度就好了。

所以我用了另一个开发板做了这个实验。呵呵。



代码

//Name: lcd1602.v
//Function:
//
//   Drive lcd1602 on DE2 board to display "1234567812345678
//                                                                           abcdefghabcdefgh".
//
//
//   PS: Input 50MHz clock.
//
//
//Author: YanceyLu

module lcd1602(sys_clk    ,
      sys_rstn   ,
      lcd_rs     ,
      lcd_rw     ,
      lcd_en     ,
      lcd_data   ,
      lcd_on     ,  //Just for DE2 board
      lcd_blon   ,  //Just for DE2 board
      );
//输入输出信号定义
input          sys_clk    ;//系统时钟输入
input          sys_rstn   ;//系统复位信号,低电平有效
output         lcd_rs     ;//lcd的寄存器选择输出信号
output         lcd_rw     ;//lcd的读、写操作选择输出信号
output         lcd_en     ;//lcd使能信号
output  [7:0]  lcd_data   ;//lcd的数据总线(不进行读操作,故为输出)
output      lcd_on     ;//Just for DE2 board
output         lcd_blon   ;//Just for DE2 board
//寄存器定义
reg            lcd_rs     ;
reg            clk_div    ;
reg     [17:0] delay_cnt  ;
reg     [7:0]  lcd_data   ;
reg     [5: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时钟相同
assign lcd_on=1;   //Just for DE2 board
assign lcd_blon=1;   //Just for DE2 board

//时钟分频
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'd15)
      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'd31)
      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 <= set_ddram1; 
      end    
    end
  default:  state <= idle;
  endcase
  end
end

always @(char_cnt)   //输出的字符
begin
 case (char_cnt)
 5'd0: data_disp  = "1"; 
 5'd1: data_disp  = "2"; 
 5'd2: data_disp  = "3"; 
 5'd3: data_disp  = "4"; 
 5'd4: data_disp  = "5"; 
 5'd5: data_disp  = "6"; 
 5'd6: data_disp  = "7"; 
 5'd7: data_disp  = "8"; 
 5'd8: data_disp  = "1"; 
 5'd9: data_disp  = "2"; 
 5'd10: data_disp = "3"; 
 5'd11: data_disp = "4"; 
 5'd12: data_disp = "5"; 
 5'd13: data_disp = "6"; 
 5'd14: data_disp = "7"; 
 5'd15: data_disp = "8"; 
 5'd16: data_disp = "a"; 
 5'd17: data_disp = "b"; 
 5'd18: data_disp = "c"; 
 5'd19: data_disp = "d"; 
 5'd20: data_disp = "e"; 
 5'd21: data_disp = "f"; 
 5'd22: data_disp = "g"; 
 5'd23: data_disp = "h"; 
 5'd24: data_disp = "a";
 5'd25: data_disp = "b";
 5'd26: data_disp = "c";
 5'd27: data_disp = "d";
 5'd28: data_disp = "e";
 5'd29: data_disp = "f";
 5'd30: data_disp = "g";
 5'd31: data_disp = "h";
    default :   data_disp =""; 
 endcase
end
endmodule


效果照片


菜鸟
2012-12-20 18:09:37     打赏
19楼

实验一  LCD1602显示:循环滚动显示


还是用的另一块开发板做的。


代码

//Name: lcd1602.v
//Function:
//
//   Drive lcd1602 on DE2 board to display "1234567812345678
//                                                                           1234567812345678".
//   And make the screen to roll from right side to left side.
//
//   PS: Input 50MHz clock.
//
//
//Author: YanceyLu

module lcd1602(sys_clk    ,
      sys_rstn   ,
      lcd_rs     ,
      lcd_rw     ,
      lcd_en     ,
      lcd_data   ,
      lcd_on     ,  //Just for DE2 board
      lcd_blon   ,  //Just for DE2 board
      );
//输入输出信号定义
input          sys_clk    ;//系统时钟输入
input          sys_rstn   ;//系统复位信号,低电平有效
output         lcd_rs     ;//lcd的寄存器选择输出信号
output         lcd_rw     ;//lcd的读、写操作选择输出信号
output         lcd_en     ;//lcd使能信号
output  [7:0]  lcd_data   ;//lcd的数据总线(不进行读操作,故为输出)
output      lcd_on     ;//Just for DE2 board
output         lcd_blon   ;//Just for DE2 board
//寄存器定义
reg            lcd_rs     ;
reg            clk_div    ;
reg     [17:0] delay_cnt  ;
reg     [7:0]  lcd_data   ;
reg     [5:0]  char_cnt   ;  
reg     [7:0]  data_disp  ;
reg     [9:0]  state      ; 
reg  [3:0]  char_shift ;
reg     [1:0]  delay_cnt1  ;
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相应的地址
      delay        = 3;

assign lcd_rw = 1'b0;      //没有读操作,R/W信号始终为低电平
assign lcd_en = clk_div; //E信号出现高电平以及下降沿的时刻与LCD时钟相同
assign lcd_on=1;   //Just for DE2 board
assign lcd_blon=1;   //Just for DE2 board

//时钟分频
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; 
   char_shift<=0;   
   delay_cnt1<=0;
  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'd15)
      begin
       char_cnt <= char_cnt + 1'b1;
       lcd_rs<=1'b1;
       lcd_data <= data_disp;
       state <= write_ram1;
      end
     else
      begin
       char_cnt <= 0;
       state <= set_ddram2; 
      end    
    end
  write_ram2:    
    begin         
     if(char_cnt <=5'd15)
      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 <= delay; 
      end   
    end
  delay:
    begin
     delay_cnt1<=delay_cnt1+1;
     state<=set_ddram1;
     if(delay_cnt1==2'b11)
      char_shift <= char_shift-1;
    end
  default:  state <= idle;
  endcase
  end
end

 

always @(char_cnt)   //输出的字符
begin
 case (char_cnt)
 char_shift&4'b1111:   data_disp  = "1"; 
 (char_shift+1)&4'b1111:  data_disp  = "2"; 
 (char_shift+2)&4'b1111:  data_disp  = "3"; 
 (char_shift+3)&4'b1111:  data_disp  = "4"; 
 (char_shift+4)&4'b1111:  data_disp  = "5"; 
 (char_shift+5)&4'b1111:  data_disp  = "6"; 
 (char_shift+6)&4'b1111:  data_disp  = "7"; 
 (char_shift+7)&4'b1111:  data_disp  = "8"; 
 (char_shift+8)&4'b1111:  data_disp  = "1"; 
 (char_shift+9)&4'b1111:  data_disp  = "2"; 
 (char_shift+10)&4'b1111:  data_disp  = "3"; 
 (char_shift+11)&4'b1111:  data_disp  = "4"; 
 (char_shift+12)&4'b1111:  data_disp  = "5"; 
 (char_shift+13)&4'b1111:  data_disp  = "6"; 
 (char_shift+14)&4'b1111:  data_disp  = "7"; 
 (char_shift+15)&4'b1111:  data_disp  = "8"; 
    default :    data_disp  = ""; 
 endcase
end
endmodule


效果视频


共19条 2/2 1 2 跳转至

回复

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