[Verilog]ADC0809驱动程序

来源:互联网 发布:远程办公软件 编辑:程序博客网 时间:2024/05/20 19:28

[Verilog]ADC0809驱动程序

  • ADC0809芯片双通道轮询采样
  • Xilinx basys2 100E 测试通过
  • FPGA

相较于原程序,修改了一部分时序,添加了多通道采集,以及输出。

`timescale 1ns / 1ps module ADC0809 ( rst ,clk ,D ,EOC ,ale ,OE ,start ,clk_out ,an ,ane ,reg1, reg2, addr_ad); //in from AD input              rst ;                    //系统 复位 input              clk ;                    //系统时钟// input    [2:0]    abc_in     ;             //外部控制的通道选择信号 input      [7:0]    D ;                      //ADC0809传进来的数据 input              EOC ;                    //ADC0809转换完成信号标志 //out for AD output             ale ;                    //FPGA给ADC0809的地址锁存信号 output             OE ;                     //FPGA给ADC0809的使能信号 output             start ;                  //ADC0809 转换开始信号 output                 clk_out;                         //FPGA给ADC0809的时钟信号 output                 addr_ad ;                //FPGA给ADC0809的通道选择信号 //out for other module //output                   addr_om ;                //FPGA给其他模块的地址信号 output     [7:0]       an;                          //数码管段码 output     [3:0]       ane;                             //数码管使能 output     [7:0]   reg1  ;  output     [7:0]       reg2; fclkout A1(clk,rst,clk_out); adc0809inout A2(rst,clk,D,EOC,ale,OE,start,addr_ad,reg1,reg2); display A3(clk,rst,reg1,reg2,an,ane); endmodule ///////////////////////////////////////////////////////////////////////////////////////AD--750kHz时钟输出 module fclkout(clk,rst,clk_out); input clk; input rst; output clk_out; reg                    clkoutsign;  reg     [5:0]    clkoutf        ; assign clk_out = clkoutsign; always @ (posedge clk or posedge rst) //AD--750kHz时钟输出 begin      if ( rst== 1'b1 ) begin           //复位         clkoutf<=0;            clkoutsign<=0;               end     else  begin                            //分频         clkoutf <= clkoutf + 1;         if ( clkoutf >= 6'b10_1000 ) begin             clkoutf <= 6'b00_0000;                 clkoutsign<=~clkoutsign;                        end      end end  endmodule ////////////////////////////////////////////////////////////////////////////////////时序状态转换 module adc0809inout(rst,clk,D,EOC,ale,OE,start,addr_ad,reg1,reg2); //状态转换标志位 //in from AD input              rst ;                    //系统 复位 input              clk ;                    //系统时钟 input      [7:0]    D ;                      //ADC0809传进来的数据 input              EOC ;                    //ADC0809转换完成信号标志 //out for AD output             ale ;                    //FPGA给ADC0809的地址锁存信号 output             OE ;                     //FPGA给ADC0809的使能信号 output             start ;                  //ADC0809 转换开始信号 output                 addr_ad ;                //FPGA给ADC0809的通道选择信号 output      [7:0]  reg1;  output         [7:0]  reg2; parameter   st0 = 3'b000,             st1 = 3'b001,             st2 = 3'b010,             st3 = 3'b011,             st4 = 3'b100,             st5 = 3'b101,             st6 = 3'b110 ;  reg     [2:0]    p_state  ;           //状态转换  reg     [2:0]    n_state ;              reg              ale_r    ;             reg              OE_r    ;  reg              start_r    ;  reg     [7:0]    qq        ;  reg            [7:0]   reg1r;  reg            [7:0]   reg2r;  reg addr_adr;  assign    ale = ale_r    ;   assign    OE = OE_r     ;  assign    start = start_r     ;  assign        reg1=reg1r;  assign        reg2=reg2r;  assign        addr_ad=addr_adr;  initial begin        n_state<=st0;        p_state <= st1    ;        addr_adr=0;  end  always @ (posedge clk or posedge rst)  begin      if ( rst== 1'b1 ) begin           //复位         p_state <= st1    ;         qq <= 8'b0        ;                    end        else  begin                             //分频         qq <= qq + 1;//         if (  qq == 8'b1001_0100  ) begin                if (  qq >= 8'b1111_1111  ) begin             qq <= 8'b0000_0000;             p_state <= n_state;                         end         end end always @ ( EOC ,p_state )          //模态转换   begin       case ( p_state )          st0 :begin //initialize             ale_r <= #1 1'b0;              start_r <= #1 1'b0;             OE_r <= #1 1'b0;             n_state <=#1 st1;         end          st1 :begin //generate ALE             ale_r <= #1 1'b1;              start_r <= #1 1'b0;             OE_r <= #1 1'b0;             n_state <=#1 st2;         end         st2 :begin    //generate START              ale_r <= #1 1'b0;              start_r <= #1 1'b1;                 OE_r <= #1 1'b0;             n_state <=#1 st3;          end         st3 :begin     //wait for EOC negedge             ale_r <= #1 1'b0;              start_r <= #1 1'b0;                 OE_r <= #1 1'b0;             // if ( EOC == 1'b1 )            //     n_state <=#1 st3;              // else                 n_state <=#1 st4;                           end               st4 :begin     //wait for EOC posedge               ale_r <= #1 1'b0;              start_r <= #1 1'b0;                 OE_r <= #1 1'b0;              if ( EOC == 1'b0 )                 n_state <=#1 st4;               else                 n_state <=#1 st5;          end               st5 :begin     //generate OE              ale_r <= #1 1'b0;              start_r <= #1 1'b0;             OE_r <= #1 1'b1;              n_state <=#1 st6;          end              st6 :begin     //generate OE and read D in              ale_r <= #1 1'b0;              start_r <= #1 1'b0;                 OE_r <= #1 1'b1;                  if(addr_adr==0)                        reg1r <=#1  D ;                 else                        reg2r <=#1  D ;             n_state <=#1 st0;                  addr_adr=~addr_adr;         end             default :begin //无关态初始化              ale_r <= #1 1'b0;              start_r <= #1 1'b0;                 OE_r <= #1 1'b0;              n_state <=#1 st0;          end         endcase         endendmodule////////////////////////////////////////////////////数码管显示 module display(clk,rst,reg1,reg2,an,ane); input clk; input rst; input [7:0] reg1; input [7:0] reg2; output [6:0] an; output [3:0] ane; //////译码部分 reg        [6:0]    Y_r_1;                 reg        [6:0]    Y_r_2; reg        [6:0]    Y_r_3;                 reg        [6:0]    Y_r_4; // assign seven_seg[7:0] ={1'b1,(~Y_r_1[6:0])};// assign seven_seg[15:8] = {1'b1,(~Y_r_2[6:0])}; always @(reg1[3:0] )     begin         Y_r_1 = 7'b1111111;         case (reg1[3:0] )                        4'b0000:Y_r_1=7'b1000000; //0                        4'b0001:Y_r_1=7'b1111001; //1                        4'b0010:Y_r_1=7'b0100100; //2                        4'b0011:Y_r_1=7'b0110000; //3                        4'b0100:Y_r_1=7'b0011001; //4                        4'b0101:Y_r_1=7'b0010010; //5                        4'b0110:Y_r_1=7'b0000010; //6                        4'b0111:Y_r_1=7'b1111000; //7                        4'b1000:Y_r_1=7'b0000000; //8                        4'b1001:Y_r_1=7'b0010000; //9                        4'b1010: Y_r_1 = 7'b0001000; // A                  4'b1011: Y_r_1 = 7'b0000011; // b                  4'b1100: Y_r_1 = 7'b1000110; // c                  4'b1101: Y_r_1 = 7'b0100001; // d                  4'b1110: Y_r_1 = 7'b0000110; // E                  4'b1111: Y_r_1 = 7'b0001110; // F                        default:Y_r_1=7'b1111111;             endcase     end     always @( reg1[7:4] )     begin         Y_r_2 = 7'b1111111;         case ( reg1[7:4] )                        4'b0000:Y_r_2=7'b1000000; //0                        4'b0001:Y_r_2=7'b1111001; //1                        4'b0010:Y_r_2=7'b0100100; //2                        4'b0011:Y_r_2=7'b0110000; //3                        4'b0100:Y_r_2=7'b0011001; //4                        4'b0101:Y_r_2=7'b0010010; //5                        4'b0110:Y_r_2=7'b0000010; //6                        4'b0111:Y_r_2=7'b1111000; //7                        4'b1000:Y_r_2=7'b0000000; //8                        4'b1001:Y_r_2=7'b0010000; //9                        4'b1010: Y_r_2 = 7'b0001000; // A                  4'b1011: Y_r_2 = 7'b0000011; // b                  4'b1100: Y_r_2 = 7'b1000110; // c                  4'b1101: Y_r_2 = 7'b0100001; // d                  4'b1110: Y_r_2 = 7'b0000110; // E                  4'b1111: Y_r_2 = 7'b0001110; // F                        default:Y_r_2=7'b1111111;             endcase     endalways @(reg2[3:0] )     begin         Y_r_3 = 7'b1111111;         case (reg2[3:0] )                        4'b0000:Y_r_3=7'b1000000; //0                        4'b0001:Y_r_3=7'b1111001; //1                        4'b0010:Y_r_3=7'b0100100; //2                        4'b0011:Y_r_3=7'b0110000; //3                        4'b0100:Y_r_3=7'b0011001; //4                        4'b0101:Y_r_3=7'b0010010; //5                        4'b0110:Y_r_3=7'b0000010; //6                        4'b0111:Y_r_3=7'b1111000; //7                        4'b1000:Y_r_3=7'b0000000; //8                        4'b1001:Y_r_3=7'b0010000; //9                        4'b1010: Y_r_3 = 7'b0001000; // A                  4'b1011: Y_r_3 = 7'b0000011; // b                  4'b1100: Y_r_3 = 7'b1000110; // c                  4'b1101: Y_r_3 = 7'b0100001; // d                  4'b1110: Y_r_3 = 7'b0000110; // E                  4'b1111: Y_r_3 = 7'b0001110; // F                        default:Y_r_3=7'b1111111;             endcase     end     always @( reg2[7:4] )     begin         Y_r_4 = 7'b1111111;         case ( reg2[7:4] )                        4'b0000:Y_r_4=7'b1000000; //0                        4'b0001:Y_r_4=7'b1111001; //1                        4'b0010:Y_r_4=7'b0100100; //2                        4'b0011:Y_r_4=7'b0110000; //3                        4'b0100:Y_r_4=7'b0011001; //4                        4'b0101:Y_r_4=7'b0010010; //5                        4'b0110:Y_r_4=7'b0000010; //6                        4'b0111:Y_r_4=7'b1111000; //7                        4'b1000:Y_r_4=7'b0000000; //8                        4'b1001:Y_r_4=7'b0010000; //9                        4'b1010: Y_r_4 = 7'b0001000; // A                  4'b1011: Y_r_4 = 7'b0000011; // b                  4'b1100: Y_r_4 = 7'b1000110; // c                  4'b1101: Y_r_4 = 7'b0100001; // d                  4'b1110: Y_r_4 = 7'b0000110; // E                  4'b1111: Y_r_4 = 7'b0001110; // F                        default:Y_r_4=7'b1111111;             endcase     end      //////显示驱动  reg        [11:0] timecount; reg        [3:0] aner; reg            [7:0] anr; assign ane = aner; assign an = anr;  always @ (posedge clk or posedge rst)        if(rst== 1'b1)            timecount <=12'b0000_0000_0000;        else begin            timecount <= timecount+1;            if(timecount ==12'b1111_1111_1111)            timecount <=12'b0000_0000_0000;            end  always @ (posedge clk or posedge rst)        if(rst== 1'b1)            aner <=4'b0000;        else            case(timecount[11:10])//下载使用            //case(count[1:0])//仿真使用                2'b00: aner<=4'b0111;                2'b01: aner<=4'b1011;                2'b10: aner<=4'b1101;                2'b11: aner<=4'b1110;            endcase      always @ (posedge clk or posedge rst)        if (rst== 1'b1)            anr<=7'b000_0000;        else            case(timecount[11:10]) // 下载使用            //case(timecount[1:0]) //仿真使用                2'b00: anr<=Y_r_2;                2'b01: anr<=Y_r_1;                2'b10: anr<=Y_r_4;                2'b11: anr<=Y_r_3;        endcase  endmodule
本程序改编自电子发烧友论坛,仅供交流探讨使用。

0 0
原创粉丝点击