[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
- [Verilog]ADC0809驱动程序
- ADC0809
- ADC0809采样转换
- ADC0809 C程序
- adc0809的使用
- ADC0809 ISIS仿真
- 四线电阻屏verilog驱动程序,基于ADS7843
- verilog
- verilog
- Verilog
- 用ADC0809直接连接C51
- VHDL状态机控制ADC0809[转贴]
- ADC0809的proteus仿真问题
- 关于ADC0809的500kHz时钟频率
- 驱动程序
- 驱动程序
- 驱动程序
- 驱动程序
- 二叉树面试题(一) 重建二叉树
- 【NAS】Samba常用命令
- 解析解与数值解
- 聊聊并发——Java中的阻塞队列
- MySQL批处理sql文件时data too long for column问题
- [Verilog]ADC0809驱动程序
- 关于angularjs+ueditor的一个bug
- 科比罚篮,武器命中和霍金劫数
- JavaScript window.location IE谷歌跳转路径不兼容
- YARN - 比较 YARN 与 MapReduce 1
- 【WPF】使用Popup控件做浮窗/提示框
- 0. spark源码学习分享 前言
- 1295: Fengsensei的测试
- iOS APP删除系统相册中选中的图片-姬云鹏