搜索
bottom↓
回复: 28

第一次发帖----高叫射Xilinx杯 山东B题 基于FPGA的数字存储示波器 源代码

[复制链接]

出0入0汤圆

发表于 2010-11-13 23:20:06 | 显示全部楼层 |阅读模式
今年暑假做的,嵌了MicroBlaze软核,全部的代码,Verilog和C
因为以前仿过魏昆同学,所以轻松拿省一了、、、、、、、、
感谢万能的坛子。
/////////////////////////////////////////////////////////////////////By Ljt


////////////////////////////////////top moudle main_ctrl.v

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:        SDU
// Engineer:       Ljt
// Create Date:    20:08:59 08/28/2010
// Module Name:    top_moudule
// Project Name:   MPU_VGA
//////////////////////////////////////////////////////////////////////////////////
module vga_top_moudule(
                clk,
                //VGA的IO
                h_sync,v_sync,red,green,blue,
                //MicroBlaze核用IO
                fpga_0_Micron_RAM_Mem_A_pin,fpga_0_Micron_RAM_Mem_CEN_pin,,fpga_0_Micron_RAM_Mem_OEN_pin,
                fpga_0_Micron_RAM_Mem_WEN_pin,fpga_0_Micron_RAM_Mem_BEN_pin,fpga_0_Micron_RAM_Mem_DQ_pin,
                fpga_0_rst_1_sys_rst_pin,
                //外设
                fpga_0_LEDs_8Bit_GPIO_IO_O_pin,
                fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin,
                fpga_0_Switches_8Bit_GPIO_IO_I_pin,
                fpga_0_RS232_PORT_RX_pin,
                fpga_0_RS232_PORT_TX_pin,
                //键盘
                ps2k_clk,ps2k_data,
                //AD
                max1242_sclk,max1241_cs,max1241_data,sam_clk_out,ad_data,
                //EEP//继电器
                gpio_5,JiDaQ,
                //数字输入,数字输出
                digt_in,digt_a,digt_b
                                );

input clk;//50MHz

//VGA
output h_sync,v_sync;
output [2:0]red;
output [2:0]green;
output [2:0]blue;
//数字输出
output digt_a;
output reg digt_b;



//AD
output max1242_sclk,max1241_cs;
input max1241_data;
//EEP
inout [1:0]gpio_5;

//键盘
input ps2k_clk;
input ps2k_data;
       
//IP外设
output [7:0] fpga_0_LEDs_8Bit_GPIO_IO_O_pin;
input [7:0] fpga_0_Switches_8Bit_GPIO_IO_I_pin;
input [3:0] fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin;
input fpga_0_RS232_PORT_RX_pin;
output fpga_0_RS232_PORT_TX_pin;

output [3:0] JiDaQ;
input [1:0] digt_in;

//CPU的RAM引脚       
output         [31:13]fpga_0_Micron_RAM_Mem_A_pin;
output        fpga_0_Micron_RAM_Mem_CEN_pin;
output        fpga_0_Micron_RAM_Mem_OEN_pin;
output        fpga_0_Micron_RAM_Mem_WEN_pin;
output        [1:0]fpga_0_Micron_RAM_Mem_BEN_pin;
inout        [15:0]fpga_0_Micron_RAM_Mem_DQ_pin;
input fpga_0_rst_1_sys_rst_pin;       
//模块之间的互联信号
wire clkb;
wire [11:0] addrb;
wire [31:0] doutb;
wire [12 : 0] addra;
wire [31 : 0] dina;       
wire mainclk;
wire clk100M;
wire wea=1;
wire keyclr=1;
wire [31:0]xps_gpio_2_GPIO_IO_I_pin;
wire [31:0]xps_gpio_3_GPIO_IO_I_pin;
wire rst_n=fpga_0_rst_1_sys_rst_pin;
wire [7:0]ps2_byte;
wire ps2_state;
wire [31:0] gpio4;       
wire [29:0] iobuf;
wire [23:0] b_doutb;
wire [8:0]markline;
//寄存器变量
//连续性赋值
assign clka=clk100M;
assign xps_gpio_2_GPIO_IO_I_pin[8]=ps2_state;
assign xps_gpio_2_GPIO_IO_I_pin[7:0]=ps2_byte[7:0];
assign xps_gpio_2_GPIO_IO_I_pin[31:9]=0;

assign iobuf=gpio4[31:27];//6位
assign markline=gpio4[10:2];
//assign xps_gpio_3_GPIO_IO_I_pin[16]=max1241_data;//接到了gpio3上
assign max1241_cs=gpio4[1];
assign max1242_sclk=gpio4[0];


wire sam_start,sam_done;

wire [10:0] ad_addra;
//AD IO
output sam_clk_out;
input [9:0]ad_data;


wire sam_clk;

wire [11:0] ad_doutb;//MCU,in
wire [10:0]ad_addrb;//MCU use,o
wire [2:0] clkdivid;//MCU ,o
assign ad_addrb[10:0]=gpio4[21:11];
assign sam_start=gpio4[22];
assign clkdivid[2:0]=gpio4[25:23];
assign  xps_gpio_3_GPIO_IO_I_pin[11:0]=ad_doutb[11:0];
assign  xps_gpio_3_GPIO_IO_I_pin[22:12]=ad_addra[10:0];



         wire trig_1sa;//CPU给出,置1单次触发状态
         wire trig_now;//Comp模块给出
         
assign trig_1sa=gpio4[26];//6位
////////////////////////////////////////////////////例化各个模块

wire [8:0]addrb_b;
wire b_wave_clk;
vga vgadrv (
    .mainclk(mainclk),
    .h_sync(h_sync),
    .v_sync(v_sync),
    .red(red),
    .green(green),
    .blue(blue),
    .clkb(clkb),
    .addrb(addrb),
    .doutb(doutb),
         .b_doutb(b_doutb),
         .markline(markline),
         .addrb_b(addrb_b),
         .clk(b_wave_clk)
    );

reg [11:0]r_addra;        reg [8:0]b_addra;       
reg [31:0]r_dina;        reg [23:0]b_dina;       


b_GRam_wave b_GRam_wave (
        .clka(clka),
        .wea(wea), // Bus [0 : 0]
        .addra(b_addra), // Bus [8 : 0]
        .dina(b_dina), // Bus [7 : 0]
        .clkb(b_wave_clk),
        .addrb(addrb_b), // Bus [8 : 0]
        .doutb(b_doutb)); // Bus [7 : 0]
               
GRam GRam (
        .clka(clka),
        .wea(wea),
        .addra(r_addra),  
        .dina(r_dina),
        .clkb(clkb),
        .addrb(addrb),
        .doutb(doutb)
        );
       

       
       
       
always@(posedge clk100M)
begin  
  if(addra[12]) begin b_addra<=addra[8:0];   b_dina<=dina[23:0]; end
  else begin r_addra<=addra[11:0];   r_dina<=dina; end

end         

wire [3:0]gpio6;
reg [31:0]per_reg;
MicroBlaze MicroBlaze (
        .fpga_0_LEDs_8Bit_GPIO_IO_O_pin(fpga_0_LEDs_8Bit_GPIO_IO_O_pin),
        .fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin(fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin),
        .fpga_0_Switches_8Bit_GPIO_IO_I_pin(fpga_0_Switches_8Bit_GPIO_IO_I_pin),
        .fpga_0_RS232_PORT_RX_pin(fpga_0_RS232_PORT_RX_pin),
        .fpga_0_RS232_PORT_TX_pin(fpga_0_RS232_PORT_TX_pin),

        .fpga_0_Micron_RAM_Mem_A_pin(fpga_0_Micron_RAM_Mem_A_pin),
        .fpga_0_Micron_RAM_Mem_CEN_pin(fpga_0_Micron_RAM_Mem_CEN_pin),
        .fpga_0_Micron_RAM_Mem_OEN_pin(fpga_0_Micron_RAM_Mem_OEN_pin),
        .fpga_0_Micron_RAM_Mem_WEN_pin(fpga_0_Micron_RAM_Mem_WEN_pin),
        .fpga_0_Micron_RAM_Mem_BEN_pin(fpga_0_Micron_RAM_Mem_BEN_pin),
        .fpga_0_Micron_RAM_Mem_DQ_pin(fpga_0_Micron_RAM_Mem_DQ_pin),
        .fpga_0_clk_1_sys_clk_pin(clk100M),
        .fpga_0_rst_1_sys_rst_pin(fpga_0_rst_1_sys_rst_pin),
        .xps_gpio_0_GPIO_IO_O_pin(dina),
        .xps_gpio_1_GPIO_IO_O_pin(addra),
        .xps_gpio_2_GPIO_IO_I_pin(xps_gpio_2_GPIO_IO_I_pin),
        .xps_gpio_3_GPIO_IO_I_pin(xps_gpio_3_GPIO_IO_I_pin),
        .xps_gpio_4_GPIO_IO_O_pin(gpio4),
        .xps_gpio_5_GPIO_IO(gpio_5),
        .JiDaQ_GPIO_IO_O_pin(JiDaQ),
        .xps_gpio_digt_ctrl_GPIO_IO_O_pin(gpio6),
        .xps_gpio_freq_GPIO_IO_I_pin(per_reg)
        );
       
MCU_OutputCantain McuIObuf (
    .ioblock(iobuf),
    .mainclk(mainclk)
    );

ClockManger DPLL (
    .CLKIN_IN(clk),
    .CLKIN_IBUFG_OUT(CLK0_OUT),
    .CLK0_OUT(mainclk),
    .CLK2X_OUT(clk100M)
    );

ps2scan        ps2scan(        .clk(mainclk),                                  //按键扫描模块
                .rst_n(rst_n),                               
                .ps2k_clk(ps2k_clk),
                .ps2k_data(ps2k_data),
                .ps2_byte(ps2_byte),
                .ps2_state(ps2_state)
                );

wire [11:0]ad_data_10bit;


reg [11:0] ad_data_reg;

always@(posedge sam_clk)
ad_data_reg<=ad_data_10bit;

assign ad_data_10bit[11:2]=ad_data[9:0];

assign ad_data_10bit[1:0]=digt_in[1:0];

AD_Cache AD_Cache (
        .clka(sam_clk),
        .wea(wea), // 1
        .addra(ad_addra), //
        .dina(ad_data_reg), //ad输入
        .clkb(clk100M),
        .addrb(ad_addrb), // Bus [10 : 0]
        .doutb(ad_doutb)); // Bus [7 : 0]
       


AD_Sample_Ctrl Sample_Ctrl (
    .clk100M(clk100M),
    .sam_startin(sam_start),
    .clkdivid(clkdivid),
    .sam_clk(sam_clk),         
    .ad_addra(ad_addra),
         .trig_now(trig_now),
         .sam_clk_out(sam_clk_out)
    );

Comp_trig Comp_trig (
    .sam_clk(sam_clk),
    .clk100M(clk100M),
    .trig_1sa(trig_1sa),
    .trig_now(trig_now),
    .ad_data_reg(ad_data_reg)
    );
         
         
         reg digt_a0;

         reg [31:0]per_cnt;
    reg digt_freq;
         reg digt_a;

    reg [15:0] data_cnt;
    reg [15:0] c_data_cnt;
         
always@(posedge clk100M)//频率设置
begin  
case(gpio6)
    4'h1:data_cnt=16'd500; //100K
    4'h2:data_cnt=16'd250;  //200K
    4'h3:data_cnt=16'd167;  //300K   500/3
    4'h4:data_cnt=16'd125;   //400K   500/4
    4'h5:data_cnt=16'd100;   //500K   
    4'h6:data_cnt=16'd83;   //600K   
    4'h7:data_cnt=16'd71;    //700K
    4'h8:data_cnt=16'd63;    //800K
    4'h9:data_cnt=16'd56;    //900K
    4'h10:data_cnt=16'd50;    //1M
    default:data_cnt=16'd100;    //100K
  endcase
  
          if(c_data_cnt==data_cnt)
          begin
          c_data_cnt<=1;
          digt_freq<=~digt_freq;
          end
          else
          c_data_cnt<=c_data_cnt+1;
end  


always@(posedge clk100M)//频率设置
begin
if(gpio6==0)
digt_a<=ad_data>480;
else
digt_a<=digt_freq;
end


always  @(posedge clk100M)
begin
digt_a0<=digt_a;
end         
         
always  @(posedge clk100M)
begin
if(digt_a==1&digt_a0==0)//检测到digta上升
begin
per_reg<=per_cnt;//记录周期
per_cnt<=0;
end
else
per_cnt<=per_cnt+1;
end

always  @(posedge clk100M)
begin
if(per_cnt>per_reg/8&&per_cnt<per_reg/8+per_reg/8+per_reg/8)//在1/8到3/8周期之间,b为1
digt_b<=1;
else
digt_b<=0;
end

endmodule




//////////////////////////////vga.v
//功能:将GRAM数据送至VGA,32bit*10 X 240.bit置位为红色。
module vga(mainclk,h_sync,v_sync,red,green,blue,clkb,addrb,doutb,b_doutb,markline,addrb_b,clk);

   input mainclk;    //主时钟,50MHz
        input [8:0] markline;
// base vga io define       
   output h_sync,v_sync;
   output [2:0]red;
   output [2:0]green;
   output [2:0]blue;
// DualPORT Ram        
        output clkb;
        output [11:0] addrb;
        input [31:0] doutb;
        input [23:0] b_doutb;
       
//reg define
   reg h_sync,v_sync;
   reg [2:0]red;
   reg [2:0]green;
   reg [2:0]blue;
       
        reg clkb;
        reg [11:0] addrb;       
   reg[9:0] h_conter;  
   reg[9:0] v_conter;
   wire h_max=(h_conter==794);
   wire v_max=(v_conter==528);
       
////////////////////////////////////////////////////

reg [2:0]maindivd;//对50M时钟进行分频,产生25MHZ的像素时钟
output reg clk;
always@(posedge mainclk)
   if(maindivd==1)
begin
      maindivd<=0;
                clk<=1;
                end
   else
        begin
      maindivd<=maindivd+1;clk<=0;
end


always@(posedge clk)
        if(h_max)
                h_conter<=0;
        else
                h_conter<=h_conter+1;

always@(posedge clk)   //every clk do v_conter+1
        if(v_max)
                v_conter<=0;
        else if(h_max)
                v_conter<=v_conter+1;

always@(posedge clk)  
        begin
                  h_sync<= ( h_conter<=700);//行同步脉冲
                  v_sync<= ( v_conter<=526) ;//场同步
        end

reg clk_haf;//水平分辨率减半
reg [4:0] ram_bit_cnt;
reg [4:0] h_ram_cnt;

always@(posedge clk)
begin
  if(h_conter==51)
         clk_haf<=0;
         else
    clk_haf<=~clk_haf;
end

reg vlflag;//竖直分辨率减半

reg h_lg;
always@(posedge clk) //32bit操作的位计数器
        begin
         if(h_conter==52&clk_haf)
         ram_bit_cnt<=0;

         else if(ram_bit_cnt==31&clk_haf)///////1
          ram_bit_cnt<=0;
         else if(h_conter>52&h_conter<692&clk_haf)
          ram_bit_cnt<=ram_bit_cnt+1;
        end


always@(posedge clk) //行标志,用来隔行重复一行
        begin
         if(h_conter==52)
                        vlflag<=~vlflag;
        end
       
always@(posedge clk)//读取RAM控制
        begin
        if(v_conter==32&&(h_conter==53))//场开始时候清零
                begin
                addrb<=1;
                end
        else if(vlflag==1&&h_conter==50)
                addrb<=addrb-10;                          //隔行重复一行
        else if(ram_bit_cnt==30&&h_conter>52&clk_haf)
                addrb<=addrb+1;

        if(ram_bit_cnt==31)
                clkb<=1;
        else   
                clkb<=0;
        end



output reg [8:0]addrb_b;
reg [8:0]  x2_doutb;reg [8:0]  x2_doutb0;reg [8:0]  x2_doutb1;
reg [8:0]  gx2_doutb;reg [8:0]  gx2_doutb0;reg [8:0]  gx2_doutb1;
reg [8:0]  rx2_doutb;reg [8:0]  rx2_doutb0;reg [8:0]  rx2_doutb1;

reg [8:0]avg_rx2_doutb;
always@(posedge clk)//读取b_RAM控制
begin
addrb_b[8:0]<=(h_conter-48)/2;

x2_doutb[8:1]<=b_doutb[7:0]+15;
x2_doutb0<=x2_doutb;
x2_doutb1<=x2_doutb0;

rx2_doutb[8:1]<=b_doutb[15:8]+15;
rx2_doutb0<=rx2_doutb;
rx2_doutb1<=rx2_doutb0;

gx2_doutb[8:1]<=b_doutb[23:16]+15;
gx2_doutb0<=gx2_doutb;
gx2_doutb1<=gx2_doutb0;

if(h_conter[0]==0)
avg_rx2_doutb<=(rx2_doutb0+rx2_doutb)/2;
else
avg_rx2_doutb<=rx2_doutb;
end

reg blue_flag,red_flag,gren_flag;

always@(posedge clk)//在这里将线加粗
begin
blue_flag<=(x2_doutb>=v_conter-1&x2_doutb0<=v_conter)|(x2_doutb<=v_conter&x2_doutb0>=v_conter-1);
gren_flag<=(gx2_doutb>=v_conter-1&gx2_doutb0<=v_conter)|(gx2_doutb<=v_conter&gx2_doutb0>=v_conter-1);
red_flag<=(rx2_doutb>=v_conter-1&avg_rx2_doutb<=v_conter)|(rx2_doutb<=v_conter&avg_rx2_doutb>=v_conter-1);
end

always@(posedge clk)
   if( (h_conter<55)|(h_conter>690)|(v_conter<30)|(v_conter>516))//分辨率640X480. 从53-692:640 * 30-519:480
      begin
        red<=0;
        green<=0;
        blue<=0;
      end
        else if(h_conter%2==0&&v_conter==markline+31)
      begin
        red<=0;
        green<=0;
        blue<=0;
      end       
else
    begin
       
         if(red_flag) //红
           begin           
                          red<=7;
           green<=0;
           blue<=0;
           end       
                        else  if(blue_flag)  //蓝
           begin
           red<=0;
           green<=0;
           blue<=7;
           end         
                        else if(gren_flag) //绿
           begin
           red<=0;
           green<=0;
           blue<=0;
           end
         else if(doutb[31-ram_bit_cnt])//黑
                          begin
           red<=0;
           green<=0;
           blue<=0;
           end
                        //画网格
                        else if(((v_conter==453|v_conter==393|v_conter==333|v_conter==213|v_conter==153|v_conter==93))|((h_conter==115|h_conter==179|h_conter==243|h_conter==307|h_conter==435|h_conter==499|h_conter==563|h_conter==627)))//画网格
                          begin
                                  red<=5;
                                  green<=5;
                                  blue<=5;
                                end
                        else if((h_conter%8 !=0&&v_conter==273)|(v_conter%8 !=0&&h_conter==371))
                                begin
                                  red<=3;
                                  green<=3;
                                  blue<=3;
                                end                          
                        else  //白
                                begin
                                red<=7;
                                green<=7;
                                blue<=7;
                                end
      end
endmodule



//////////////////////////////////////////////////key.v
//PS2 keyboard
`timescale 1ns / 1ps

module ps2scan(clk,rst_n,ps2k_clk,ps2k_data,ps2_byte,ps2_state);

input clk;        //50M时钟信号
input rst_n;        //复位信号
input ps2k_clk;        //PS2接口时钟信号
input ps2k_data;        //PS2接口数据信号
output[7:0] ps2_byte;        // 1byte键值,只做简单的按键扫描
output ps2_state;                //键盘当前状态,ps2_state=1表示有键被按下

//------------------------------------------
reg ps2k_clk_r0,ps2k_clk_r1,ps2k_clk_r2;        //ps2k_clk状态寄存器

//wire pos_ps2k_clk;         // ps2k_clk上升沿标志位
wire neg_ps2k_clk;        // ps2k_clk下降沿标志位

always @ (posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                        ps2k_clk_r0 <= 1'b0;
                        ps2k_clk_r1 <= 1'b0;
                        ps2k_clk_r2 <= 1'b0;
                end
        else begin                                                                //锁存状态,进行滤波
                        ps2k_clk_r0 <= ps2k_clk;
                        ps2k_clk_r1 <= ps2k_clk_r0;
                        ps2k_clk_r2 <= ps2k_clk_r1;
                end
end

assign neg_ps2k_clk = ~ps2k_clk_r1 & ps2k_clk_r2;        //下降沿

//------------------------------------------
reg[7:0] ps2_byte_r;                //PC接收来自PS2的一个字节数据存储器
reg[7:0] temp_data;        //当前接收数据寄存器
reg[3:0] num;        //计数寄存器

always @ (posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                        num <= 4'd0;
                        temp_data <= 8'd0;
                end
        else if(neg_ps2k_clk) begin        //检测到ps2k_clk的下降沿
                        case (num)
                                4'd0:        num <= num+1'b1;
                                4'd1:        begin
                                                        num <= num+1'b1;
                                                        temp_data[0] <= ps2k_data;        //bit0
                                                end
                                4'd2:        begin
                                                        num <= num+1'b1;
                                                        temp_data[1] <= ps2k_data;        //bit1
                                                end
                                4'd3:        begin
                                                        num <= num+1'b1;
                                                        temp_data[2] <= ps2k_data;        //bit2
                                                end
                                4'd4:        begin
                                                        num <= num+1'b1;
                                                        temp_data[3] <= ps2k_data;        //bit3
                                                end
                                4'd5:        begin
                                                        num <= num+1'b1;
                                                        temp_data[4] <= ps2k_data;        //bit4
                                                end
                                4'd6:        begin
                                                        num <= num+1'b1;
                                                        temp_data[5] <= ps2k_data;        //bit5
                                                end
                                4'd7:        begin
                                                        num <= num+1'b1;
                                                        temp_data[6] <= ps2k_data;        //bit6
                                                end
                                4'd8:        begin
                                                        num <= num+1'b1;
                                                        temp_data[7] <= ps2k_data;        //bit7
                                                end
                                4'd9:        begin
                                                        num <= num+1'b1;        //奇偶校验位,不做处理
                                                end
                                4'd10: begin
                                                        num <= 4'd0;        // num清零
                                                end
                                default: ;
                                endcase
                end       
end

reg key_f0;                //松键标志位,置1表示接收到数据8'hf0,再接收到下一个数据后清零
reg ps2_state_r;        //键盘当前状态,ps2_state_r=1表示有键被按下

always @ (posedge neg_ps2k_clk or negedge rst_n) begin        //接收数据的相应处理,这里只对1byte的键值进行处理
        if(!rst_n) begin
                        key_f0 <= 1'b0;
                        ps2_state_r <= 1'b0;
                end
        else if(num==4'd10) begin        //刚传送完一个字节数据
                        if(temp_data == 8'hf0) begin key_f0 <= 1'b1;ps2_state_r <= 1'b0; ps2_byte_r <= 0;end
                        else begin
                                        if(!key_f0) begin        //说明有键按下
                                                        ps2_state_r <= 1'b1;
                                                        ps2_byte_r <= temp_data;        //锁存当前键值
                                                end
                                        else begin
                                                        ps2_state_r <= 1'b0;
                                                        key_f0 <= 1'b0;
                                                        ps2_byte_r <= 0;
                                                end
                                end
                end
end

reg[7:0] ps2_asci;        //接收数据的相应ASCII码

always @ (ps2_byte_r) begin
        case (ps2_byte_r)                //键值转换为ASCII码,这里做的比较简单,只处理字母(小写)
       
                8'h15: ps2_asci <= 8'h51;        //Q
                8'h1d: ps2_asci <= 8'h57;        //W
                8'h24: ps2_asci <= 8'h45;        //E
                8'h2d: ps2_asci <= 8'h52;        //R
                8'h2c: ps2_asci <= 8'h54;        //T
                8'h35: ps2_asci <= 8'h59;        //Y
                8'h3c: ps2_asci <= 8'h55;        //U
                8'h43: ps2_asci <= 8'h49;        //I
                8'h44: ps2_asci <= 8'h4f;        //O
                8'h4d: ps2_asci <= 8'h50;        //P                                         
                8'h1c: ps2_asci <= 8'h41;        //A
                8'h1b: ps2_asci <= 8'h53;        //S
                8'h23: ps2_asci <= 8'h44;        //D
                8'h2b: ps2_asci <= 8'h46;        //F
                8'h34: ps2_asci <= 8'h47;        //G
                8'h33: ps2_asci <= 8'h48;        //H
                8'h3b: ps2_asci <= 8'h4a;        //J
                8'h42: ps2_asci <= 8'h4b;        //K
                8'h4b: ps2_asci <= 8'h4c;        //L
                8'h1z: ps2_asci <= 8'h5a;        //Z
                8'h22: ps2_asci <= 8'h58;        //X
                8'h21: ps2_asci <= 8'h43;        //C
                8'h2a: ps2_asci <= 8'h56;        //V
                8'h32: ps2_asci <= 8'h42;        //B
                8'h31: ps2_asci <= 8'h4e;        //N
                8'h3a: ps2_asci <= 8'h4d;        //M

               
               
                8'h75: ps2_asci <= 8'h57;        //UP-W
                8'h74: ps2_asci <= 8'h44;        //R-D
                8'h6b: ps2_asci <= 8'h41;        //L-A
                8'h72: ps2_asci <= 8'h53;        //Down-S
               
                8'h16: ps2_asci <= 49;        //1
                8'h1e: ps2_asci <= 50;        //2
                8'h26: ps2_asci <= 51;        //3
                8'h25: ps2_asci <= 52;        //4
                8'h2e: ps2_asci <= 53;        //5
                8'h36: ps2_asci <= 54;        //6
                8'h3d: ps2_asci <= 55;        //7
                8'h3e: ps2_asci <= 56;        //8
                8'h46: ps2_asci <= 57;        //9
                8'h45: ps2_asci <= 48;        //0
               
                8'h76: ps2_asci <= 8'hff;        //ESC
                8'h29: ps2_asci <=32;        //' '
                default: ps2_asci <= 8'h00;        //0;
                 
                endcase
end

assign ps2_byte = ps2_asci;       
assign ps2_state = ps2_state_r;

endmodule




////////////////////////////////////////////////AD_sample_Ctrl
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
//拉高再拉低sam_start开始1次转换,转换完成后addra为1600,作为标志
//////////////////////////////////////////////////////////////////////////////////
module AD_Sample_Ctrl(clk100M,sam_startin,clkdivid,sam_clk,ad_addra,trig_now,sam_clk_out);
input clk100M,sam_startin,trig_now;
input [2:0] clkdivid;
output reg sam_clk;
output reg [10:0] ad_addra;
reg [24:0] count;
reg [24:0] data;

wire sam_start;
assign sam_start=trig_now|sam_startin;//


always@(clk100M)//频率设置
begin  
case(clkdivid)
    3'h1:data=25'd2; //32M(33.3M) 刻度应是2us,软件拉成1us
    3'h2:data=25'd15;  //3.125M
    3'h3:data=25'd155;  //322.58K
    3'h4:data=25'd1562;   //32.01K    刻度1ms
    3'h5:data=25'd15624;   //3.2K
    3'h6:data=25'd156249;   //320Hz      
    3'h7:data=25'd1562499;    //32Hz(33.3Hz)    1s
    default:data=25'd0;    //50M
  endcase
end  


reg sam_clk_32K;

output reg sam_clk_out;

always@(posedge clk100M)
begin
        if(clkdivid==6|clkdivid==7)
        sam_clk_out<=sam_clk_32K;
        else
        sam_clk_out<=sam_clk;
end

always @(posedge clk100M)
begin
if(count==data)
begin
sam_clk<=~sam_clk;
count<=0;
end
else
begin
count<=count+1;
end

if(count%12'd2048==0)//有问题
sam_clk_32K<=~sam_clk_32K;

end




reg sam_start0;
reg [10:0] sam_delay;
reg sam_stop;

always @ (posedge sam_clk)
begin                       
sam_start0 <= sam_start;
end


always@(posedge sam_clk)
begin
if(sam_start==1&sam_start0==0) //拉高了sam_start
begin sam_delay<=0;sam_stop<=1;end

else if(sam_start==0&sam_start0==1&sam_delay==639) //拉低了sam_start
begin sam_delay<=0;sam_stop<=0;end

else if (sam_delay!=639&sam_stop==1)
  sam_delay<=sam_delay+1;
end


always@(posedge sam_clk) //模拟,给AD
begin
if(ad_addra==1279)
ad_addra<=0;
else if(sam_delay!=639)
ad_addra<=ad_addra+1;
end

endmodule


////////////////////////////////////////////////Comp_trig.v
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:    20:45:18 09/20/2010
// Design Name:
// Module Name:    Comp_trig
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module Comp_trig(sam_clk,clk100M,trig_1sa,trig_now,ad_data_reg);

input [11:0]ad_data_reg;//模拟部分数据,用来比较
input trig_1sa;//单次触发状态标志,CPU拉高等待触发,触发之后保持输出为高。读完数据后CPU拉低,此时输出也拉低
output reg trig_now;
input sam_clk,clk100M;
wire [9:0]ad_anlog;

assign ad_anlog[9:0]=ad_data_reg[11:2];

reg trig_flag;

always@(posedge sam_clk)
begin
if(ad_anlog>10'd511)
trig_flag<=1;
else
trig_flag<=0;
end

reg r_trig_1sa,r_trig_flag;

always@(posedge sam_clk)
begin
//r_trig_1sa<=trig_1sa;//锁存1个时钟
r_trig_flag<=trig_flag;
end

always@(sam_clk)
begin
if(trig_flag !=r_trig_flag &&trig_1sa) //翻转,触发
trig_now<=1;
else if(trig_1sa==0)//拉低了,结束单次触发状态
trig_now<=0;
end

endmodule



/////////////////////////////////Led_Seg
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date:    11:09:24 09/01/2010
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity clk7seg is
    Port ( x : in  STD_LOGIC_VECTOR (15 downto 0);
           clk : in  STD_LOGIC;                               --50MHz
           clr : in  STD_LOGIC;
           a_to_g : out  STD_LOGIC_VECTOR (6 downto 0);
           an : out  STD_LOGIC_VECTOR (3 downto 0);
           dp : out  STD_LOGIC);
end clk7seg;
architecture Behavioral of clk7seg is
signal s : std_logic_vector (1 downto 0);
signal digit : std_logic_vector (3 downto 0);
signal clkdiv : std_logic_vector (20 downto 0);
signal aen : std_logic_vector (3 downto 0) := "1111";
begin
    dp <= '1';
   s <= clkdiv(20 downto 19);                 --片选      
  process(clr)
  begin
        if(clr='1') then
        clkdiv <= (others => '0');
    elsif(rising_edge(clk)) then
       clkdiv <= clkdiv + 1;
   end if;
  end process;
  process(aen,s)
  begin
           an <= "0000";
    if(aen(conv_integer(s))='1') then
            an(conv_integer(s)) <= '1';          --an(n)为 1 则片选第 n 个数码管
     end if;
end process;
process(s)
     begin
     case s is
            when "00" => digit <= x(3 downto 0);
                                when "01" => digit <= x(7 downto 4);
        when "10" => digit <= x(11 downto 8);
        when others => digit <= x(15 downto 12);    --4 个数码管轮流显示,有延时
    end case;
end process;
process(digit)
      begin
     case digit is
     when x"0" => a_to_g <= "1111110";--"0000001";
     when x"1" => a_to_g <= "0110000";--"1001111";
     when x"2" => a_to_g <= "1101101";--"0010010";
     when x"3" => a_to_g <= "1111001";--"0000110";
     when x"4" => a_to_g <= "0110011";--"1001100";
     when x"5" => a_to_g <= "1011011";--"0100100";
     when x"6" => a_to_g <= "1011111";--"0100000";
     when x"7" => a_to_g <= "1110000";--"0001111";
     when x"8" => a_to_g <= "1111111";--"0000000";
     when x"9" => a_to_g <= "1111011";--"0000100";
     when x"A" => a_to_g <= "1110111";--"0001000";
     when x"B" => a_to_g <= "0011111";--"1100000";
     when x"C" => a_to_g <= "1001110";--"0110001";
     when x"D" => a_to_g <= "0111101";--"1000010";
     when x"E" => a_to_g <= "1001111";--"0110000";
     when others => a_to_g <= "1000111";--"0111000";
    end case;
end process;
end Behavioral;


///////////////////////////////////////////ClockManger.v
////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 1995-2009 Xilinx, Inc.  All rights reserved.
////////////////////////////////////////////////////////////////////////////////
//
//Command: xaw2verilog -intstyle I:/MPU_VGA_WithANSICode/ipcore_dir/ClockManger.xaw -st ClockManger.v
//Design Name: ClockManger
//Device: xc3s500e-4pq208
// Written for synthesis tool: XST
`timescale 1ns / 1ps

module ClockManger(CLKIN_IN,
                   CLKIN_IBUFG_OUT,
                   CLK0_OUT,
                   CLK2X_OUT);

    input CLKIN_IN;
   output CLKIN_IBUFG_OUT;
   output CLK0_OUT;
   output CLK2X_OUT;
   
   wire CLKFB_IN;
   wire CLKIN_IBUFG;
   wire CLK0_BUF;
   wire CLK2X_BUF;
   wire GND_BIT;
   
   assign GND_BIT = 0;
   assign CLKIN_IBUFG_OUT = CLKIN_IBUFG;
   assign CLK0_OUT = CLKFB_IN;
   IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN),
                           .O(CLKIN_IBUFG));
   BUFG CLK0_BUFG_INST (.I(CLK0_BUF),
                        .O(CLKFB_IN));
   BUFG CLK2X_BUFG_INST (.I(CLK2X_BUF),
                         .O(CLK2X_OUT));
   DCM_SP DCM_SP_INST (.CLKFB(CLKFB_IN),
                       .CLKIN(CLKIN_IBUFG),
                       .DSSEN(GND_BIT),
                       .PSCLK(GND_BIT),
                       .PSEN(GND_BIT),
                       .PSINCDEC(GND_BIT),
                       .RST(GND_BIT),
                       .CLKDV(),
                       .CLKFX(),
                       .CLKFX180(),
                       .CLK0(CLK0_BUF),
                       .CLK2X(CLK2X_BUF),
                       .CLK2X180(),
                       .CLK90(),
                       .CLK180(),
                       .CLK270(),
                       .LOCKED(),
                       .PSDONE(),
                       .STATUS());
   defparam DCM_SP_INST.CLK_FEEDBACK = "1X";
   defparam DCM_SP_INST.CLKDV_DIVIDE = 2.0;
   defparam DCM_SP_INST.CLKFX_DIVIDE = 1;
   defparam DCM_SP_INST.CLKFX_MULTIPLY = 4;
   defparam DCM_SP_INST.CLKIN_DIVIDE_BY_2 = "FALSE";
   defparam DCM_SP_INST.CLKIN_PERIOD = 20.000;
   defparam DCM_SP_INST.CLKOUT_PHASE_SHIFT = "NONE";
   defparam DCM_SP_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
   defparam DCM_SP_INST.DFS_FREQUENCY_MODE = "LOW";
   defparam DCM_SP_INST.DLL_FREQUENCY_MODE = "LOW";
   defparam DCM_SP_INST.DUTY_CYCLE_CORRECTION = "TRUE";
   defparam DCM_SP_INST.FACTORY_JF = 16'hC080;
   defparam DCM_SP_INST.PHASE_SHIFT = 0;
   defparam DCM_SP_INST.STARTUP_WAIT = "FALSE";
endmodule



/////////////////////////////MCU_output_contain
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Engineer: LJT
// Create Date:    15:43:15 09/11/2010
// Design Name:
// Module Name:    MCU_OutputCantain
//  just as a temp of the unused output pins
//////////////////////////////////////////////////////////////////////////////////
module MCU_OutputCantain(
    input [29:0] ioblock,
         input mainclk
    );
reg [29:0]io_buf;
always@(posedge mainclk)
io_buf<=ioblock;
endmodule



////////////////////////////////////约束文件

# VGA Connector done
NET "red<0>"   LOC = "p153"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "red<1>"   LOC = "p152"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "red<2>"   LOC = "p151"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "green<0>" LOC = "p150"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "green<1>" LOC = "p147"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "green<2>" LOC = "p146"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "blue<0>"  LOC = "p145"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "blue<1>"  LOC = "p144"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "blue<2>"  LOC = "p140"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "h_sync" LOC = "p139"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "v_sync" LOC = "p138"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
#MAX1241 ADC
NET "max1242_sclk"  LOC = "p108"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "max1241_cs"  LOC = "p112"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "max1241_data" LOC = "p113"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;

#EEPROM
NET "gpio_5<0>"  LOC = "p122"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLUP;
NET "gpio_5<1>" LOC = "p126"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLUP;

#继电器
NET "JiDaQ<0>" LOC = "p49"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "JiDaQ<1>" LOC = "p40"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "JiDaQ<2>" LOC = "p42"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "JiDaQ<3>" LOC = "p47"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;

#数字信号输入
NET "digt_in<0>" LOC = "p98"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;#P8的1脚
NET "digt_in<1>" LOC = "p99"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;#2脚
#数字信号输出
NET "digt_a" LOC = "p97"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;#3脚
NET "digt_b" LOC = "p94"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;#4脚


#并行AD
NET "sam_clk_out" LOC = "p55"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN; #J5,1
NET "ad_data<0>" LOC ="p61"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;#J6
NET "ad_data<1>" LOC ="p63" |  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "ad_data<2>" LOC ="p65" |  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "ad_data<3>" LOC ="p69"|  IOSTANDARD = LVCMOS33 |  DRIVE=2 |  PULLDOWN;
NET "ad_data<4>" LOC ="p74"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "ad_data<5>" LOC ="p76"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "ad_data<6>" LOC ="p78"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "ad_data<7>" LOC ="p82"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;
NET "ad_data<8>" LOC ="p84"|  IOSTANDARD = LVCMOS33  |  DRIVE=2 |  PULLDOWN;  
NET "ad_data<9>" LOC ="p89"|  IOSTANDARD = LVCMOS33 |  DRIVE=2 |  PULLDOWN;
# PS/2 connector done
NET "ps2k_clk" LOC = "p22"|  IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L07P_3/LHCLK0, Type = I/O, Sch name = PS2_CLK
NET "ps2k_data" LOC = "p19"|  IOSTANDARD = LVCMOS33; # Bank = 1, Pin name = IO_L06N_3, Type = I/O, Sch name = PS2_DATA

#外设
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<7> LOC=p33  |  IOSTANDARD = LVCMOS33;
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<6> LOC=p31  |  IOSTANDARD = LVCMOS33;
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<5> LOC=p30  |  IOSTANDARD = LVCMOS33;
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<4> LOC=p29  |  IOSTANDARD = LVCMOS33;
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<3> LOC=p28  |  IOSTANDARD = LVCMOS33;
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<2> LOC=p25  |  IOSTANDARD = LVCMOS33;
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<1> LOC=p24  |  IOSTANDARD = LVCMOS33;
Net fpga_0_LEDs_8Bit_GPIO_IO_O_pin<0> LOC=p23  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin<3> LOC=p58  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin<2> LOC=p57  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin<1> LOC=p54  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin<0> LOC=p51  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<7> LOC=p43  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<6> LOC=p32  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<5> LOC=p26  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<4> LOC=p20  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<3> LOC=p14  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<2> LOC=p6  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<1> LOC=p204  |  IOSTANDARD = LVCMOS33;
Net fpga_0_Switches_8Bit_GPIO_IO_I_pin<0> LOC=p194  |  IOSTANDARD = LVCMOS33;
Net fpga_0_RS232_PORT_RX_pin LOC=p184  |  IOSTANDARD = LVCMOS33  |  PULLUP;
Net fpga_0_RS232_PORT_TX_pin LOC=p18  |  IOSTANDARD = LVCMOS33  |  DRIVE = 2;
#RAM
Net fpga_0_Micron_RAM_Mem_A_pin<31> LOC=p178  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<30> LOC=p193  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<29> LOC=p196  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<28> LOC=p197  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<27> LOC=p199  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<26> LOC=p200  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<25> LOC=p202  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<24> LOC=p203  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<23> LOC=p4  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<22> LOC=p5  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<21> LOC=p8  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<20> LOC=p9  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<19> LOC=p11  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<18> LOC=p12  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<17> LOC=p15  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<16> LOC=p16  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<15> LOC=p160  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<14> LOC=p205  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_A_pin<13> LOC=p206  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;

Net fpga_0_Micron_RAM_Mem_CEN_pin LOC=p192  |  IOSTANDARD = LVCMOS33  |  DRIVE=2  |  PULLUP;
Net fpga_0_Micron_RAM_Mem_OEN_pin LOC=p180  |  IOSTANDARD = LVCMOS33  |  DRIVE=2  |  PULLUP;
Net fpga_0_Micron_RAM_Mem_WEN_pin LOC=p2  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_BEN_pin<0> LOC=p135  |  IOSTANDARD = LVCMOS33  |  DRIVE=2  |  PULLDOWN;  
Net fpga_0_Micron_RAM_Mem_BEN_pin<1> LOC=p134  |  IOSTANDARD = LVCMOS33  |  DRIVE=2  |  PULLDOWN;
Net fpga_0_Micron_RAM_Mem_DQ_pin<15> LOC=p181  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<14> LOC=p186  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<13> LOC=p177  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<12> LOC=p190  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<11> LOC=p171  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<10> LOC=p167  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<9> LOC=p164  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<8> LOC=p162  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<7> LOC=p185  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<6> LOC=p187  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<5> LOC=p189  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<4> LOC=p172  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<3> LOC=p168  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<2> LOC=p165  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<1> LOC=p163  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;
Net fpga_0_Micron_RAM_Mem_DQ_pin<0> LOC=p161  |  IOSTANDARD = LVCMOS33  |  DRIVE=2;

Net clk TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;
Net clk LOC=p80  |  IOSTANDARD = LVCMOS33;
Net fpga_0_rst_1_sys_rst_pin TIG;
Net fpga_0_rst_1_sys_rst_pin LOC=p71  |  IOSTANDARD = LVCMOS33;






////////////////////////////////////.c文件
#include "xparameters.h"
#include "xgpio.h"
#include "chars.c"



void writestring(unsigned int x,unsigned int y,unsigned char *asc)         //x:0-9;32bitX12直接输出string,5个
{
         unsigned long tmp;
    unsigned long tmpaddr;
         unsigned char j; unsigned char m,n,o,p,q;  
         
    m=*(asc++)-48;       
    n=*(asc++)-48;       
    o=*(asc++)-48;       
    p=*(asc++)-48;               
    q=*asc-48;               
       
        unsigned char *temp[5]={chars,chars,chars,chars,chars};
       
        temp[0]+=m*12;temp[1]+=n*12;temp[2]+=o*12;temp[3]+=p*12;temp[4]+=q*12;
       
  for(j=0;j<12;j++)
        {
       tmp=0;
       tmp|=((unsigned long)(*temp[0]))<<24;
                 tmp|=((unsigned long)(*temp[1]))<<18;
                 tmp|=((unsigned long)(*temp[2]))<<12;
                 tmp|=((unsigned long)(*temp[3]))<<6;
                 tmp|=((unsigned long)(*temp[4]));
                 
                 tmpaddr=(unsigned long)((y+j)*10+x);
                 XGpio_DiscreteWrite (&addr12, 1, tmpaddr);
       XGpio_DiscreteWrite (&data32, 1, tmp);
                 
                 temp[0]++;temp[1]++;temp[2]++;temp[3]++;temp[4]++;
        }
}

void drict_vga_putnum(unsigned int x,unsigned int y,unsigned long value)    //32bitX12直接输出uint,限大小99999
{                                                                           //原有的图形将被覆盖,y:0-9
         uchar tmp[5];
         
   tmp[0]=(value%100000)/10000+48;
   tmp[1]=(value%10000)/1000+48;
        tmp[2]=(value%1000)/100+48;
   tmp[3]=(value%100)/10+48;
   tmp[4]=value%10+48;
       
        writestring(x,y,tmp);
}

void ClrScn()//清屏
{
ulong i,j;
for(i=0;i<240;i++)          //清RAM
{
                for(j=0;j<10;j++)
                {
                 XGpio_DiscreteWrite (&addr12, 1, i*10+j);
       XGpio_DiscreteWrite (&data32, 1, 0);
                }       
}
}


void draw_wave()
{
ulong j,tmp=0;

ulong ddp1,ddp2,rt;
int offset_add;
long tmp2;
uint sb;
if(sam_clk_slect>>23==1) sb=2;
else sb=1;
     for(j=0;j<320;j++)
        {
        tmp=0;
        if(ch2_show)
                        {
                        if(fft_data[j/sb+offset_x]&0x0001) ddp1=20;//通道2
                        else ddp1=100;
                        tmp|=ddp1;//黑
                        }
        if(ch3_show)
                        {
                        if(fft_data[j/sb+offset_x]&0x0002) //通道2
                        ddp1=138;
                        else ddp1=219;
                        tmp|=ddp1<<16;//蓝
                        }
   if(ch1_show)
                        {
                        if(vot_flag==3) offset_add=430;//最小量程1mv时的补偿措施
                        else if(vot_flag==2) offset_add=6;//10mV的补偿措施
                        else offset_add=0;
                       
                        if(vot_flag==3) rt=2;
                        else rt=4;
                       
                        if(sam_clk_slect>>23==1)//最高档位,插值算法
                                 {
                                         if(j%2==0)
                                         {
                                                 tmp2=((ulong)(119-(fft_data[j/2+offset_x]>>rt)+ch1_offset+offset_add));//红
                                                 if(tmp2>238) tmp2=239;//嵌位
                                                 if(tmp2<1) tmp2=0;
                                                 tmp|=tmp2<<8;
                                         }
                                         else
                                         {tmp2=((ulong)(119-((fft_data[j/2+offset_x]>>(rt+1))+(fft_data[j/2+1+offset_x]>>(rt+1)))+ch1_offset+offset_add));
                                                 if(tmp2>238) tmp2=239;
                                                 if(tmp2<1) tmp2=0;
                                                 tmp|=tmp2<<8;
                                         }
                                 }
                        else                      //普通档位
                                  {
                                        tmp2=((ulong)(119-(fft_data[j+offset_x]>>rt)+ch1_offset+offset_add));//红
                                        if(tmp2>238) tmp2=239;
                                        if(tmp2<1) tmp2=0;
                                        tmp|=tmp2<<8;
                                        }
                        }
        XGpio_DiscreteWrite (&addr12, 1, j+4096);
        XGpio_DiscreteWrite (&data32, 1,tmp );//
   }
}






void recall()
{
        uint i,addh,j;
        uint tmp1,tmp2;
        uint oft_x=160;
        ulong tmp;
        ClrScn();
        delay_ms(50);
         for(addh=0;addh<40;addh++)
         {  
    for(i=0;i<16;i++)   //读n个字节数据
    {
                start_24c64();
                writebyte_24c64(0xa0);//写指令
                writebyte_24c64(2*i);//写高位地址
                writebyte_24c64(addh);//写低位地址(实际上是调24c64地址指针到要读取的数据的地址)
                stop_24c64();
                start_24c64();
                writebyte_24c64(0xa1);//写读指令
                tmp1 =readbyte_24c64();
                stop_24c64();
                delay_us(100);

                start_24c64();
                writebyte_24c64(0xa0);//写指令
                writebyte_24c64(2*i+1);//写高位地址
                writebyte_24c64(addh);//写低位地址(实际上是调24c64地址指针到要读取的数据的地址)
                stop_24c64();
                start_24c64();
                writebyte_24c64(0xa1);//写读指令
                tmp2 = readbyte_24c64();
                stop_24c64();
                delay_us(100);         

                fft_data[addh*16+i]=(tmp1<<8)|tmp2;
    }
         }
         
                 while(1)
         {
                     for(j=0;j<320;j++) //画图
                        {
                        tmp=0;
                        tmp|=(ulong)(239-(fft_data[j+oft_x]>>4))<<8;
                        XGpio_DiscreteWrite (&addr12, 1, j+4096);
                        XGpio_DiscreteWrite (&data32, 1,tmp );
                        }
                //波形x方向上平移
                j=(uchar)(XGpio_DiscreteRead (&kb9, 1));
                if(j=='A') {if(oft_x!=0) oft_x--;}
                if(j=='D') {if(oft_x!=320) oft_x++;}
                if(j==' ') break;
           delay_ms(8);
         }
}

void write_eep()
{
    uchar str_doing[]="Sving";
    uint i,addh;uint tmp;
         writestring(1,2,str_doing);
for(addh=0;addh<40;addh++)//写fftdata[],640个16位数据
    {

         for(i=0;i<16;i++)
       {         
                  start_24c64();
        writebyte_24c64(0xa0);//写指令
        writebyte_24c64(2*i);//写高位地址
        writebyte_24c64(addh);//写低位地址
                  
                  delay_us(10);

                  tmp=fft_data[addh*16+i]>>8;//(uchar)(
        writebyte_24c64(tmp);//写高8位
                  stop_24c64();
                  delay_ms(2);   

                  start_24c64();
        writebyte_24c64(0xa0);//写指令
        writebyte_24c64(2*i+1);//写高位地址
        writebyte_24c64(addh);//写低位地址
                  
                  delay_us(10);

                  tmp=(uchar)(fft_data[addh*16+i]&0x00ff);
                  writebyte_24c64(tmp);//写低8位
                  stop_24c64();
                  delay_ms(2);
       }
               
    }
    ClrScn();
}



void adc_sample12bit()
{
  long i,j,addra;long tmp,oft=0;
  uchar str_pos[]="Pos:_";
                                if(trig_1sa==0)//平常的采样时序
                                {
                                XGpio_DiscreteWrite (&gpio4, 1, (1<<22)|markline|sam_clk_slect);//拉高Samstart
                                XGpio_DiscreteWrite (&gpio4, 1, markline|sam_clk_slect);//拉低Samstart
                                XGpio_DiscreteWrite (&gpio4, 1,  (1<<22)|markline|sam_clk_slect);//拉高Samstart
                                XGpio_DiscreteWrite (&gpio4, 1, markline|sam_clk_slect);//拉低Samstart
                                XGpio_DiscreteWrite (&gpio4, 1,  (1<<22)|markline|sam_clk_slect);//拉高Samstart
                                j=0;       
                                }
                                else            //单次触发,存储显示时的时序
                                {
                                XGpio_DiscreteWrite (&gpio4, 1, (1<<26)|markline|sam_clk_slect);//拉高Samstart
                                XGpio_DiscreteWrite (&gpio4, 1, markline|sam_clk_slect);//拉高Samstart
                                XGpio_DiscreteWrite (&gpio4, 1, (1<<26)|markline|sam_clk_slect);//拉高Samstart
                                j=-6553555;
                                }
while(1)//等待完成
{
j++;
addra=XGpio_DiscreteRead(&fft32, 1)>>12;
switch(sam_clk_slect>>23)
{
case 7:delay_ms(100);  break;
default:delay_ms(10);  break;
}
i=XGpio_DiscreteRead (&kb9, 1);
if(i=='V'+256)  {save_flag=1;writestring(8,3,str_save);}
if(i=='L'+256||i=='J'+256) break;
if((sam_clk_slect>>23)<4&&j>30) break;//防止出错,程序假死
{if(addra==XGpio_DiscreteRead(&fft32, 1)>>12)  break;}
//drict_vga_putnum(6,2,addra);
}
                         
                         
                         
                 if(save_flag||trig_1sa)//存储或是存储显示
                 {
                     ch1_show=1;ch2_show=0;ch3_show=0;offset_x=0;
                          ClrScn();

                           if(delay_time>1000) { addra=addra-(delay_time-1481);if(addra>1279) addra-=1279;if(addra<0) addra+=1279;}
                                else  {addra=addra+delay_time+481;if(addra>1279) addra-=1279;if(addra<0) addra+=1279;}

                        delay_ms(300);
                 while(1)
                 {
                   writestring(8,2,str_pos);
                        drict_vga_putnum(9,2,oft+480);   
                         for(j=0;j<640;j++)
                         {         
             tmp=j+addra+oft;if(tmp>1279) tmp-=1280;if(tmp<0) tmp+=1280;
                                 XGpio_DiscreteWrite (&gpio4, 1, (trig_1sa<<26)|(1<<22)|tmp<<11|markline|sam_clk_slect);//输入地址
                                 fft_data[j]=(uint)(0x0fff&XGpio_DiscreteRead (&fft32, 1));//提取低12位
                         }
                               
                    i=XGpio_DiscreteRead (&kb9, 1);
                                //波形x方向上平移
                         if(i=='A'+256) {oft--;  drict_vga_putnum(9,3,oft+480);}
                         if(i=='D'+256) {oft++;  drict_vga_putnum(9,3,oft+480);}
                        draw_wave();
                         if(oft>489) oft=489;//移动范围+-160共两屏;正负时延480点
                         if(oft<-489) oft=-489;
                         if(i==' '+256) {break; }
                         //手动存储功能
                         if(i=='U'+256) write_eep();
                       
                         delay_ms(4);
                       
                 }
                 delay_ms(500);ClrScn();
                 save_flag=0;
                 }
                 
                 else
                 {
           for(j=0;j<320;j++)//触发
                 {         
                    tmp=j+addra+1;if(tmp>1279) tmp-=1280;
                         XGpio_DiscreteWrite (&gpio4, 1, (1<<22)|tmp<<11|markline|sam_clk_slect);//输入地址
                         if(trig_dir)//上升沿
                                {
                                         if(trig_res==2) {fft_data[j]=(uint)(0x01&XGpio_DiscreteRead (&fft32, 1));if(j>3&&fft_data[j-2]==0&&fft_data[j-1]==0&&fft_data[j]) break;}            
                                         //模拟通道触发
                                         if(trig_res==1)
                                                 {
                                                 fft_data[j]=((uint)(XGpio_DiscreteRead (&fft32, 1))&0x0fff)>>2;//>>4
                                                 if(j>5&&fft_data[j-5]>v_trig*4&&fft_data[j-4]>v_trig*4&&fft_data[j-3]>=v_trig*4&&fft_data[j-2]<v_trig*4&&fft_data[j-1]<v_trig*4&&fft_data[j]<v_trig*4) break;
                                                 }
                                         if(trig_res==3) {fft_data[j]=(uint)(0x02&XGpio_DiscreteRead (&fft32, 1));if(j>3&&fft_data[j-2]==0&&fft_data[j-1]==0&&fft_data[j]) break;}
                                }
                        else         //下降沿
                          {
                                        if(trig_res==2) {fft_data[j]=(uint)(0x01&XGpio_DiscreteRead (&fft32, 1));if(j>3&&fft_data[j-2]==1&&fft_data[j-1]==1&&fft_data[j]==0) break;}            
                                         //模拟通道触发
                                        if(trig_res==1)
                                                 {
                                                 fft_data[j]=((uint)(XGpio_DiscreteRead (&fft32, 1))&0x0fff)>>2;//>>4
                                                 if(j>5&&fft_data[j-5]<v_trig*4&&fft_data[j-4]<v_trig*4&&fft_data[j-3]<=v_trig*4&&fft_data[j-2]>v_trig*4&&fft_data[j-1]>v_trig*4&&fft_data[j]>v_trig*4) break;
                                                 }
                                         if(trig_res==3) {fft_data[j]=(uint)(0x02&XGpio_DiscreteRead (&fft32, 1));if(j>3&&fft_data[j-2]&&fft_data[j-1]&&fft_data[j]==0) break;}
                         }
                }
                 for(i=0;i<640;i++)
         {         tmp=i+j+addra+1;if(tmp>1279) tmp-=1280;
                    XGpio_DiscreteWrite (&gpio4, 1, (1<<22)|tmp<<11|markline|sam_clk_slect);//输入地址
                         fft_data=(uint)(0x0fff&XGpio_DiscreteRead (&fft32, 1));//提取低12位
                 }
                 }
                 trig_1sa=0;
                 XGpio_DiscreteWrite (&gpio4, 1, markline|sam_clk_slect);//拉低Samstart
}



void sort(ulong *asc)  //排序函数
{  ulong i,j,tmp;
        for(i=0;i<9;i++)
        {
          for(j=i+1;j<=9;j++)
             if(*(asc+i)>*(asc+j)) {tmp=*(asc+i);*(asc+i)=*(asc+j);*(asc+j)=tmp;}
        }
}

ulong ans_10;

void measure()           
{   
   static uint kk;  
        static ulong amax,amin,af,avpp,max[10],min[10],t[10];
                uint  j=0,i;
      uchar strtmp[5];
               
   static   ulong aPrd;
                uchar str1[]="_T=__";
                uchar str2[]="Vmn=_";
                uchar str3[]="Vpp=_";
                uchar str4[]="frq=_";
max[kk]=0;
min[kk]=1024;


        for (i=1; i<640;i++)
         {
            if(max[kk]<=fft_data>>2)   max[kk]=fft_data>>2;   
            if(min[kk]>=fft_data>>2)   min[kk]=fft_data>>2;
         }
         
        max[kk]=max[kk]*VREF/960;//换算成电压,单位mV
        min[kk]=min[kk]*VREF/960;
        t[kk]=XGpio_DiscreteRead (&gpio7, 1);       //T   

        kk++;
        if(kk>=10)//10次处理一次//从10个t和Vmax和min之间找到他的中值!
        {
        sort(max);sort(min);sort(t);
        ans_10=t[8];   
   amax=max[3];        //选取偏小一点的  
        amin=min[6];       
        avpp=amax-amin;      
        kk=0;

       
        //电压
           str3[4]=(avpp%10000)/1000+48;
                strtmp[0]=(avpp%1000)/100+48;
                strtmp[1]=(avpp%100)/10+48;
                strtmp[2]=avpp%10+48;               
                strtmp[3]='m';
                strtmp[4]='V';
        writestring(6,227,str3); writestring(7,227,strtmp);
        //周期       
        if(ans_10<9999) {aPrd=ans_10*10;strtmp[3]='n';strtmp[4]='s';}//单位:ns
        else if(ans_10<9999000) {aPrd=ans_10/100;strtmp[3]='u';strtmp[4]='s';}//us
        else {aPrd=ans_10/100000;strtmp[3]='m';strtmp[4]='s';}//ms       
       
           if(aPrd>9999) str1[3]=(aPrd/10000)+48;//万位,占了'='
                str1[4]=(aPrd%10000)/1000+48;
                strtmp[0]=(aPrd%1000)/100+48;
                strtmp[1]=(aPrd%100)/10+48;
                strtmp[2]=aPrd%10+48;
        writestring(0,227,str1); writestring(1,227,strtmp);
        //频率
        if(ans_10<10000) {strtmp[3]='K';strtmp[4]='_';}
        else{ans_10/=1000;strtmp[3]='H';strtmp[4]='z';}
        af=100000/ans_10;
       
                if(af>9999) str4[3]=(af/10000)+48;//万位,占了'='
                str4[4]=(af%10000)/1000+48;
                strtmp[0]=(af%1000)/100+48;
                strtmp[1]=(af%100)/10+48;
                strtmp[2]=af%10+48;
           writestring(3,227,str4); writestring(4,227,strtmp);
               
                if(strtmp[3]=='H') ans_10*=1000;
        }
}   

void AutoSet()
{
  int i;
  ulong m;
  ulong j;
  uchar str_a[]="Auto_";
  uchar str_b[]="Set``";
  uint Vmax=0,Vmin=1024;
  uint tt[3];
  uint t;
  sam_clk_slect=4<<23;//10ms档位测幅值
  ClrScn();
  writestring(1,1,str_a);
  writestring(2,1,str_b);
  delay_ms(100);
  adc_sample12bit();
  
  
for(m=0;m<4;m++)//自动量程选择
   {
                vot_flag=m; set_vot();adc_sample12bit();
                delay_ms(100);
                adc_sample12bit();
               
                Vmax=0,Vmin=1024;
      //寻找最大最小值               
                for (i=5; i<560;i++)  {if(Vmax<(fft_data>>2))   Vmax=(fft_data>>2);   if(Vmin>(fft_data>>2))   Vmin=fft_data>>2;}
                if(Vmax>580||Vmin<380) break;//480中值,左右超过100(1024的1/10)为准               
   }
   v_trig=(Vmax+Vmin)/8;


    for(m=1;m<7;m++)//自动扫描速率
  {
    sam_clk_slect=(m<<23);
         delay_ms(300);
         adc_sample12bit();         
         delay_ms(300);
         adc_sample12bit();

         j=0;
         tt[0]=0;tt[1]=0;
for (i=240; i<640;i++)
         {
            if(((fft_data[i-1]>>2)>v_trig*4) && ((fft_data>>2)>=v_trig*4) &&((fft_data[i+1]>>2) <= v_trig*4) && ((fft_data[i+2]>>2) < v_trig*4) )
               {
                         if(j<2) {if(j==0||i>tt[0]+3)        {tt[j]=i; j++;}}
                         else break;
               }
         }
         t=tt[1]-tt[0];   drict_vga_putnum(18,4,t);
    draw_wave();
         if(((t>9&&m==1)||(t>25))&&t<320) break;
  }  
  ClrScn();
  
  operat_delay_cnt=1;markline=(239-v_trig)<<3;
  
}



write_trg()
{
   long vl;
   uchar str1[]="trig_";
   uchar str2[]="levl:";
   uchar str3[]="_____";
        uchar str4[]="mV___";
       
        vl=(121-(markline>>3));//换算成电压,单位mVmarkline>>3)
       
        if(vl<0) {str3[0]='^';vl=-vl;}
        else str3[0]='_';
       
        vl=vl*VREF/240;
        if(vot_flag==3) vl/=4;
        str3[1]=(vl%10000)/1000+48;
        str3[2]=(vl%1000)/100+48;
        str3[3]=(vl%100)/10+48;
        str3[4]=vl%10+48;
        writestring(0,markline>>3,str1);writestring(1,markline>>3,str2);writestring(2,markline>>3,str3);writestring(3,markline>>3,str4);
}


void set_digt()
{
  uchar str1[]="__00K";
  uchar str2[]="SYNC_";
    ulong j;
  uchar str3[]="Set_D";
  uchar str4[]="igt_C";
  uchar str5[]="hanle";
  
  
  ClrScn();
  
  writestring(1,3,str3);writestring(2,3,str4);writestring(3,3,str5);
  delay_ms(200);
  
  freq_ctrl=0;
  
  while(1){j=(uchar)(XGpio_DiscreteRead (&kb9, 1));if(j) break;}
  if(j-48) {freq_ctrl+=10;str1[0]='1';}
  delay_ms(300);
  while(1){j=(uchar)(XGpio_DiscreteRead (&kb9, 1));if(j) break;}
  freq_ctrl+=(j-48);
  
  if(freq_ctrl==0) writestring(7,42,str2);
  else
  {
    str1[1]=(freq_ctrl%10)+48; writestring(7,42,str1);
  }

  XGpio_DiscreteWrite (&gpio6, 1, freq_ctrl);
  delay_ms(1000);
  ClrScn();
}


void set_time()
{
uchar str1[]="Input";
uchar str2[]="Time:";  


uchar str3[]="Press";
uchar str4[]="any_K";

uchar str5[]="ey_Co";
uchar str6[]="nfirm";

uint j;

writestring(1,3,str1);writestring(2,3,str2);
delay_time=0;

while(1){j=XGpio_DiscreteRead (&kb9, 1);if(j) break;} delay_time+=(j-304)*1000;
  drict_vga_putnum(18,4,delay_time);delay_ms(500);
while(1){j=XGpio_DiscreteRead (&kb9, 1);if(j) break;} delay_time+=(j-304)*100;
  drict_vga_putnum(18,4,delay_time);delay_ms(500);
while(1){j=XGpio_DiscreteRead (&kb9, 1);if(j) break;} delay_time+=(j-304)*10;
  drict_vga_putnum(18,4,delay_time);delay_ms(500);
while(1){j=XGpio_DiscreteRead (&kb9, 1);if(j) break;} delay_time+=(j-304);
  drict_vga_putnum(18,4,delay_time);delay_ms(500);

delay_ms(500);

writestring(5,200,str3);writestring(6,200,str4); writestring(7,200,str5); writestring(8,200,str6);
while(1){j=XGpio_DiscreteRead (&kb9, 1);if(j) break;}
ClrScn();
if(delay_time<1000) delay_time=delay_time/2;
else delay_time=delay_time/2+500;
}

int main (void)
{
ulong i,j,fftmp;ulong findex;
uint x,y,yhis;

unsigned char str_stop[]="STOP";


uchar str_time[]="]_;_:";//时间
uchar str_t0[]="0`3us";
uchar str_t1[]="1us__";
uchar str_t2[]="10us_";
uchar str_t3[]="100us";
uchar str_t4[]="1ms__";
uchar str_t5[]="10ms_";
uchar str_t6[]="100ms";
uchar str_t7[]="1s___";


uchar str_ch1[]="@:CH1";//红
uchar str_ch2[]="<:CH2";//蓝
uchar str_ch3[]=">:CH3";//黑

uchar str_fudu[]="_?_[:";     //幅度
uchar str_fd0[]="1`0V_";
uchar str_fd1[]="0`1V_";
uchar str_fd2[]="10mV_";
uchar str_fd3[]="1mV__";


XGpio_Initialize (&data32, XPAR_XPS_GPIO_0_DEVICE_ID) ;
XGpio_Initialize (&addr12, XPAR_XPS_GPIO_1_DEVICE_ID) ;
XGpio_Initialize (&led8, XPAR_LEDS_8BIT_DEVICE_ID) ;
XGpio_Initialize (&bot4, XPAR_PUSH_BUTTONS_4BIT_DEVICE_ID) ;
XGpio_Initialize (&kb9, XPAR_XPS_GPIO_2_DEVICE_ID) ;
XGpio_Initialize (&fft32, XPAR_XPS_GPIO_3_DEVICE_ID) ;
XGpio_Initialize (&gpio4, XPAR_XPS_GPIO_4_DEVICE_ID) ;
XGpio_Initialize (&gpio5, XPAR_XPS_GPIO_5_DEVICE_ID);
XGpio_Initialize (&jidaq, XPAR_JIDAQ_DEVICE_ID);
XGpio_Initialize (&gpio6, XPAR_XPS_GPIO_DIGT_CTRL_DEVICE_ID);
XGpio_Initialize (&gpio7, XPAR_XPS_GPIO_FREQ_DEVICE_ID);

XGpio_SetDataDirection (&data32, 1, 0);
XGpio_SetDataDirection (&addr12, 1, 0);
XGpio_SetDataDirection (&led8, 1, 0);  
XGpio_SetDataDirection (&bot4, 1, 1);
XGpio_SetDataDirection (&kb9, 1, 1);
XGpio_SetDataDirection (&fft32, 1, 1);
XGpio_SetDataDirection (&gpio4, 1, 0);
XGpio_SetDataDirection (&gpio5, 1, 0);
XGpio_SetDataDirection (&jidaq, 1, 0);
XGpio_SetDataDirection (&gpio6, 1, 0);
XGpio_SetDataDirection (&gpio7, 1, 1);


XGpio_DiscreteWrite (&led8, 1, 0x00);
XGpio_DiscreteWrite (&jidaq, 1, 0);

delay_ms(200);
ClrScn();//清屏
/////////////////////////////////////////////初始化完毕
while(1)
{
delay_ms(200);ClrScn();  i=0;
while(1)
{
        adc_sample12bit();
        delay_ms(20);
       
        draw_wave();
       
        if(m_flag) measure();//测量

        writestring(4,2,str_time);//左上角,写时间
        switch(sam_clk_slect>>23)
                        {
                          case 0:writestring(5,2,str_t0); samp_f=50000;break;
                          case 1:writestring(5,2,str_t1); samp_f=16666;break;//X1000,频率单位KHz
                          case 2:writestring(5,2,str_t2); samp_f=3125; break;
                          case 3:writestring(5,2,str_t3); samp_f=322580;break;
                          case 4:writestring(5,2,str_t4); samp_f=32010;break;//X1,频率单位Hz
                          case 5:writestring(5,2,str_t5); samp_f=3200;break;
                          case 6:writestring(5,2,str_t6); samp_f=320;break;
                          default:writestring(5,2,str_t7); samp_f=32;break;
                        }
                       
      writestring(0,2,str_fudu);//zuo上角,写幅度
                switch(vot_flag)
                                {
                                  case 0:writestring(1,2,str_fd0); break;
                                  case 1:writestring(1,2,str_fd1); break;
                                  case 2:writestring(1,2,str_fd2); break;
                                  default:writestring(1,2,str_fd3); break;
                                }                        
        if(ch1_show==1) writestring(9,2,str_ch1);
        if(ch2_show==1) writestring(9,16,str_ch2);
        if(ch3_show==1) writestring(9,28,str_ch3);
       
        //以下是读取键盘值,响应用户操作
        j=(uchar)(XGpio_DiscreteRead (&kb9, 1));
        switch(j)
        {
        //RUN/STOP
        case 'R': { XGpio_DiscreteWrite (&led8, 1, 0x00); delay_ms(350);while(1){writestring(9,3,str_stop); j=XGpio_DiscreteRead (&kb9, 1);        if(j=='R'+256){delay_ms(200);ClrScn();        break;}}}break;
        //切换通道
        case '1': {if(ch1_show==1) {ch1_show=0;ClrScn();} else {ch1_act=1;ch1_show=1;} XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(200);}break;
        case '2': {if(ch2_show==1) {ch2_show=0;ClrScn();} else {ch1_act=1;ch2_show=1;}XGpio_DiscreteWrite (&led8, 1, 0x00); delay_ms(200);}break;
   case '3': {if(ch3_show==1) {ch3_show=0;ClrScn();} else ch3_show=1; delay_ms(200);}break;
        //触发电平调节
        case 'T': {XGpio_DiscreteWrite (&led8, 1, 0x00);v_trig+=1; operat_delay_cnt=1;markline=(239-v_trig)<<3;}break;
        case 'G': {XGpio_DiscreteWrite (&led8, 1, 0x00);v_trig-=1; operat_delay_cnt=1;markline=(239-v_trig)<<3;}break;
        //波形y方向上平移
        case 'W': {if(ch1_act) {ch1_offset-=2;markline=(ch1_offset)<<3;} else {ch2_offset-=2;markline=(ch2_offset)<<3;}operat_delay_cnt=1;}break;
        case 'S': {if(ch1_act) {ch1_offset+=2;markline=(ch1_offset)<<3;} else {ch2_offset+=2;markline=(ch2_offset)<<3;}operat_delay_cnt=1;}break;
        //波形x方向上平移
        case 'A': {offset_x-=2;operat_delay_cnt=1;}break;
        case 'D': {offset_x+=2;operat_delay_cnt=1;}break;
        //时间档位选择
        case 'L': {if(sam_clk_slect!=1<<23) sam_clk_slect-=(1<<23);XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(250);}break;
        case 'J': {if(sam_clk_slect!=(7<<23)) sam_clk_slect+=(1<<23);XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(250);}break;
        //垂直量程选择
        case 'I': {if(vot_flag!=3) vot_flag++; set_vot();XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(250);}break;
        case 'K': {if(vot_flag!=0) vot_flag--; set_vot();XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(250);}break;
        //是否测量
        case 'M': {m_flag=!m_flag;XGpio_DiscreteWrite (&led8, 1, 0xff); delay_ms(200);ClrScn(); }break;
        //存储和回放
        case 'V': {save_flag=1;writestring(8,3,str_save);}break;
        //触发源选择
        case 'O': {delay_ms(200);trig_res++;if(trig_res==4) trig_res=1;}break;
        //上升/下降沿触发切换
        case 'P': {XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(200);trig_dir=~trig_dir;}break;
   //设置存储延时
        case 'C': {XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(200);ClrScn();set_time();}break;//
        //存储显示功能
        case 'H': {XGpio_DiscreteWrite (&led8, 1, 0x00);trig_1sa=1;writestring(8,3,str_save);delay_ms(200);}break;
        //手动存储功能
        case 'U': {ClrScn();XGpio_DiscreteWrite (&led8, 1, 0x00);write_eep();} break;
        //ReCall
        case 'Y': {recall();XGpio_DiscreteWrite (&led8, 1, 0x00);delay_ms(200);} break;
        //设置数字信号
        case 'Q': {XGpio_DiscreteWrite (&led8, 1, 0x00);set_digt();delay_ms(250);} break;
        //AutoSet
        case 'X': {XGpio_DiscreteWrite (&led8, 1, 0x00);AutoSet();delay_ms(250);} break;
        }
        //延时清除显示
        if(operat_delay_cnt) {operat_delay_cnt++;write_trg();}
        if(operat_delay_cnt>50) {operat_delay_cnt=0;markline=0;ClrScn();}
       
        XGpio_DiscreteWrite (&gpio6, 1, freq_ctrl);
        XGpio_DiscreteWrite (&led8, 1, 0xff);
       
}
delay_ms(200);ClrScn();
}
}



////////////////////////////chars.c 包含变量定义 部分函数 和用到的字模
#define uint unsigned int
#define ulong unsigned long
#define uchar unsigned char

//全局变量
XGpio data32;
XGpio addr12;
XGpio led8;
XGpio bot4;
XGpio kb9;
XGpio fft32;
XGpio gpio4;
XGpio gpio5;
XGpio gpio6;
XGpio gpio7;
XGpio jidaq;

uint fft_data[640];

ulong samp_f=50000;  //采样率
//OSC显示与操作g变量
uchar ch1_act=1,ch1_show=1,ch2_show=0,ch3_show=0;//CH2为模拟通道
uint v_trig=117;
uint ch1_offset=120;uint ch2_offset=0;
uint markline=0;
int offset_x=0;
uchar m_flag=1;

ulong sam_clk_slect=3<<23;//采样率控制
uchar trig_dir=0xff;//触发边沿选择;0xff上升,0x00下降沿
uchar trig_res=1;//触发源选择

uchar str_save[]="Save";

uint delay_time=0;

uchar save_flag=0;//存储标志
ulong trig_1sa=0;//存储显示标志

ulong freq_ctrl=0;//0跟随,12345678910。。。代表不同的百KHz,defult为100K

uint operat_delay_cnt;

void delay_ms(ulong tim)
{
volatile ulong i,j;
for(j=0;j<tim;j++)
{
  for(i=0;i<10000;i++);
}
}

void delay_us(ulong tim)
{
volatile ulong i,j;
for(j=0;j<tim;j++)
{
  for(i=0;i<8;i++);
}
}


//放大倍数控制
ulong vot_flag=0;
ulong VREF=8000;//原来是define,所以大写了
void set_vot()
{
switch(vot_flag)
                        {
                          case 0:XGpio_DiscreteWrite (&jidaq,1,0x00); VREF=8000; break;//1V/div
                          case 1:XGpio_DiscreteWrite (&jidaq,1,0x08); VREF=800;break;//100mV/div    增大0.5%
                          case 2:XGpio_DiscreteWrite (&jidaq,1,0x0c); VREF=80; break;//10mV/div
                          case 3:XGpio_DiscreteWrite (&jidaq,1,0x0f); VREF=32; break;//2mV/div
                          default:XGpio_DiscreteWrite (&jidaq,1,0x00); VREF=2000; break;//1V/div
                        }
}


//EEPROM功能函数

#define sda_24c64_1  XGpio_DiscreteSet  (&gpio5,1,1)//24c64定义数据线
#define sda_24c64_0  XGpio_DiscreteClear  (&gpio5,1,1)//24c64定义数据线
#define scl_24c64_1  XGpio_DiscreteSet  (&gpio5,1,2)//24c64定义时钟线
#define scl_24c64_0  XGpio_DiscreteClear  (&gpio5,1,2) //24c64定义时钟线

void start_24c64()
{
   sda_24c64_1;
        delay_us(1);//后来加上的
   scl_24c64_1;
   delay_us(20);
   sda_24c64_0;
   delay_us(20);
   scl_24c64_0;
}

void stop_24c64()
{
    sda_24c64_0;
         delay_us(1);//后来加上的
    scl_24c64_1;
    delay_us(10);
    sda_24c64_1;
    delay_us(10);
    scl_24c64_0;
}


void ask_24c64() //写数据应答,第九个脉冲sda_24c64为低,则24c64成功接受数据
{
    uchar k=30,j;
    scl_24c64_0;
         delay_us(1);//后来加上的
    scl_24c64_1;
    delay_us(10);
         
XGpio_SetDataDirection (&gpio5, 1, 1); //配置成输入

j=(uchar)(XGpio_DiscreteRead (&gpio5, 1)&0x01);
    while(j&&k--){j = (uchar)(XGpio_DiscreteRead (&gpio5, 1)&0x01);}//结合写数据发第九个脉冲,检查应答位,若无应答,一定时间后退出
XGpio_SetDataDirection (&gpio5, 1, 0); //配置成输出
         scl_24c64_0;
}

void writebyte_24c64(uchar data_to_24c64)
{
    uchar i;
   scl_24c64_0;
        delay_us(1);//后来加上的
  for(i=0;i<8;i++)
  {
   if(data_to_24c64&0x80) sda_24c64_1;   else sda_24c64_0;
   delay_us(1);//后来加上的
   scl_24c64_1;   //时钟线低变高,发数据
   delay_us(10);
   scl_24c64_0;
   data_to_24c64<<=1;
  }
   ask_24c64();
}

uchar readbyte_24c64() //ack应答位,ack=1,MCU不应答(不继续接受数据)
{                               //ack=0,MCU应答,继续接受数据
    uchar i,data_from_24c64;
    scl_24c64_0;       
         XGpio_SetDataDirection (&gpio5, 1, 1); //配置成输入
for(i=0;i<8;i++)
{
   delay_us(1);//后来加上的
     data_from_24c64<<=1;
   scl_24c64_1;
   delay_us(10);

   data_from_24c64 |= (uchar)(XGpio_DiscreteRead (&gpio5, 1)&0x01);

   delay_us(10);
   scl_24c64_0;
}
         delay_us(1);//后来加上的
    scl_24c64_1;
    delay_us(1);//后来加上的
    scl_24c64_0;
         delay_us(1);//后来加上的       

         XGpio_SetDataDirection (&gpio5, 1, 0); //配置成输出
    sda_24c64_1;
    return data_from_24c64;
}

uchar huifang[]=//回放
{
//-  文字:  回  
//--  新宋体12;  此字体下对应的点阵为:宽x高=16x16
0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x27,0xC8,0x24,0x48,0x24,0x48,0x24,0x48,
0x24,0x48,0x24,0x48,0x27,0xC8,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08,0x00,0x00,

//--  文字:  放  
//--  新宋体12;  此字体下对应的点阵为:宽x高=16x16
0x20,0x40,0x10,0x40,0x00,0x40,0xFE,0x80,0x20,0xFE,0x21,0x08,0x3E,0x88,0x24,0x88,
0x24,0x88,0x24,0x50,0x24,0x50,0x24,0x20,0x44,0x50,0x54,0x88,0x89,0x04,0x02,0x02

} ;      

void write_ch(uint x,uint y,unsigned char *ch)
{ uint j;
  ulong tmp=0,tmpaddr;
  unsigned char *temp[4]={ch,ch+1,ch+32,ch+33};
        for(j=0;j<16;j++)
        {
                tmp=0;
                         tmp|=((unsigned long)(*temp[0]))<<24;
                         tmp|=((unsigned long)(*temp[1]))<<16;
                         tmp|=((unsigned long)(*temp[2]))<<8;
                         tmp|=((unsigned long)(*temp[3]));
                         
        tmpaddr=(unsigned long)((y+j)*10+x);
                        XGpio_DiscreteWrite (&addr12, 1, tmpaddr+4096);
                        XGpio_DiscreteWrite (&data32, 1, tmp);
        temp[0]+=2;temp[1]+=2;temp[2]+=2;temp[3]+=2;
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入4汤圆

发表于 2010-11-14 18:58:20 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2010-11-14 20:07:54 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-11-14 20:16:17 | 显示全部楼层
顶帖的不用活了   还是发工程文件吧

出0入0汤圆

发表于 2010-11-14 20:26:32 | 显示全部楼层
hao niubi

出0入0汤圆

发表于 2010-11-14 21:14:33 | 显示全部楼层
貌似认识LZ,顶一个

出0入0汤圆

发表于 2010-11-14 21:16:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-15 10:52:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-15 11:15:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-15 13:30:05 | 显示全部楼层
还是发下工程文件吧。

出0入0汤圆

 楼主| 发表于 2010-11-15 20:21:05 | 显示全部楼层
回复【3楼】not_at_all  
-----------------------------------------------------------------------

ISE的工程文件有点大,压缩包有50M。。学校这个网速不允许阿。。。。。。。

出0入0汤圆

发表于 2010-11-15 21:49:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-16 11:58:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-16 16:12:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-27 15:36:44 | 显示全部楼层
不管怎么样,先MARK一下!

出10入10汤圆

发表于 2010-11-27 16:05:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-11 19:11:28 | 显示全部楼层
大牛!

出0入0汤圆

发表于 2011-12-6 14:06:49 | 显示全部楼层
好长好长。。。

出0入0汤圆

发表于 2013-7-3 14:30:23 | 显示全部楼层
mark                                   

出0入0汤圆

发表于 2013-7-4 08:47:28 | 显示全部楼层
mark 很好

出0入0汤圆

发表于 2013-7-4 09:53:56 | 显示全部楼层
好好学习。

出0入0汤圆

发表于 2013-7-5 00:35:29 | 显示全部楼层
不错,赞一个
楼主把*.v   *.mhs   *.mss和C文件上传就可以了,这样比较小

出0入0汤圆

发表于 2013-7-5 06:06:46 | 显示全部楼层
还是发工程文件吧

出0入0汤圆

发表于 2013-7-7 19:06:45 | 显示全部楼层
mark,赞一个!

出0入0汤圆

发表于 2013-8-7 22:30:50 | 显示全部楼层
你好!我现在也在做一个FPGA数字存储示波器,看了你的帖子感觉很有帮助,希望你能给我发一下原理图和源代码或者工程文件。不胜感激!谢谢了!
511049445@qq.com

出0入0汤圆

发表于 2013-8-7 22:50:08 | 显示全部楼层
找个时间学习一下!

出0入0汤圆

发表于 2013-8-11 12:19:58 | 显示全部楼层
这这。。。。。。。这样也行

出0入0汤圆

发表于 2014-8-31 17:28:31 | 显示全部楼层
大神啊 先mark下

出0入0汤圆

发表于 2014-8-31 20:59:22 | 显示全部楼层
sdu1028 发表于 2010-11-15 20:21
回复【3楼】not_at_all  
-----------------------------------------------------------------------

上网盘吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表