基于FPGA的数字电压表设计
本文代码数据处理模块参照大佬设计:https://blog.csdn.net/aodan3459/article/details/102011527?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159469213619725222417809%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159469213619725222417809&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_blog_default-2-102011527.pc_v2_rank_blog_default&utm_term=FPGA%E6%95%B0%E5%AD%97%E7%94%B5%E5%8E%8B%E8%A1%A8,
感谢大佬,侵删。
参考文献:
1.《现代数字电子技术基础实践》陈龙 牛小燕 马学条 杨柳 编著 机械工业出版社
2.《EDA Technology and Verilog HDL》黄继业 郑兴 黄汐威 潘松 编著 清华大学出版社
3.《Verilog HDL与FPGA数字系统设计》罗杰 主编 机械工业出版社
开发板资料:
1.AX301B_UG.pdf
2.高速ADDA使用指南REV1.3.pdf
3.黑金Altera开发板AX301_AX4010Verilog实例教程.pdf
以上资料均来自黑金动力社区:http://www.heijin.org/*
一、设计指标:
(1)使用ALINX AX301 FPGA开发平台。
(2)使用ALINX AN108 AD/DA模块。
(3)通过DA部分AD9708芯片产生固定模拟电压信号。
(4)通过AD部分AD9280芯片将模拟信号转化为数字信号。
(5)数码管显示所测电压值,分辨率0.01V,并且负电压可以显示负号。
(6)量程为 -4.00到4.00V。
二、系统框图:
三、代码部分:
1.顶层模块:
使用“例化”方式连接各个模块。
module adc9280_top(
//input
sys_clk, //系统时钟50MHz
rst_n, //复位信号
data_ad, //AD输出信号
//output
clk_adc, //ADC时钟
clk_dac, //DAC时钟
data_da, //DA输出信号
wei_slec, //数码管位选信号
duan_slec //数码管段选信号
);
input sys_clk;
input rst_n;
input [7:0] data_ad;
output clk_adc;
output clk_dac;
output [7:0] data_da;
output [3:0] wei_slec;
output [7:0] duan_slec;
wire [7:0] pre_data;
wire [11:0] cout;
//分频器模块
clk_10M u1(
//input
.sys_clk(sys_clk),
.rst_n(rst_n),
//ouput
.clk_10M(clk_10M)
);
//ADC采样模块
ADC9280 u2(
//input
.sys_clk(sys_clk),
.data_ad(data_ad),
//ouput
.pre_data(pre_data)
);
//数据处理模块
data_ad_pro u3(
//input
.sys_clk(sys_clk),
.rst_n(rst_n),
.pre_data(pre_data),
//output
.cout(cout)
);
//数码显示译码模块
display u4(
//input
.sys_clk(sys_clk),
.rst_n(rst_n),
.cout(cout),
//output
.slec_wei(wei_slec),
.slec_duan(duan_slec)
);
//信号发生模块
signal_generator u5(
//input
.sys_clk(sys_clk),
.rst_n(rst_n),
//output
.data_da(data_da)
);
assign clk_adc = clk_10M;
assign clk_dac = sys_clk;
endmodule
2.分频器模块:
AD9280最大采样率为32MSPS,使用10MHz时钟比较合适。
module clk_10M(
//input
sys_clk, //输系统时钟50MHz
rst_n, //复位信号
//ouput
clk_10M //输出分频后的时钟10MHz
);
input sys_clk;
input rst_n;
output clk_10M;
reg clk_10M;
reg [2:0]cnt; //计数信号
always @(posedge sys_clk or negedge rst_n)
if(!rst_n) begin
cnt <= 5'd0;
clk_10M <= 1'b0;
end
else if(cnt == 5'd5) //5分频,系统时钟每翻转5次,clk_10M翻转一次
begin
cnt <= 5'd0;
clk_10M <= ~clk_10M;
end
else
cnt <= cnt + 1'b1;
endmodule
3.ADC采样模块:
module ADC9280(
//input
sys_clk,