ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

电压采集

2022-09-15 16:00:28  阅读:204  来源: 互联网

标签:shift seg 采集 adc 电压 input segment reg


 

 

module	Voltage_Meas
(
input				clk,
input				rst_n,

output				adc_cs,
output				adc_clk,
input				adc_dat,

output	[8:0]		seg_1,
output	[8:0]		seg_2

);

wire clk_24mhz;
PLL pll
(
.CLKI				(clk			), //12MHz系统时钟输入
.CLKOP				(clk_24mhz		)  //24MHz时钟输出
);

wire	adc_done;
wire	[7:0]	adc_data;

ADC081S101_dirver adc
(
.clk				(clk_24mhz		),	//系统时钟
.rst_n				(rst_n			),	//系统复位,低有效
.adc_cs				(adc_cs			),	//SPI总线CS
.adc_clk			(adc_clk		),	//SPI总线SCK
.adc_dat			(adc_dat		),	//SPI总线SDA
.adc_done			(adc_done		),	//ADC采样完成标志
.adc_data			(adc_data		)	//ADC采样数据
);
//将ADC采样数据按规则转换为电压数据(乘以0.0129),这里我们直接乘以129,得到的数据经过BCD转码后小数点左移4位即可
wire	[15:0]	bin_code = adc_data *16'd129;
wire	[19:0]	bcd_code;

bin_to_bcd	bin_to_bcd
(
	.rst_n		(rst_n)	,
	.bin_code	(bin_code)	,//需要进行BCD转码的二进制数据

	.bcd_code 	(bcd_code)//转码后的BCD码型数据输出
);

//个位数码管模块例化	
Segment_led seg1
(
.seg_dot			(1'b1			),	//seg_dot input
.seg_data			(bcd_code[19:16]),	//seg_data input
.segment_led		(seg_1			)	//MSB~LSB = SEG,DP,G,F,E,D,C,B,A
);

//分位数码管模块例化
Segment_led seg2
(
.seg_dot			(1'b0			),	//seg_dot input
.seg_data			(bcd_code[15:12]),	//seg_data input
.segment_led		(seg_2			)	//MSB~LSB = SEG,DP,G,F,E,D,C,B,A
);	
	

endmodule

  

module	Segment_led
(
	input			seg_dot,		//seg_dot input
	input	[3:0]	seg_data,		//seg_dot input
	output	[8:0]	segment_led  	//MSB~LSB = SEG,DP,G,F,E,D,C,B,A
);

reg	[6:0]	segment;

always@(seg_data)
	case (seg_data)
		4'd0: segment = 7'h3f;
		4'd1: segment = 7'h06;
		4'd2: segment = 7'h5b;
		4'd3: segment = 7'h4f;
		4'd4: segment = 7'h66;
		4'd5: segment = 7'h6d;
		4'd6: segment = 7'h7d;
		4'd7: segment = 7'h07;
		4'd8: segment = 7'h7f;
		4'd9: segment = 7'h6f;
		default: segment = 7'h00;
	endcase

assign	segment_led = {1'b0,seg_dot,segment};

endmodule

  

module	ADC081S101_dirver
(
input				clk,		//系统时钟
input				rst_n,		//系统复位,低有效

output	reg			adc_cs,		//SPI总线CS
output	reg			adc_clk,	//SPI总线SCK
input				adc_dat,	//SPI总线SDA

output	reg			adc_done,	//ADC采样完成标志
output	reg	[7:0]	adc_data	//ADC采样数据
);

localparam	HIGH = 1'b1;
localparam	LOW	= 1'b0;

reg	[7:0]	cnt;   //采样计数器

always@(posedge	clk	or negedge rst_n)
	if(!rst_n)
		cnt <= 8'd0;
	else if(cnt >= 8'd34)
		cnt <= 8'd0;
	else
		cnt <= cnt + 8'd1;
		
reg	[7:0]	data;//数据缓存

always@(posedge clk or negedge	rst_n)
	if(!rst_n)
		begin
			adc_cs <= HIGH;
			adc_clk <= HIGH;
		end
	else	case(cnt)
				8'd0 : begin adc_cs <= HIGH; adc_clk <= HIGH; end
				8'd1 : begin adc_cs <= LOW ; adc_clk <= HIGH; end
				8'd2,8'd4,8'd6,8'd8,8'd10,8'd12,8'd14,8'd16,
				8'd18,8'd20,8'd22,8'd24,8'd26,8'd28,8'd30,8'd32:
					    begin adc_cs <= LOW; adc_clk <= LOW; end
				8'd3  : begin adc_cs <= LOW; adc_clk <= HIGH; end //0
				8'd5  : begin adc_cs <= LOW; adc_clk <= HIGH; end //1
				8'd7  : begin adc_cs <= LOW; adc_clk <= HIGH; end //2	
				8'd9  : begin adc_cs <= LOW; adc_clk <= HIGH; data[7] <= adc_dat; end //3
				8'd11 : begin adc_cs <= LOW; adc_clk <= HIGH; data[6] <= adc_dat; end //4
				8'd13 : begin adc_cs <= LOW; adc_clk <= HIGH; data[5] <= adc_dat; end //5
				8'd15 : begin adc_cs <= LOW; adc_clk <= HIGH; data[4] <= adc_dat; end //6
				8'd17 : begin adc_cs <= LOW; adc_clk <= HIGH; data[3] <= adc_dat; end //7
				8'd19 : begin adc_cs <= LOW; adc_clk <= HIGH; data[2] <= adc_dat; end //8
				8'd21 : begin adc_cs <= LOW; adc_clk <= HIGH; data[1] <= adc_dat; end //9
				8'd23 : begin adc_cs <= LOW; adc_clk <= HIGH; data[0] <= adc_dat; end //10
				8'd25 : begin adc_cs <= LOW; adc_clk <= HIGH; adc_data <= data; end //11
				8'd27 : begin adc_cs <= LOW; adc_clk <= HIGH; adc_done <= HIGH; end //12
				8'd29 : begin adc_cs <= LOW; adc_clk <= HIGH; adc_done <= LOW ; end //13	
				8'd31 : begin adc_cs <= LOW; adc_clk <= HIGH; end //14
				8'd33 : begin adc_cs <= LOW; adc_clk <= HIGH; end //15
				8'd34 : begin adc_cs <= HIGH; adc_clk <= HIGH; end 
				default: begin adc_cs <= HIGH;  adc_clk <= HIGH;  end
		endcase
		

endmodule

  

module	bin_to_bcd
(
input				rst_n,
input	[15:0]		bin_code,//需要进行BCD转码的二进制数据

output	reg[19:0]	bcd_code //转码后的BCD码型数据输出
);

reg	[35:0]	shift_reg;

always@(bin_code or rst_n)
	begin
		shift_reg ={20'h0,bin_code};
		if(!rst_n)
			bcd_code = 0;
		else begin
				repeat(16)
					begin
						if(shift_reg[19:16] >= 5) shift_reg[19:16] = shift_reg[19:16] +2'b11;
						if(shift_reg[23:20] >= 5) shift_reg[23:20] = shift_reg[23:20] +2'b11;
						if(shift_reg[27:24] >= 5) shift_reg[27:24] = shift_reg[27:24] +2'b11;		
						if(shift_reg[31:28] >= 5) shift_reg[31:28] = shift_reg[31:28] +2'b11;
						if(shift_reg[35:32] >= 5) shift_reg[35:32] = shift_reg[35:32] +2'b11;	
						shift_reg = shift_reg << 1;
					end
			    bcd_code = shift_reg[35:16];
			end
	end
	
endmodule

  

 

标签:shift,seg,采集,adc,电压,input,segment,reg
来源: https://www.cnblogs.com/54programer/p/16696856.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有