基于iCE40UP5K实现数字电压表
基于Lattice iCE40UP5K实现一个Σ-Δ ADC采集,采集后的电压将会在OLED屏幕上显示,实现一个简易的电压表
标签
FPGA
显示
2022寒假在家练
niuniu
更新2022-03-02
河北师范大学
925

一.项目需求

利用ADC制作一个数字电压表

1.旋转电位计可以产生0-3.3V的电压

2.利用板上的串行   ADC对电压进行转换

3.将电压值在板上的OLED屏幕上显示出来

二.思路及框架构建

FlS_i7WRnvIk3hLf7wfrjfD_3AkS

图2.1 数字电压表原理框图

按照项目要求来实现,我们要制作的是一个数字电压表,而电压值是一个模拟量,所以我们需要使用ADC(模数转换器)把模拟信号转换为数字信号,根据开发板的原理图可以看出来,板上的旋转电位计与高速比较器(TP1961)正向输入端相连。我们通过高速比较器和FPGA逻辑实现的Sigma DeltaADC对旋转电位计的模拟量进行采集,将采集量进行进制转换,然后实时的显示在OLED屏幕上,这样就可以基本完成项目的要求了。

确定思路以后,就需要分别设计模块,然后把各功能综合在一起,这样就能完成项目了。具体划分以后,我们大概需要五个部分的模块来实现最后的功能:首先是通过利用sigma-delta ADC进行模拟量读取;然后是一个数字低通滤波器模块,做平滑滤波,提高输出数据的准确性(如果对其滤波,则具有更好的频率响应,因为它具有更好的频率输出内容);设计一个转码模块,将采集到的模拟量转为数字量之后的二进制数字变为十进制,方便OLED的显示;其次是OLED显示模块,动态显示采样得到的电压;最后是综合以上四个模块的一个top模块,这样就可以了。

FpfGMoISnJnqWCnWYmejp_BslQdt

图2.2 数字电压表RTL视图

图2.2给出了综合后的RTL视图,从这个图中,我们可以更清晰地看到各个模块之间的联系及其输入输出信号。

  • 难点 SigmaDelta ADC的原理

FsiAseuajh_CMSYwESQ0IczIT02g

图2.3 核心部分(SSD ADC)的电路连接图

Delta-Sigma(Σ-Δ) ADC可以达到很高的精度,需要过采样、数字滤波消除量化噪声,从而实现高分辨率。而这样做的代价是牺牲了采样速度,延迟变大,功耗也不小。基于这样的特性,Delta-Sigma (Σ-Δ) ADC在连续信号采集,高精度测量等领域有着广泛的应用.

在要求转换速率不高的情况下,完全可以借助一颗高速比较器(成本只有几毛钱)来实现对模拟信号的量化,Lattice的官网上一篇文章就介绍了如何制作一个简易的Sigma Delta ADC,如果FPGA能够提供LVDS的接口,连外部的高速比较器都可以省掉。由于我们的小脚丫FPGA核心模块在设计的时候没有考虑到LVDS的应用场景,所以还是需要搭配一个高速的比较器来实现Lattice官网上推荐的简易Sigma Delta ADC的功能。

让ICE40UP5K通过锁相环PLL运行于48MHz的主时钟,测试题目要求的直流信号0-3.3V。

  • 工作原理

Fvnbf-d3wB8TdlegMp6jPp7BQFFL

简易Sigma Delta ADC的工作原理

Fq749ZyWq20q6L0aHh4FrUibF7RN

直接连接 - 被测模拟信号的幅度范围为0-3.3V

Fqv119Josz6WT64jLDODZMyRsFuz

通过电阻分压网络输入,并在比较器+端提供参考电压,则被采集模拟信号的电压变化范围可以扩展

根据图2.3所示,本项目RC网络的设计为直接连接结构,满足测量要求。

Delta Sigma调制,即把模拟信号调制成方波形式的PCM(Pulse Code Modulation)信号。PCM波是一个频率固定占空比变化的波,通过比较信号和高频调制波产生。然后经过数字滤波,再通过解调,得到一个数字化的最终结果。

FqhcAjYRR7hiFwi3GKKw34BNZiA1

图2.4 Delta-Sigma调制器输出(时域)

我们想象一下啊,下图模拟信号(红色虚线)和PCM信号(黑色方波状的波形),表达的是同一个信号。

FgJD_9oN92_usYdCrSNRMcLNL1yI

图2.5 “模拟信号” VS “PCM信号”

Delta Sigma调制器传递函数

Fh6IJT0KgGAv9gHsCHntRlVbnSnn

图2.6 Delta Sigma调制器拓扑图

通过上面的环路,进行Delta-Sigma数字化调制。环路的传递函数, 输出等于输入与输出之间的差值乘以前向的积分环节加上量化噪声。我们可以得到传递函数:

Dout=(Vin-Dout)A(f)+e(n)

求解这个传递函数,我们得到输出Dout:

Fi3-3vLOrehXWDxcKYqWXi7MhKlv,我们可以看出,(f/(1+f))对于量化噪声e(n)相当于一个高通滤波器,而对于输入信号Vin相当于一个低通滤波器。

经过Delta-Sigma调制环节之后, 信号被优化,我们在频域范围内更好理解。当频率较低时,信号保留,量化噪声被削减,当频率比较高时,量化噪声保留,信号削减。

FlAer5mTRFMMdcJOAgxd9Fv1L2pY

图2.7 Delta-Sigma调制器输出(频域)

  • PWM滤波电路分析计算

PWM是一种周期固定,而高低电平占空比可调的方波信号。PWM通过简单的RC滤波网络可以得到与信号占空比成线性关系的直接电压,从而实现D/A转换。如下图所示:

FnoAQZp10lOgVqcSYc-8LiwDpIHO

滤波电路中的R,C参数与PWM的周期以及直流电压的精度要求直接相关,必须从理论上详细分析。假设PWM波的频率为f,高电平电压为V,占空比为a。如果RC网络的时间常数远大于PWM波的周期T,Vin和Vout波形如下图所示:

FlgXq_JdTcPMY9UrCG9O1PNAba6L

处于瞬态时,Vin在高电平持续时间内向电容充电,电容积累电荷,在低电平持续电间内电容向Vin放电,电容释放电荷。电容积累的电荷数多于释放的电荷数。因此电容电容两端的直波电压不断爬升,最终达到稳态。

处于稳态时,电容积累的电荷与释放的电荷数量相等,因此电压会在一个稳定的电压值附近做小幅度的波动,忽略这样的纹波,则电容两端的电压与PWM占空比呈线性关系。如下图:

Fn0Lfa3QHpfrrSWq1VsUFD5oTtab

当t<Th时,电容充电,电容两端电压表示为:u(t)=VH+(V1-VH)e(-t/(R1C1))

当t=Th时,u(t)=VH+(V1-VH)e(1-t/(R1C1))

当t>Th且t<Th+Tl时,V2=u(Th)=VH+(V1-VH)e(1-Th(R1C1))

当t=Th+Tl时,u(t)=VL+(V2-VL)e-(t-Tk)/(R1C1))

在这样的稳态下,电容在一个周期内的充放电会相等,所以有

V1=V3,即[VH+(V1-VH)(1-Th/(R1C1)-VL)][1-TL/(R1C1)]+VL=V1

忽略二阶小量,得到:V1=(VH-VL)TH/T

由于PWM的占空比定义为:α=TH/T

所以:V1=(VH-VL

由于V1=V3≈V2,所以当电路处理稳态时,电容两端的电压近似为直流电压,表示为:u=(VH-VL

可见,电容两端的电压与PWM高低电平之差以及占空比成比例关系。

直流电压精度定义为:FnR-9go7onf6FoCt_daXawrn98fY

总之,设计PWM波RC滤波电路时,应根据响应时间要求,确定时间常数,并且使RC时间常数远大于PWM周期。RC充放电时间常数应尽量相等。此外还应根据电压精度要求确定RC参数。

三.代码实现

电子森林里提供了很多模块的实验例程,有一部分是封装好的,不需要怎么改动,lattice官网里也有例程,还有一些是我们可以根据项目需求进行调整的。总之,我们可以在网站上找到很多有用的例程进行修改来完成我们的项目。这里我将把每一部分的代码进行主要的说明。

  • 顶层模块 

voltmeter 本部分控制整个项目的框架,顶层模块需要把各个模块实例化,写明对应的输入输出量。中间在把ADC的采样数据传送到转码模块之前,要按规则转化成电压值,即乘0.0129。

module ADC_top ( 
			i_clk_in,
			i_rst_in,// 低电平复位
			i_analog_cmp,// 比较器输出,可用lvds替代
			o_digital_out,// 滤波器并行输出
			o_analog_out,// 反馈路径,RC滤波后进入比较器
			o_sample_rdy,//输出数据有效
			oled_rst,	//OLCD液晶屏复位
			oled_dcn,	//OLCD数据指令控制DC
			oled_clk,	//OLCD时钟信号D0
			oled_dat	//OLCD数据信号D1
		    );
    parameter 
			 ADC_WIDTH = 8,              // ADC Convertor Bit Precision
			 ACCUM_BITS = 10,            // 2^ACCUM_BITS is decimation rate of accumulator// 累加器位宽,analog_cmp进入此处,必须大于ADC精度?2^ACCUM_BITS 是信号累加器大小
			 LPF_DEPTH_BITS = 3,         // 2^LPF_DEPTH_BITS is decimation rate of averager// 累加器位宽,analog_cmp进入此处,必须大于ADC精度?2^ACCUM_BITS 是信号累加器大小
			 INPUT_TOPOLOGY = 0;         // 0: DIRECT: Analog input directly connected to + input of comparator// 反馈参数配置
										   // 1: NETWORK:Analog input connected through R divider to - input of comp.
											/* 
												*0: DIRECT: Analog input directly connected to + input of comparitor
													*模拟信号+端输入,反馈信号RC滤波后从-输入
													*适合测量0-VCC的模拟信号
												1: NETWORK:Analog input connected through R divider to - input of comp.
													*模拟信号与反馈信号经过加法器,连接积分器
													*扩大了电压测量范围
											*/
			//input ports
			input	i_clk_in; // 12Mhz on Control Demo board
			input 	i_rst_in;				
			input	i_analog_cmp;			// from LVDS buffer or external comparitor

			//output ports
			output	o_analog_out;         // feedback to RC network
			output 	o_sample_rdy;		  
			output [ADC_WIDTH-1:0] o_digital_out;   // connected to I2C register.
			output	oled_rst;	//OLCD液晶屏复位
			output	oled_dcn;	//OLCD数据指令控制DC
			output	oled_clk;	//OLCD时钟信号D0
			output	oled_dat;	//OLCD数据信号D1   
   //**********************************************************************
   //
   //	Internal Wire & Reg Signals
   //
   //**********************************************************************
			wire sys_clk;
			assign sys_clk = i_clk_in;
/*
HSOSC 
#( 
  .CLKHF_DIV ("0b10") //Clock divider selection.0b10=12MHz
) u_HSOSC ( 
  .CLKHFEN (1'b1), 
  .CLKHFPU (1'b1), 
  .CLKHF   (sys_clk) 
);
*/
			wire analog_out_i;
			wire sample_rdy_i;
			wire [ADC_WIDTH-1:0]   digital_out_i;
			wire [ADC_WIDTH-1:0]   digital_out_abs;
			wire sys_rst_n,clk_gen_locked,clk_pwm_adc;
			//将ADC采样数据按规则转换为电压数据(乘以0.0129),这里我们直接乘以129,得到的数据经过BCD转码后小数点左移4位即可
			wire [15:0]	bin_code = digital_out_abs * 16'd130;
			wire [19:0]	bcd_code;
   //***********************************************************************
   //
   //  锁相环倍频
   //
   //***********************************************************************
   assign sys_rst_n = i_rst_in & clk_gen_locked;
my_pll __(.ref_clk_i( sys_clk),
        .rst_n_i( i_rst_in),
        .lock_o( clk_gen_locked),
        .outcore_o( ),
        .outglobal_o( clk_pwm_adc));
   
   //***********************************************************************
   //
   //  SSD ADC using onboard LVDS buffer or external comparator
   //
   //***********************************************************************
	sigmadelta_adc #(
			.ADC_WIDTH(ADC_WIDTH),
			.ACCUM_BITS(ACCUM_BITS),
			.LPF_DEPTH_BITS(LPF_DEPTH_BITS)
				)
		u1(
		   .clk(clk_pwm_adc),
		   .rstn(sys_rst_n),
		   .analog_cmp(i_analog_cmp),
		   .digital_out(digital_out_i),
		   .analog_out(analog_out_i),
		   .sample_rdy(sample_rdy_i)
	   ); 
   //***********************************************************************
   //
   //  将处理后的ADC数据进行BCD转码,例化
   //
   //***********************************************************************
	bintobcd u2(
			.rst_n				(sys_rst_n),	//系统复位,低有效
			.bin_code			(bin_code),	//需要进行BCD转码的二进制数据
			.bcd_code			(bcd_code)	//转码后的BCD码型数据输出
		);
   //***********************************************************************
   //
   //  OLED显示电压
   //
   //***********************************************************************
	OLEDshow u3(
			.clk     (clk_pwm_adc) ,		
			.rst_n   (sys_rst_n),	

			.data	(bcd_code[19:12]),

			//.oled_csn(oled_csn),			
			.oled_rst(oled_rst),			
			.oled_dcn(oled_dcn),	
			.oled_clk(oled_clk),	
			.oled_dat(oled_dat)	
		);
   //***********************************************************************
   //
   //  output assignments
   //
   //***********************************************************************
   
   assign digital_out_abs = INPUT_TOPOLOGY ? ~digital_out_i : digital_out_i;     
   assign o_digital_out   =  digital_out_abs;	 
   assign o_analog_out    =  analog_out_i;
   assign o_sample_rdy    =  sample_rdy_i;
   
endmodule
  • ADC采样模块

Simple Sigma-Delta ADC 本模块完全采用了官方例程里ADC采样的实例模块,也是方便了我们程序的编写,直接拿来用就可以了。这里也希望大家能多多挖掘各网站上对自己完成项目有用的知识,很多已经完成了的固定用法的模块我们就可以直接享用前人的成果了,在此也感谢创作者。

module sigmadelta_adc  (
	clk,                    
	rstn,                   
	digital_out,            
	analog_cmp,	            
	analog_out,             
	sample_rdy);            

parameter 
ADC_WIDTH = 8,              // ADC Convertor Bit Precision// ADC精度,单位bit
ACCUM_BITS = 10,            // 2^ACCUM_BITS is decimation rate of accumulator// 累加器位宽,analog_cmp进入此处,必须大于ADC精度
LPF_DEPTH_BITS = 3;         // 2^LPF_DEPTH_BITS is decimation rate of averager // 均值滤波器深度,2^LPF_DEPTH_BITS是抽取速率


//input ports
input	clk;                            // sample rate clock
input	rstn;                           // async reset, asserted low
input	analog_cmp ;                    // input from LVDS buffer (comparitor)

//output ports
output	analog_out;                     // feedback to comparitor input RC circuit
output  sample_rdy;                     // digital_out is ready
output [ADC_WIDTH-1:0]	digital_out;    // digital output word of ADC




//**********************************************************************
//
//	Internal Wire & Reg Signals内部连线,寄存器声明
//
//**********************************************************************

reg [ACCUM_BITS-1:0]	    sigma;          // running accumulator value
reg [ADC_WIDTH-1:0]	        accum;          // latched accumulator value
reg [ACCUM_BITS-1:0]	    counter;        // decimation counter for accumulator
reg							rollover;       // decimation counter terminal count
reg							accum_rdy;      // latched accumulator value 'ready' 




//***********************************************************************
//
//  SSD 'Analog' Input - PWM			
//
//	External Comparator Generates High/Low Value
//
//***********************************************************************
// For the ice40 there is a register in the component


  wire       delta;          // captured comparitor output


	// Differential input, DDR data
	IOL_B
	#(
		.LATCHIN ("NONE_DDR"),
		.DDROUT  ("NO")
	) DDRInst0 (
		.PADDI  (analog_cmp),  // I
		.DO1    (),  // I
		.DO0    (),  // I
		.CE     (1'b1),  // I
		.IOLTO  (),  // I
		.HOLD   (),  // I
		.INCLK  (clk),  // I
		.OUTCLK (),  // I
		.PADDO  (),  // O
		.PADDT  (),  // O
		.DI1    (),  // O
		.DI0    (delta)   // O
	);



assign analog_out = delta;      // feedback to comparitor LPF

//***********************************************************************
// 将01序列转换为N位占空比
//  Accumulator Stage
//
//	Adds PWM positive pulses over accumulator period
//
//***********************************************************************

always @ (posedge clk or negedge rstn)
begin
	if( ~rstn ) 
    begin
		sigma       <= 0;
		accum       <= 0;
		accum_rdy   <= 0;
    end else begin
        if (rollover) begin
            // latch top ADC_WIDTH bits of sigma accumulator (drop LSBs)
            accum <= sigma[ACCUM_BITS-1:ACCUM_BITS-ADC_WIDTH];
            sigma <= delta;         // reset accumulator, prime with current delta value
        end else begin
            if (&sigma != 1'b1)         // if not saturated
                sigma <= sigma + delta; // accumulate 
        end
        accum_rdy <= rollover;     // latch 'rdy' (to align with accum)
    end
end



//***********************************************************************
// 低通滤波器,均值滤波
//  Box filter Average
//
//	Acts as simple decimating Low-Pass Filter
//
//***********************************************************************

box_ave #(
    .ADC_WIDTH(ADC_WIDTH),
    .LPF_DEPTH_BITS(LPF_DEPTH_BITS))
box_ave (
    .clk(clk),
    .rstn(rstn),
    .sample(accum_rdy),
    .raw_data_in(accum),
    .ave_data_out(digital_out),
    .data_out_valid(sample_rdy)
);

//************************************************************************
//
// Sample Control - Accumulator Timing 采样转换时序控制
//	
//************************************************************************

always @(posedge clk or negedge rstn)
begin
	if( ~rstn ) begin
		counter <= 0;
		rollover <= 0;
		end
	else begin
		counter <= counter + 1;       // running count
		rollover <= &counter;         // assert 'rollover' when counter is all 1's
		end
end

endmodule

将二进制数转换成BCD码的形式,采用左移加三的算法(以8’hff为例): 1、左移要转换的二进制码1位 2、左移之后,BCD码分别置于百位、十位、个位 3、如果移位后所在的BCD码列大于或等于5,则对该值加3 4、继续左移的过程直至全部移位完成。这部分也可以直接移植电子森林案例中的代码。本模块负责将ADC提供的二进制代码转为十进制,方便后续模块的显示。

module bintobcd
(
input						rst_n,	//系统复位,低有效
input		[15:0]			bin_code,	//需要进行BCD转码的二进制数据
output	reg	[19:0]			bcd_code	//转码后的BCD码型数据输出
);

/*
此模块为了将ADC采样的数据转换为我们常用的十进制显示而存在,
主要知识涉及数学中不同制式数据的转换,详细原理这里不做介绍,去百度搜索<FPGA 二进制转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 //循环16次  
			//BCD码各位数据作满5加3操作,
			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
  • OLED显示 

OLEDshow 负责把采集到的ADC数据显示在OLED屏上。此款开发板的OLED显示屏也是SPI形式通信的,我们可以找到使用它的基础程序,然后按照项目需求,把采集到的十进制电压值显示上去就可以了。此处只提供核心部分修改代码。

				MAIN:begin
						if(cnt_main >= 5'd14) cnt_main <= 5'd13;//接下来执行空操作,实现数据只刷新一次【注】需要刷新时,别忘记改
						else cnt_main <= cnt_main + 1'b1;
						case(cnt_main)	//MAIN状态							
							5'd0 :	begin state <= INIT; end
																														
							5'd1 :	begin y_p <= 8'hb0; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16;  char <= "                ";state <= SCAN; end//y_p是行,x_ph是列起始地址高位
							5'd2 :	begin y_p <= 8'hb1; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16;  char <= "                ";state <= SCAN; end												
							5'd3 :	begin y_p <= 8'hb2; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "                ";state <= SCAN; end
							5'd4 :	begin y_p <= 8'hb3; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "Volt meter :    ";state <= SCAN; end
							5'd5 :	begin y_p <= 8'hb4; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "                ";state <= SCAN; end
							5'd6 :	begin y_p <= 8'hb5; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "       . V      ";state <= SCAN; end
							5'd7 :	begin y_p <= 8'hb6; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "                ";state <= SCAN; end
							5'd8 :	begin y_p <= 8'hb7; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "                ";state <= SCAN; end							
							5'd9 :	begin y_p <= 8'hb0; x_ph <= 8'h12; x_pl <= 8'h00; mem_hanzi_num <= 8'd0; state <= CHINESE; end
							5'd10:	begin y_p <= 8'hb0; x_ph <= 8'h13; x_pl <= 8'h00; mem_hanzi_num <= 8'd2; state <= CHINESE; end
							5'd11 :	begin y_p <= 8'hb0; x_ph <= 8'h14; x_pl <= 8'h00; mem_hanzi_num <= 8'd4; state <= CHINESE; end
							5'd12:	begin y_p <= 8'hb0; x_ph <= 8'h15; x_pl <= 8'h00; mem_hanzi_num <= 8'd6; state <= CHINESE; end
							
							5'd13 :	begin y_p <= 8'hb5; x_ph <= 8'h13; x_pl <= 8'h00; num <= 5'd1; char <=data[7:4];state <= SCAN; end
							5'd14:	begin y_p <= 8'hb5; x_ph <= 8'h14; x_pl <= 8'h00; num <= 5'd1; char <=data[3:0];state <= SCAN; end		
							
							//default: state <= IDLE;   //如果你需要动态刷新一些信息,此行应该取消注释
						endcase
					end
  • 图片展示

FuGo7Z85ulXJTETreaAlYEl4pdyf

四.项目总结

      完成本次项目很简单,其主要原因是很多有用的、难的代码其实硬禾学堂和电子森林里都已经提供了现成的范例,我们只需要进行封装和适量的修改就可以了。比如说ADC的采集与OLED的通信等,已经为我们提供了很好的例程,很多是可以直接拿来用的,对于一个FPGA和Verilog的初学者来说这是很友好的。通过本次项目的学习,我大致了解了Verilog和FPGA的部分知识,为后面学校开设的课程进行了一个先导性的学习。同时,完成本次项目,还提高了我的信息搜集能力,能够在网上找到很多自己需要的东西,这是很有用的。

通过本次项目,我主要收获和掌握了:

  1. ADC及其工作模式;
  2. SPI通信模式;
  3. OLED的显示模式,看懂FPGA写OLED;
  4. PLL的使用
  5. 思维导图配合收集资料的方式;
  6. 系统时钟与PLL配合使用;

设计制作中遇到的困难:

  • verilog语言规范,各符号、语句块的含义;

      解决方法:查阅stepfpga新手教程菜鸟教程,记录笔记。

  • sigma-delta ADC采样原理
  • 对PWM的不熟悉;

      解决方法:硬禾学堂的fpga入门教程、电子森林中的资料

  • 不清楚SPI的通信协议;
  • 很难用OLED显示自己想显示的东西;

      解决方法:小脚丫百科和csdn

  • 进制转换

上述问题的解决方法基本都在文本的链接中了,不过对于时序分析以及状态机的使用还是只停留在听说,导致自己在遇到静态时序错误的时候无从下手,希望自己在以后巩固好数电模电这类基础知识,通过进一步的学习和练习,提高自身的编程能力。非常感谢本平台给我带来的帮助!

附件下载
volt_meter.rar
程序
资源报告.pdf
资源报告
团队介绍
电子信息工程
团队成员
niuniu
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号