如何去制作一套完整的基于FPGA的DDS信号发生器系统

为帮助同学们更好地理解和实现dds的功能,在硬禾做毕业设计的小杨同学特制作了一套完整的dds任意波形发生器系统,它包含如下的功能:
1. 顶层模块
fpga片内逻辑的结构框图如上图所示,fpga片上实现的逻辑包括:
调用内部锁相环由输入的12m时钟得到120mhz工作时钟,驱动dds控制模块,输出作为dac的转换时钟。
处理旋转编码器的输入。判断旋转编码器的转动和按下,顺时针转动对应信号频率的增加,逆时针转动对应信号频率的减小,按下对应波形的切换。
存储正弦波的波形数据。
实现的波形包括正弦波、三角波、方波、锯齿波四种波形,波形频率范围为100khz到10mhz。
通过spi总线驱动oled屏幕指示当前的波形和频率。
2. dds核心模块
dds控制模块是信号发生器设计的核心,利用verilog实现dds的结构框图如下图所示。
从图中可以看出,dds控制模块根据旋转编码器模块的输入信号调节频率控制字、切换波形,输出一定频率的方波、三角波、锯齿波或正弦波数据至dac。同时,dds控制模块还会将当前波形信息和频率信息输出给oled模块用于显示。四种波形的产生使用同一个相位累加寄存器,如下图所示,相位累加寄存器本质上是一个不断累加的计数器,单次累加的幅度是频率控制字,频率控制字由旋转编码器调节,当旋转编码器顺时针转动时增大频率控制字,当旋转编码器逆时针转动时减小频率控制字。接下来分别介绍四种波形的原理。
方波 - 取相位累加寄存器的最高位作为判断条件,当最高位为逻辑1,则对dac的输入赋值10’h3ff;当最高位为逻辑0,则则对dac的输入赋值10’h000,从而实现了方波波形。
锯齿波 - 取相位累加寄存器的高十位直接作为dac的输入,随着相位累加寄存器不断累加,dac的输入也周期性地以锯齿波形状循环。
三角波 - 取相位累加寄存器的最高位作为判断条件,当最高位为逻辑1,则将相位累加寄存器的13到22位直接作为dac数据的输入;当最高位为逻辑0,则将相位累加寄存器的13到22位取反后作为dac数据的输入。
正弦波 - 与其它三种波形不同,正弦波不能直接用取相位累加寄存器作为dac的输入,需要将相位累加寄存器的高8位作为正弦波表的地址输入,这样的话,就实现了在一个周期内以一定间隔读出正弦波表内的数据作为dac的输入。
下面是dds的主代码,可以选择输出的波形以及相应的频率
// --------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> copyright notice <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------
// module: dds
//
// author: step
//
// description: dds
//
// web
//
// --------------------------------------------------------------------
// code revision history :
// --------------------------------------------------------------------
// version: |mod. date: |changes made:
// v1.0 |2021.11.27 |initial ver
// --------------------------------------------------------------------
module dds(clk_in,rst_n,o_pulse,l_pulse,r_pulse,dac_data,wave,wavefreq);//
localparam sin = 2'b00, saw = 2'b01, tri = 2'b10, squ = 2'b11;
input clk_in; // 小脚丫fpga的外部时钟频率为12mhz
input rst_n;
input wire o_pulse,l_pulse,r_pulse;
output reg [9:0] dac_data; // 10位数据输出送给外部的dac
output reg [1:0] wave;
output reg [26:0] wavefreq;
reg [23:0] phase_acc; //增加相位累加器位数使得分辨率提高
wire [23:0] phase;
reg [23:0] f_inc;
assign phase=phase_acc;
always @(posedge clk_in) phase_acc <= phase_acc + f_inc; //f_inc=24'd27962;主时钟为12mhz,则产生20khz的正弦波信号
wire [9:0] sin_dat; //正弦波
wire [9:0] saw_dat = phase[23:14]; //锯齿波
wire [9:0] tri_dat = phase[23]? (~phase[22:13]) : phase[22:13]; //三角波
wire [9:0] squ_dat = phase[23]? 10'h3ff : 10'h000; //方波
always @(*) begin
case(wave)
2'b00: dac_data = sin_dat; //正弦波
2'b01: dac_data = saw_dat; //锯齿波
2'b10: dac_data = tri_dat; //三角波
2'b11: dac_data = squ_dat; //方波
default: dac_data = sin_dat; //正弦波
endcase
end
lookup_tables u_lookup_tables(.phase(phase_acc[23:16]), .sin_out(sin_dat));
//波形输出选择
always @(posedge clk_in or negedge rst_n) begin
if(!rst_n) wave <= sin;
else if(o_pulse)begin
case(wave)
sin: wave <= saw;
saw: wave <= tri;
tri: wave <= squ;
squ: wave <= sin;
default: wave <= sin;
endcase
end else wave <= wave;
end
//频率控制
always@(posedge clk_in or negedge rst_n) begin
if(!rst_n) begin
f_inc <= 24'h22222;
wavefreq<=1_000_000;
end
else if(l_pulse==1'b1) begin
if(f_inc <= 24'h369d) f_inc <= f_inc;
else begin
f_inc <= f_inc - 24'h369d;
wavefreq= 24'h155554) f_inc <= f_inc;
else begin
f_inc <= f_inc + 24'h369d;
wavefreq>>>>>>>>>>>>>>>>>>>>>>> copyright notice <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------
// module: encoder
//
// author: step
//
// description: driver for rotary encoder
//
// web
//
// --------------------------------------------------------------------
// code revision history :
// --------------------------------------------------------------------
// version: |mod. date: |changes made:
// v1.0 |2021.11.27 |initial ver
// --------------------------------------------------------------------
module encoder
(
input clk_in, //系统时钟
input rst_n_in, //系统复位,低有效
input wire key_a,
input wire key_b,
input wire key_ok,
output reg left_pulse, //左旋转脉冲输出
output reg right_pulse, //右旋转脉冲输出
output ok_pulse //按动脉冲输出
);
localparam num_500us = 6_0000;
reg [15:0] cnt;
//计数器周期为500us,控制键值采样频率
always@(posedge clk_in or negedge rst_n_in) begin
if(!rst_n_in) cnt = num_500us-1) cnt <= 1'b0;
else cnt <= cnt + 1'b1;
end
reg [5:0] cnt_20ms;
reg key_a_r,key_a_r1;
reg key_b_r,key_b_r1;
reg key_ok_r;
//针对a、b、d管脚分别做简单去抖操作,
//如果对旋转编码器的要求比较高,建议现对旋转编码器的输出做严格的消抖处理后再来做旋转编码器的驱动
//对旋转编码器的输入缓存,消除亚稳态同时延时锁存
always@(posedge clk_in or negedge rst_n_in) begin
if(!rst_n_in) begin
key_a_r <= 1'b1;
key_a_r1 <= 1'b1;
key_b_r <= 1'b1;
key_b_r1 <= 1'b1;
cnt_20ms <= 1'b1;
key_ok_r <= 1'b1;
end else if(cnt == num_500us-1) begin
key_a_r <= key_a;
key_a_r1 <= key_a_r;
key_b_r <= key_b;
key_b_r1 = 6'd40) begin //对于按键d信号还是采用20ms周期采样的方法,40*500us = 20ms
cnt_20ms <= 6'd0;
key_ok_r <= key_ok;
end else begin
cnt_20ms <= cnt_20ms + 1'b1;
key_ok_r <= key_ok_r;
end
end
end
reg key_ok_r1;
//对按键d信号进行延时锁存
always@(posedge clk_in or negedge rst_n_in) begin
if(!rst_n_in) key_ok_r1 <= 1'b1;
else key_ok_r1 <= key_ok_r;
end
wire a_state = key_a_r1 && key_a_r && key_a; //旋转编码器a信号高电平状态检测
wire b_state = key_b_r1 && key_b_r && key_b; //旋转编码器b信号高电平状态检测
assign ok_pulse = key_ok_r1 && (!key_ok_r); //旋转编码器d信号下降沿检测
reg a_state_reg;
//延时锁存
always@(posedge clk_in or negedge rst_n_in) begin
if(!rst_n_in) a_state_reg <= 1'b1;
else a_state_reg <= a_state;
end
//旋转编码器a信号的上升沿和下降沿检测
wire a_pos = (!a_state_reg) && a_state;
wire a_neg = a_state_reg && (!a_state);
//通过旋转编码器a信号的边沿和b信号的电平状态的组合判断旋转编码器的操作,并输出对应的脉冲信号
always@(posedge clk_in or negedge rst_n_in)begin
if(!rst_n_in)begin
right_pulse <= 1'b0;
left_pulse <= 1'b0;
end else begin
if(a_pos && b_state) left_pulse <= 1'b1;
else if(a_neg && b_state) right_pulse <= 1'b1;
else begin
right_pulse <= 1'b0;
left_pulse <= 1'b0;
end
end
end
endmodule
4. 将频率值转换为oled显示器上的字符
module getchar3 (
input clk,
input rst_n,
input [31:0] wavefreq,
output reg[(8*16-1):0] char
);
reg [31:0] t_bin;
reg [3:0] bcd8,bcd7,bcd6,bcd5,bcd4,bcd3,bcd2,bcd1;
reg [3:0] state;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
t_bin<=wavefreq;
char<= 0;
bcd8<= 0;
bcd7<= 0;
bcd6<= 0;
bcd5<= 0;
bcd4<= 0;
bcd3<= 0;
bcd2<= 0;
bcd1<= 0;
state<=0;
end
else begin
case (state)
0: begin
t_bin<=wavefreq;
state=0)begin
bcd8<=bcd8+1;
t_bin<=t_bin-10000000;
end
else begin
state=0)begin
bcd7<=bcd7+1;
t_bin<=t_bin-1000000;
end
else begin
state=0)begin
bcd6<=bcd6+1;
t_bin<=t_bin-100000;
end
else begin
state=0)begin
bcd5<=bcd5+1;
t_bin<=t_bin-10000;
end
else begin
state=0)begin
bcd4<=bcd4+1;
t_bin<=t_bin-1000;
end
else begin
state=0)begin
bcd3<=bcd3+1;
t_bin<=t_bin-100;
end
else begin
state=0)begin
bcd2<=bcd2+1;
t_bin<=t_bin-10;
end
else begin
state=0)begin
bcd1<=bcd1+1;
t_bin<=t_bin-1;
end
else begin
state<=state+1;
end
end
9:begin
t_bin<=wavefreq;
char<={ ,4'h0,bcd8,4'h0,bcd7,_,
4'h0,bcd6,4'h0,bcd5,4'h0,bcd4,_,
4'h0,bcd3,4'h0,bcd2,4'h0,bcd1,hz };
bcd8<= 0;
bcd7<= 0;
bcd6<= 0;
bcd5<= 0;
bcd4<= 0;
bcd3<= 0;
bcd2<= 0;
bcd1<= 0;
state<=0;
end
default: begin
t_bin<=wavefreq;
bcd7<= 0;
bcd6<= 0;
bcd5<= 0;
bcd4<= 0;
bcd3<= 0;
bcd2<= 0;
bcd1<= 0;
state<=0;
end
endcase
end
end
endmodule
5. oled显示模块
这是通过spi总线方式来驱动128*64分辨率的oled显示屏显示相应信息的逻辑代码
该模块的输入包括时钟、复位、输入变量,输出是驱动ssd1306的的五根总线:包括spi的三条总线、一条ssd1306复位线、一条ssd1306数据指令选择线。该模块通过spi总线完成oled屏幕的显示,能够显示字符和汉字。该模块中,利用查找表实现字符、汉字模的存储,利用一个一段式状态机实现:初始化配置ssd1306驱动芯片、在屏幕上显示指定的信息。其中,idle状态作为初始状态完成所有寄存器变量的初始化;main状态作为总调度实现了整个oled模块的流程调度,如果想要使用本模块,只需要在本状态进行修改;init状态通过调用write状态将23条ssd1306的配置指令通过spi时序发出,完成ssd1306的配置;scan状态通过调用write状态完成字符的显示;chinese状态通过调用write状态完成汉字的显示;write状态作为底层状态,完成spi的传输过程;delay状态的功能是延时。本模块的使用通过在main状态里进行添加相应的逻辑来实现,如果显示汉字则需要在汉字字模中添加相应的字模信息。如果想要实时刷新信息,需要将动态显示的信息通过本module的输入端口sw传入模块本在main状态里进行调用,也可自行添加输入端口变量。
// --------------------------------------------------------------------
// module: oled12864 
// description: oled12864_driver
// --------------------------------------------------------------------
module oled12864
(
  input        clk,    //12mhz绯荤粺鏃堕挓
  input        rst_n,    //绯荤粺澶嶄綅锛屼綆鏈夋晥
  input    [3:0]  sw,
  input    [1:0]  wave,
  input [26:0]    wavefreq,
  output  reg      oled_csn,  //olcd娑叉櫠灞忎娇鑳
  output  reg      oled_rst,  //olcd娑叉櫠灞忓浣
  output  reg      oled_dcn,  //olcd鏁版嵁鎸囦护鎺у埗
  output  reg      oled_clk,  //olcd鏃堕挓淇″彿
  output  reg      oled_dat  //olcd鏁版嵁淇″彿
);
  localparam init_depth = 16'd23; //lcd鍒濆鍖栫殑鍛戒护鐨勬暟閲
  localparam idle = 7'h1, main = 7'h2, init = 7'h4, scan = 7'h8, write = 7'h10, delay = 7'h20,chinese=7'h40;
  localparam high  = 1'b1, low = 1'b0;
  localparam data  = 1'b1, cmd = 1'b0;
  reg   [7:0]       cmd [24:0];
  reg   [39:0]       mem [122:0];
  reg    [63:0]      mem_hanzi[79:0];
  reg    [4:0]      length_hanzi;
  reg  [7:0]        y_p, x_ph, x_pl;
  reg  [(8*21-1):0]   char;
  reg  [7:0]        num, char_reg;        
  reg  [4:0]        cnt_main, cnt_init, cnt_scan, cnt_write,cnt_chinese;
  reg  [15:0]      num_delay, cnt_delay, cnt;
  reg  [6:0]       state, state_back;
  reg [4:0]      hanzi_fuzhujishu;
    wire [(8*16-1):0]   char3;
  getchar3 getchar3 (
        .clk(clk),
        .rst_n(rst_n),
        .wavefreq(wavefreq),
        .char(char3)
    );
  always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
      cnt_main <= 1'b0; cnt_init <= 1'b0; cnt_scan <= 1'b0; cnt_write <= 1'b0;cnt_chinese <= 1'b0;
      y_p <= 1'b0; x_ph <= 1'b0; x_pl <= 1'b0;length_hanzi<=5'd0;hanzi_fuzhujishu<=5'd0;
      num <= 1'b0; char <= 1'b0; char_reg <= 1'b0;
      num_delay <= 16'd5; cnt_delay <= 1'b0; cnt <= 1'b0;
      oled_csn <= high; oled_rst <= high; oled_dcn <= cmd; oled_clk <= high; oled_dat <= low;
      state <= idle; state_back <= idle;
    end else begin
      case(state)
        idle:begin
            cnt_main <= 1'b0; cnt_init <= 1'b0; cnt_scan <= 1'b0; cnt_write <= 1'b0;
            y_p <= 1'b0; x_ph <= 1'b0; x_pl <= 1'b0;
            num <= 1'b0; char <= 1'b0; char_reg <= 1'b0;
            num_delay <= 16'd5; cnt_delay <= 1'b0; cnt <= 1'b0;
            oled_csn <= high; oled_rst <= high; oled_dcn <= cmd; oled_clk <= high; oled_dat <= low;
            state <= main; state_back = 5'd14) cnt_main <= 5'd12;
            else cnt_main <= cnt_main + 1'b1;
            case(cnt_main)  //main鐘舵€            
              5'd0 :  begin state <= init; end
              5'd1 :  begin y_p <= 8'hb0; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd8; char <= dds     ;state <= scan; end
              5'd2 :  begin y_p <= 8'hb1; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd8; char <=         ;state <= scan; end                                                
              5'd3 :  begin y_p <= 8'hb0; x_ph <= 8'h14; x_pl <= 8'h00; num <= 5'd8; char <=          ;state <= scan; end
              5'd4 :  begin y_p <= 8'hb1; x_ph <= 8'h14; x_pl <= 8'h00; num <= 5'd8; char <=          ;state <= scan; end                        
              5'd5 :  begin y_p <= 8'hb2; x_ph <= 8'h14; x_pl <= 8'h00; num <= 5'd8; char <=          ;state <= scan; end
              5'd6 :  begin y_p <= 8'hb3; x_ph <= 8'h14; x_pl <= 8'h00; num <= 5'd8; char <=          ;state <= scan; end
              5'd7 :  begin y_p <= 8'hb4; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <=                 ;state <= scan; end
              5'd8 :  begin y_p <= 8'hb5; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <=                 ;state <= scan; end
              5'd9 :  begin y_p <= 8'hb6; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <=                 ;state <= scan; end
              5'd10:  begin y_p <= 8'hb7; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <=                 ;state <= scan; end              
              5'd11:  ;//begin y_p <= 8'hb1; x_ph <= 8'h15; x_pl <= 8'h00; num <= 5'd 1; char <= sw; state <= scan; end
              5'd12:  begin y_p <= 8'hb2; x_ph <= 8'h10; x_pl <= 8'h00; length_hanzi <= 5'd9; 
                    if     (wave==2'b00)begin hanzi_fuzhujishu<=5'd8;state <= chinese; end 
                    else if(wave==2'b01)begin hanzi_fuzhujishu<=5'd2;state <= chinese; end 
                    else if(wave==2'b10)begin hanzi_fuzhujishu<=5'd4;state <= chinese; end 
                    else begin hanzi_fuzhujishu<=5'd6;state <= chinese; end //if(wave==2'b11)
                  end
              5'd13 :  begin y_p <= 8'hb3; x_ph <= 8'h10; x_pl <= 8'h00; length_hanzi <= 5'd9; 
                    if     (wave==2'b00)begin hanzi_fuzhujishu<=5'd9;state <= chinese; end 
                    else if(wave==2'b01)begin hanzi_fuzhujishu<=5'd3;state <= chinese; end 
                    else if(wave==2'b10)begin hanzi_fuzhujishu<=5'd5;state <= chinese; end 
                    else begin hanzi_fuzhujishu<=5'd7;state <= chinese; end //if(wave==2'b11)
                  end
              5'd14 :  begin y_p <= 8'hb5; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= char3;state <= scan; end
              default: state <= idle;
            endcase
          end
        init:begin  //鍒濆鍖栫姸鎬
            case(cnt_init)
              5'd0:  begin oled_rst <= low; cnt_init <= cnt_init + 1'b1; end  //澶嶄綅鏈夋晥
              5'd1:  begin num_delay <= 16'd25000; state <= delay; state_back <= init; cnt_init <= cnt_init + 1'b1; end  //寤舵椂澶т簬3us
              5'd2:  begin oled_rst <= high; cnt_init <= cnt_init + 1'b1; end  //澶嶄綅鎭㈠
              5'd3:  begin num_delay <= 16'd25000; state <= delay; state_back <= init; cnt_init =init_depth) begin  //褰5鏉℃寚浠ゅ強鏁版嵁鍙戝嚭鍚庯紝閰嶇疆瀹屾垚
                      cnt <= 1'b0;
                      cnt_init <= cnt_init + 1'b1;
                    end else begin  
                      cnt <= cnt + 1'b1; num_delay <= 16'd5;
                      oled_dcn <= cmd; char_reg <= cmd[cnt]; state <= write; state_back <= init;
                    end
                  end
              5'd5:  begin cnt_init <= 1'b0; state <= main; end  //鍒濆鍖栧畬鎴愶紝杩斿洖main鐘舵€
              default: state <= idle;
            endcase
          end
        scan:begin  //鍒峰睆鐘舵€侊紝浠嶳am涓鍙栨暟鎹埛灞
            if(cnt_scan == 5'd11) begin
              if(num) cnt_scan <= 5'd3;
              else cnt_scan <= cnt_scan + 1'b1;
            end 
            else if(cnt_scan == 5'd12) cnt_scan <= 1'b0;
            else cnt_scan <= cnt_scan + 1'b1;
            case(cnt_scan)
              5'd 0:  begin oled_dcn <= cmd; char_reg <= y_p; state <= write; state_back <= scan; end    //瀹氫綅鍒楅〉鍦板潃
              5'd 1:  begin oled_dcn <= cmd; char_reg <= x_pl; state <= write; state_back <= scan; end  //瀹氫綅琛屽湴鍧€浣庝綅
              5'd 2:  begin oled_dcn <= cmd; char_reg <= x_ph; state <= write; state_back <= scan; end  //瀹氫綅琛屽湴鍧€楂樹綅
              5'd 3:  begin num <= num - 1'b1;end
              5'd 4:  begin oled_dcn <= data; char_reg <= 8'h00; state <= write; state_back <= scan; end  //灏*8鐐归樀缂栫▼8*8
              5'd 5:  begin oled_dcn <= data; char_reg <= 8'h00; state <= write; state_back <= scan; end  //灏*8鐐归樀缂栫▼8*8
              5'd 6:  begin oled_dcn <= data; char_reg <= 8'h00; state <= write; state_back <= scan; end  //灏*8鐐归樀缂栫▼8*8
              5'd 7:  begin oled_dcn <= data; char_reg <= mem[char[(num*8)+:8]][39:32]; state <= write; state_back <= scan; end
              5'd 8:  begin oled_dcn <= data; char_reg <= mem[char[(num*8)+:8]][31:24]; state <= write; state_back <= scan; end
              5'd 9:  begin oled_dcn <= data; char_reg <= mem[char[(num*8)+:8]][23:16]; state <= write; state_back <= scan; end
              5'd10:  begin oled_dcn <= data; char_reg <= mem[char[(num*8)+:8]][15: 8]; state <= write; state_back <= scan; end
              5'd11:  begin oled_dcn <= data; char_reg <= mem[char[(num*8)+:8]][ 7: 0]; state <= write; state_back <= scan; end
              5'd12:  begin state <= main; end
              default: state <= idle;
            endcase
          end
        //length_hanzi=5'd2) cnt_chinese <= 5'd3;
              else cnt_chinese <= cnt_chinese + 1'b1;
            end 
            else if(cnt_chinese == 5'd12) cnt_chinese <= 1'b0;
            else cnt_chinese <= cnt_chinese+1'b1;
            case(cnt_chinese)    
              5'd 0:  begin oled_dcn <= cmd; char_reg <= y_p; state <= write; state_back <= chinese; end    //瀹氫綅鍒楅〉鍦板潃
              5'd 1:  begin oled_dcn <= cmd; char_reg <= 8'h00; state <= write; state_back <= chinese; end  //瀹氫綅琛屽湴鍧€浣庝綅
              5'd 2:  begin oled_dcn <= cmd; char_reg <= 8'h10; state <= write; state_back <= chinese; end  //瀹氫綅琛屽湴鍧€楂樹綅
              5'd 3:  begin length_hanzi <= length_hanzi - 1'b1;end//length_hanzi鍒濆=9锛氭瘡琛岄暱搴︿负8
              5'd 4:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][63:56]; state <= write; state_back <= chinese; end
              5'd 5:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][55:48]; state <= write; state_back <= chinese; end
              5'd 6:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][47:40]; state <= write; state_back <= chinese; end
              5'd 7:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][39:32]; state <= write; state_back <= chinese; end
              5'd 8:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][31:24]; state <= write; state_back <= chinese; end
              5'd 9:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][23:16]; state <= write; state_back <= chinese; end
              5'd10:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][15: 8]; state <= write; state_back <= chinese; end
              5'd11:  begin oled_dcn <= data; char_reg <= mem_hanzi[hanzi_fuzhujishu*8+8-length_hanzi][ 7: 0]; state <= write; state_back <= chinese; end 
              5'd12:  begin state <= main; end
              default: state = 5'd17) cnt_write <= 1'b0;
            else cnt_write <= cnt_write + 1'b1;
            case(cnt_write)
              5'd 0:  begin oled_csn <= low; end  //9浣嶆暟鎹渶楂樹綅涓哄懡浠ゆ暟鎹帶鍒朵綅
              5'd 1:  begin oled_clk <= low; oled_dat <= char_reg[7]; end  //鍏堝彂楂樹綅鏁版嵁
              5'd 2:  begin oled_clk <= high; end
              5'd 3:  begin oled_clk <= low; oled_dat <= char_reg[6]; end
              5'd 4:  begin oled_clk <= high; end
              5'd 5:  begin oled_clk <= low; oled_dat <= char_reg[5]; end
              5'd 6:  begin oled_clk <= high; end
              5'd 7:  begin oled_clk <= low; oled_dat <= char_reg[4]; end
              5'd 8:  begin oled_clk <= high; end
              5'd 9:  begin oled_clk <= low; oled_dat <= char_reg[3]; end
              5'd10:  begin oled_clk <= high; end
              5'd11:  begin oled_clk <= low; oled_dat <= char_reg[2]; end
              5'd12:  begin oled_clk <= high; end
              5'd13:  begin oled_clk <= low; oled_dat <= char_reg[1]; end
              5'd14:  begin oled_clk <= high; end
              5'd15:  begin oled_clk <= low; oled_dat <= char_reg[0]; end  //鍚庡彂浣庝綅鏁版嵁
              5'd16:  begin oled_clk <= high; end
              5'd17:  begin oled_csn <= high; state <= delay; end  //
              default: state = num_delay) begin
              cnt_delay <= 16'd0; state <= state_back; 
            end else cnt_delay <= cnt_delay + 1'b1;
          end
        default:state <= idle;
      endcase
    end
  end
  //oled閰嶇疆鎸囦护鏁版嵁
  always@(posedge rst_n)
    begin
      cmd[0 ] = {8'hae}; 
      cmd[1 ] = {8'hd5}; 
      cmd[2 ] = {8'h80}; 
      cmd[3 ] = {8'ha8}; 
      cmd[4 ] = {8'h3f}; 
      cmd[5 ] = {8'hd3}; 
      cmd[6 ] = {8'h00}; 
      cmd[7 ] = {8'h40}; 
      cmd[8 ] = {8'h8d}; 
      cmd[9 ] = {8'h14}; 
      cmd[10] = {8'h20}; 
      cmd[11] = {8'h02};
      cmd[12] = {8'hc8};
      cmd[13] = {8'ha1};
      cmd[14] = {8'hda};
      cmd[15] = {8'h12};
      cmd[16] = {8'h81};
      cmd[17] = {8'hcf};
      cmd[18] = {8'hd9};
      cmd[19] = {8'hf1};
      cmd[20] = {8'hdb};
      cmd[21] = {8'h40};
      cmd[22] = {8'haf};
    end 
  //5*8鐐归樀瀛楀簱鏁版嵁
  always@(posedge rst_n)
    begin
      mem[  0] = {8'h3e, 8'h51, 8'h49, 8'h45, 8'h3e};   // 48  0
      mem[  1] = {8'h00, 8'h42, 8'h7f, 8'h40, 8'h00};   // 49  1
      mem[  2] = {8'h42, 8'h61, 8'h51, 8'h49, 8'h46};   // 50  2
      mem[  3] = {8'h21, 8'h41, 8'h45, 8'h4b, 8'h31};   // 51  3
      mem[  4] = {8'h18, 8'h14, 8'h12, 8'h7f, 8'h10};   // 52  4
      mem[  5] = {8'h27, 8'h45, 8'h45, 8'h45, 8'h39};   // 53  5
      mem[  6] = {8'h3c, 8'h4a, 8'h49, 8'h49, 8'h30};   // 54  6
      mem[  7] = {8'h01, 8'h71, 8'h09, 8'h05, 8'h03};   // 55  7
      mem[  8] = {8'h36, 8'h49, 8'h49, 8'h49, 8'h36};   // 56  8
      mem[  9] = {8'h06, 8'h49, 8'h49, 8'h29, 8'h1e};   // 57  9
      mem[ 10] = {8'h7c, 8'h12, 8'h11, 8'h12, 8'h7c};   // 65  a
      mem[ 11] = {8'h7f, 8'h49, 8'h49, 8'h49, 8'h36};   // 66  b
      mem[ 12] = {8'h3e, 8'h41, 8'h41, 8'h41, 8'h22};   // 67  c
      mem[ 13] = {8'h7f, 8'h41, 8'h41, 8'h22, 8'h1c};   // 68  d
      mem[ 14] = {8'h7f, 8'h49, 8'h49, 8'h49, 8'h41};   // 69  e
      mem[ 15] = {8'h7f, 8'h09, 8'h09, 8'h09, 8'h01};   // 70  f
      mem[ 32] = {8'h00, 8'h00, 8'h00, 8'h00, 8'h00};   // 32  sp 
      mem[ 33] = {8'h00, 8'h00, 8'h2f, 8'h00, 8'h00};   // 33  !  
      mem[ 34] = {8'h00, 8'h07, 8'h00, 8'h07, 8'h00};   // 34  
      mem[ 35] = {8'h14, 8'h7f, 8'h14, 8'h7f, 8'h14};   // 35  #
      mem[ 36] = {8'h24, 8'h2a, 8'h7f, 8'h2a, 8'h12};   // 36  $
      mem[ 37] = {8'h62, 8'h64, 8'h08, 8'h13, 8'h23};   // 37  %
      mem[ 38] = {8'h36, 8'h49, 8'h55, 8'h22, 8'h50};   // 38  &
      mem[ 39] = {8'h00, 8'h05, 8'h03, 8'h00, 8'h00};   // 39  '
      mem[ 40] = {8'h00, 8'h1c, 8'h22, 8'h41, 8'h00};   // 40  (
      mem[ 41] = {8'h00, 8'h41, 8'h22, 8'h1c, 8'h00};   // 41  )
      mem[ 42] = {8'h14, 8'h08, 8'h3e, 8'h08, 8'h14};   // 42  *
      mem[ 43] = {8'h08, 8'h08, 8'h3e, 8'h08, 8'h08};   // 43  +
      mem[ 44] = {8'h00, 8'h00, 8'ha0, 8'h60, 8'h00};   // 44  ,
      mem[ 45] = {8'h08, 8'h08, 8'h08, 8'h08, 8'h08};   // 45  -
      mem[ 46] = {8'h00, 8'h60, 8'h60, 8'h00, 8'h00};   // 46  .
      mem[ 47] = {8'h20, 8'h10, 8'h08, 8'h04, 8'h02};   // 47  /
      mem[ 48] = {8'h3e, 8'h51, 8'h49, 8'h45, 8'h3e};   // 48  0
      mem[ 49] = {8'h00, 8'h42, 8'h7f, 8'h40, 8'h00};   // 49  1
      mem[ 50] = {8'h42, 8'h61, 8'h51, 8'h49, 8'h46};   // 50  2
      mem[ 51] = {8'h21, 8'h41, 8'h45, 8'h4b, 8'h31};   // 51  3
      mem[ 52] = {8'h18, 8'h14, 8'h12, 8'h7f, 8'h10};   // 52  4
      mem[ 53] = {8'h27, 8'h45, 8'h45, 8'h45, 8'h39};   // 53  5
      mem[ 54] = {8'h3c, 8'h4a, 8'h49, 8'h49, 8'h30};   // 54  6
      mem[ 55] = {8'h01, 8'h71, 8'h09, 8'h05, 8'h03};   // 55  7
      mem[ 56] = {8'h36, 8'h49, 8'h49, 8'h49, 8'h36};   // 56  8
      mem[ 57] = {8'h06, 8'h49, 8'h49, 8'h29, 8'h1e};   // 57  9
      mem[ 58] = {8'h00, 8'h36, 8'h36, 8'h00, 8'h00};   // 58  :
      mem[ 59] = {8'h00, 8'h56, 8'h36, 8'h00, 8'h00};   // 59  ;
      mem[ 60] = {8'h08, 8'h14, 8'h22, 8'h41, 8'h00};   // 60 
      mem[ 63] = {8'h02, 8'h01, 8'h51, 8'h09, 8'h06};   // 63  ?
      mem[ 64] = {8'h32, 8'h49, 8'h59, 8'h51, 8'h3e};   // 64  @
      mem[ 65] = {8'h7c, 8'h12, 8'h11, 8'h12, 8'h7c};   // 65  a
      mem[ 66] = {8'h7f, 8'h49, 8'h49, 8'h49, 8'h36};   // 66  b
      mem[ 67] = {8'h3e, 8'h41, 8'h41, 8'h41, 8'h22};   // 67  c
      mem[ 68] = {8'h7f, 8'h41, 8'h41, 8'h22, 8'h1c};   // 68  d
      mem[ 69] = {8'h7f, 8'h49, 8'h49, 8'h49, 8'h41};   // 69  e
      mem[ 70] = {8'h7f, 8'h09, 8'h09, 8'h09, 8'h01};   // 70  f
      mem[ 71] = {8'h3e, 8'h41, 8'h49, 8'h49, 8'h7a};   // 71  g
      mem[ 72] = {8'h7f, 8'h08, 8'h08, 8'h08, 8'h7f};   // 72  h
      mem[ 73] = {8'h00, 8'h41, 8'h7f, 8'h41, 8'h00};   // 73  i
      mem[ 74] = {8'h20, 8'h40, 8'h41, 8'h3f, 8'h01};   // 74  j
      mem[ 75] = {8'h7f, 8'h08, 8'h14, 8'h22, 8'h41};   // 75  k
      mem[ 76] = {8'h7f, 8'h40, 8'h40, 8'h40, 8'h40};   // 76  l
      mem[ 77] = {8'h7f, 8'h02, 8'h0c, 8'h02, 8'h7f};   // 77  m
      mem[ 78] = {8'h7f, 8'h04, 8'h08, 8'h10, 8'h7f};   // 78  n
      mem[ 79] = {8'h3e, 8'h41, 8'h41, 8'h41, 8'h3e};   // 79  o
      mem[ 80] = {8'h7f, 8'h09, 8'h09, 8'h09, 8'h06};   // 80  p
      mem[ 81] = {8'h3e, 8'h41, 8'h51, 8'h21, 8'h5e};   // 81  q
      mem[ 82] = {8'h7f, 8'h09, 8'h19, 8'h29, 8'h46};   // 82  r
      mem[ 83] = {8'h46, 8'h49, 8'h49, 8'h49, 8'h31};   // 83  s
      mem[ 84] = {8'h01, 8'h01, 8'h7f, 8'h01, 8'h01};   // 84  t
      mem[ 85] = {8'h3f, 8'h40, 8'h40, 8'h40, 8'h3f};   // 85  u
      mem[ 86] = {8'h1f, 8'h20, 8'h40, 8'h20, 8'h1f};   // 86  v
      mem[ 87] = {8'h3f, 8'h40, 8'h38, 8'h40, 8'h3f};   // 87  w
      mem[ 88] = {8'h63, 8'h14, 8'h08, 8'h14, 8'h63};   // 88  x
      mem[ 89] = {8'h07, 8'h08, 8'h70, 8'h08, 8'h07};   // 89  y
      mem[ 90] = {8'h61, 8'h51, 8'h49, 8'h45, 8'h43};   // 90  z
      mem[ 91] = {8'h00, 8'h7f, 8'h41, 8'h41, 8'h00};   // 91  [
      mem[ 92] = {8'h55, 8'h2a, 8'h55, 8'h2a, 8'h55};   // 92  .
      mem[ 93] = {8'h00, 8'h41, 8'h41, 8'h7f, 8'h00};   // 93  ]
      mem[ 94] = {8'h04, 8'h02, 8'h01, 8'h02, 8'h04};   // 94  ^
      mem[ 95] = {8'h40, 8'h40, 8'h40, 8'h40, 8'h40};   // 95  _
      mem[ 96] = {8'h00, 8'h01, 8'h02, 8'h04, 8'h00};   // 96  '
      mem[ 97] = {8'h20, 8'h54, 8'h54, 8'h54, 8'h78};   // 97  a
      mem[ 98] = {8'h7f, 8'h48, 8'h44, 8'h44, 8'h38};   // 98  b
      mem[ 99] = {8'h38, 8'h44, 8'h44, 8'h44, 8'h20};   // 99  c
      mem[100] = {8'h38, 8'h44, 8'h44, 8'h48, 8'h7f};   // 100 d
      mem[101] = {8'h38, 8'h54, 8'h54, 8'h54, 8'h18};   // 101 e
      mem[102] = {8'h08, 8'h7e, 8'h09, 8'h01, 8'h02};   // 102 f
      mem[103] = {8'h18, 8'ha4, 8'ha4, 8'ha4, 8'h7c};   // 103 g
      mem[104] = {8'h7f, 8'h08, 8'h04, 8'h04, 8'h78};   // 104 h
      mem[105] = {8'h00, 8'h44, 8'h7d, 8'h40, 8'h00};   // 105 i
      mem[106] = {8'h40, 8'h80, 8'h84, 8'h7d, 8'h00};   // 106 j
      mem[107] = {8'h7f, 8'h10, 8'h28, 8'h44, 8'h00};   // 107 k
      mem[108] = {8'h00, 8'h41, 8'h7f, 8'h40, 8'h00};   // 108 l
      mem[109] = {8'h7c, 8'h04, 8'h18, 8'h04, 8'h78};   // 109 m
      mem[110] = {8'h7c, 8'h08, 8'h04, 8'h04, 8'h78};   // 110 n
      mem[111] = {8'h38, 8'h44, 8'h44, 8'h44, 8'h38};   // 111 o
      mem[112] = {8'hfc, 8'h24, 8'h24, 8'h24, 8'h18};   // 112 p
      mem[113] = {8'h18, 8'h24, 8'h24, 8'h18, 8'hfc};   // 113 q
      mem[114] = {8'h7c, 8'h08, 8'h04, 8'h04, 8'h08};   // 114 r
      mem[115] = {8'h48, 8'h54, 8'h54, 8'h54, 8'h20};   // 115 s
      mem[116] = {8'h04, 8'h3f, 8'h44, 8'h40, 8'h20};   // 116 t
      mem[117] = {8'h3c, 8'h40, 8'h40, 8'h20, 8'h7c};   // 117 u
      mem[118] = {8'h1c, 8'h20, 8'h40, 8'h20, 8'h1c};   // 118 v
      mem[119] = {8'h3c, 8'h40, 8'h30, 8'h40, 8'h3c};   // 119 w
      mem[120] = {8'h44, 8'h28, 8'h10, 8'h28, 8'h44};   // 120 x
      mem[121] = {8'h1c, 8'ha0, 8'ha0, 8'ha0, 8'h7c};   // 121 y
      mem[122] = {8'h44, 8'h64, 8'h54, 8'h4c, 8'h44};   // 122 z
    end
    //姹夊瓧锛氱‖绂惧鍫
  always@(posedge rst_n)
    begin
      mem_hanzi[  0] = {8'h04,8'h84,8'he4,8'h5c,8'h44,8'hc4,8'h00,8'hf2};   // 48  0
      mem_hanzi[  1] = {8'h92,8'h92,8'hfe,8'h92,8'h92,8'hf2,8'h02,8'h00};   // 49  1
      mem_hanzi[  8] = {8'h02,8'h01,8'h7f,8'h10,8'h10,8'h3f,8'h80,8'h8f};   // 50  2
      mem_hanzi[  9] = {8'h54,8'h24,8'h5f,8'h44,8'h84,8'h87,8'h80,8'h00};   // 51  3
      mem_hanzi[  2] = {8'h00,8'h40,8'h44,8'h44,8'h44,8'h44,8'hc4,8'hfc};   // 52  4
      mem_hanzi[  3] = {8'hc2,8'h42,8'h42,8'h43,8'h42,8'h40,8'h00,8'h00};   // 53  5
      mem_hanzi[  10] = {8'h20,8'h20,8'h10,8'h08,8'h04,8'h03,8'h00,8'hff};   // 54  6
      mem_hanzi[  11] = {8'h00,8'h03,8'h04,8'h08,8'h10,8'h20,8'h20,8'h00};   // 55  7
      mem_hanzi[  4] = {8'h40,8'h30,8'h11,8'h96,8'h90,8'h90,8'h91,8'h96};   // 56  8
      mem_hanzi[  5 ] = {8'h90,8'h90,8'h98,8'h14,8'h13,8'h50,8'h30,8'h00};   // 48  0
      mem_hanzi[  12] = {8'h04,8'h04,8'h04,8'h04,8'h04,8'h44,8'h84,8'h7e};   // 49  1
      mem_hanzi[  13] = {8'h06,8'h05,8'h04,8'h04,8'h04,8'h04,8'h04,8'h00};   // 50  2
      mem_hanzi[  6] = {8'h20,8'h18,8'h08,8'hea,8'h2c,8'h28,8'h28,8'h2f};   // 51  3
      mem_hanzi[  7] = {8'h28,8'h28,8'h2c,8'hea,8'h08,8'h28,8'h18,8'h00};   // 52  4
      mem_hanzi[  14] = {8'h40,8'h40,8'h48,8'h49,8'h49,8'h49,8'h49,8'h7f};   // 53  5
      mem_hanzi[  15] = {8'h49,8'h49,8'h49,8'h49,8'h48,8'h40,8'h40,8'h00};   // 54  6
      mem_hanzi[  16] ={8'h40,8'h30,8'hef,8'h24,8'h24,8'h00,8'hfe,8'h92};//閿娇娉2 3
      mem_hanzi[  17] ={8'h92,8'h92,8'hf2,8'h92,8'h92,8'h9e,8'h80,8'h00};
      mem_hanzi[  18] ={8'h40,8'h40,8'h40,8'h7c,8'h40,8'h40,8'h40,8'h7f};
      mem_hanzi[  19] ={8'h44,8'h44,8'h44,8'h44,8'h44,8'h40,8'h40,8'h00};
      mem_hanzi[  20] ={8'h10,8'h60,8'h02,8'h0c,8'hc0,8'h00,8'hf8,8'h88};
      mem_hanzi[  21] ={8'h88,8'h88,8'hff,8'h88,8'h88,8'ha8,8'h18,8'h00};
      mem_hanzi[  22] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  23] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};      
      mem_hanzi[  24] ={8'h01,8'h01,8'h7f,8'h21,8'h91,8'h60,8'h1f,8'h00};
      mem_hanzi[  25] ={8'hfc,8'h44,8'h47,8'h44,8'h44,8'hfc,8'h00,8'h00};
      mem_hanzi[  26] ={8'h00,8'h00,8'h7f,8'h40,8'h50,8'h48,8'h44,8'h43};
      mem_hanzi[  27] ={8'h44,8'h48,8'h50,8'h40,8'hff,8'h00,8'h00,8'h00};
      mem_hanzi[  28] ={8'h04,8'h04,8'h7c,8'h03,8'h80,8'h60,8'h1f,8'h80}; 
      mem_hanzi[  29] ={8'h43,8'h2c,8'h10,8'h28,8'h46,8'h81,8'h80,8'h00};/*娉,2*/
      mem_hanzi[  30] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  31] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  32] ={8'h00,8'h04,8'h84,8'h84,8'h84,8'h84,8'h84,8'h84};  //涓夎娉5
      mem_hanzi[  33] = {8'h84,8'h84,8'h84,8'h84,8'h84,8'h04,8'h00,8'h00};
      mem_hanzi[  34] ={8'h20,8'h10,8'he8,8'h24,8'h27,8'h24,8'h24,8'he4};
      mem_hanzi[  35] ={8'h24,8'h34,8'h2c,8'h20,8'he0,8'h00,8'h00,8'h00};
      mem_hanzi[  36] ={8'h10,8'h60,8'h02,8'h0c,8'hc0,8'h00,8'hf8,8'h88};
      mem_hanzi[  37] ={8'h88,8'h88,8'hff,8'h88,8'h88,8'ha8,8'h18,8'h00};
      mem_hanzi[  38] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  39] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};      
      mem_hanzi[  40] ={8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h20};
      mem_hanzi[  41] ={8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h00};
      mem_hanzi[  42] ={8'h80,8'h60,8'h1f,8'h09,8'h09,8'h09,8'h09,8'h7f};
      mem_hanzi[  43] ={8'h09,8'h09,8'h49,8'h89,8'h7f,8'h00,8'h00,8'h00};/*瑙,4*/
      mem_hanzi[  44] ={8'h04,8'h04,8'h7c,8'h03,8'h80,8'h60,8'h1f,8'h80};
      mem_hanzi[  45] ={8'h43,8'h2c,8'h10,8'h28,8'h46,8'h81,8'h80,8'h00};/*娉,5*/
      mem_hanzi[  46] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  47] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};      
      mem_hanzi[  48] ={8'h08,8'h08,8'h08,8'h08,8'h08,8'hf8,8'h89,8'h8e};
      mem_hanzi[  49] ={8'h88,8'h88,8'h88,8'h88,8'h08,8'h08,8'h08,8'h00};
      mem_hanzi[  50] ={8'h10,8'h60,8'h02,8'h0c,8'hc0,8'h00,8'hf8,8'h88}; 
      mem_hanzi[  51] ={8'h88,8'h88,8'hff,8'h88,8'h88,8'ha8,8'h18,8'h00};
      mem_hanzi[  52] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  53] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};  
      mem_hanzi[  54] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  55] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};            
      mem_hanzi[  56] ={8'h00,8'h80,8'h40,8'h20,8'h18,8'h07,8'h00,8'h00};
      mem_hanzi[  57] ={8'h40,8'h80,8'h40,8'h3f,8'h00,8'h00,8'h00,8'h00};/*鏂,6*/
      mem_hanzi[  58] ={8'h04,8'h04,8'h7c,8'h03,8'h80,8'h60,8'h1f,8'h80};
      mem_hanzi[  59] = {8'h43,8'h2c,8'h10,8'h28,8'h46,8'h81,8'h80,8'h00};/*娉,7*/
      mem_hanzi[  60] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  61] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};  
      mem_hanzi[  62] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  63] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  64] ={8'h00,8'h02,8'h02,8'hc2,8'h02,8'h02,8'h02,8'hfe};//姝e鸡娉89
      mem_hanzi[  65] ={8'h82,8'h82,8'h82,8'h82,8'h82,8'h02,8'h00,8'h00};
      mem_hanzi[  66] ={8'h02,8'he2,8'h22,8'h22,8'h3e,8'h00,8'h08,8'h88};
      mem_hanzi[  67] = {8'h48,8'h39,8'h0e,8'h08,8'hc8,8'h08,8'h08,8'h00};
      mem_hanzi[  68] ={8'h10,8'h60,8'h02,8'h0c,8'hc0,8'h00,8'hf8,8'h88}; 
      mem_hanzi[  69] ={8'h88,8'h88,8'hff,8'h88,8'h88,8'ha8,8'h18,8'h00};
      mem_hanzi[  70] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  71] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};      
      mem_hanzi[  72] ={8'h40,8'h40,8'h40,8'h7f,8'h40,8'h40,8'h40,8'h7f};
      mem_hanzi[  73] ={8'h40,8'h40,8'h40,8'h40,8'h40,8'h40,8'h40,8'h00};/*姝,8*/
      mem_hanzi[  74] ={8'h00,8'h43,8'h82,8'h42,8'h3e,8'h00,8'h21,8'h71};
      mem_hanzi[  75] ={8'h29,8'h25,8'h23,8'h21,8'h28,8'h70,8'h00,8'h00};/*寮,9*/
      mem_hanzi[  76] ={8'h04,8'h04,8'h7c,8'h03,8'h80,8'h60,8'h1f,8'h80};
      mem_hanzi[  77] ={8'h43,8'h2c,8'h10,8'h28,8'h46,8'h81,8'h80,8'h00};/*娉,10*/
      mem_hanzi[  78] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};
      mem_hanzi[  79] ={8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00,8'h00};      
    end
endmodule
关于这个板卡的功能介绍如下:


电缆线路用电要求分析
汽车芯片依旧热门,各大芯片原厂/代工厂都准备了什么
自动驾驶功能模块有哪些
AMD旗舰Ryzen 7 1800X大幅降价:性价比彻底无敌!
魏少军:集成电路企业招人难 已超过10万人才缺口
如何去制作一套完整的基于FPGA的DDS信号发生器系统
FPGA视频教程:SF-EP1C开发板介绍
声纹识别相比于其他生物识别技术,有着什么优势?
微软:核心业务流逝
大量出售智能手机并招代理商
三星、美光3D-NAND Flash产出比重已逾50%
怎样利用区块链重新思考物联网安全
扩大内需三四级家电市场未来几年仍将获持续增长
【年度盘点】让小编带你看懂2016科技大事件
云知声助力华侨大学,全球首个AI智慧中文学习平台发布
从“制造”迈向“智造” 制造企业的信息安全挑战
rainysky陪你一起在zedboard上移植qt+opencv(一):搭建ubuntu系统
iPhone8什么时候上市:信苹果,得永生!iPhone8或将用“意念开机”?
冷王公司卡车混合制冷系统,环保可节约运输成本
蒸汽管道上为什么常常要弯一段?