基于FPGA的数字示波器
基于FPGA和单片机的数字存储示波器
基于FPGA和单片机的数字存储示波器摘要:随着时代的发展,示波器作为电子行业中一种常用的测试工具,在电子技术工作中起着不可替代的作用。
目前新的技术应用越来越多,用户的测试需求不断变化,然而市面上的数字存储示波器大多价格昂贵、体型庞大,很难携带或者安放,对于一些只进行简单测量不太实用。
数字存储示波器是20世纪70年代,发展起来的一种新型示波器。
今后市场的发展让示波器需要面对更多的应用,数字示波器功能集成趋势明显,与此同时,除了追求强大的功能以外,外观精美、款式小巧,便于携带也成为一个发展趋势。
本次设计利用单片机、FPGA和AD设计一款大众化的数字滤波器,成本低、体积小、便于携带、使用方便,能够完成基本的测试,如:存储并显示波形,测量信号的频率、幅度等。
1 方案论证与比较1.1 方案一:DSP+FPGA开发起来比较灵活,升级也较为容易,通用性较强。
同时利用了DSP运算速度来提高整个系统的算法效率;同时采用这种架构开发起来相对比较简单,因为它结合了FPGA 和DSP两者的优点。
所以它适合于实时信号处理。
在实时信号处理的过程中,对DSP的速度要求高,这样能同时使得整个系统既有其高速的处理速度,同时也不失其灵活性。
但是DSP在和与外围电路接口的时候,比如说LCD显示器和键盘电路进行通信的时候,因为DSP速度非常快。
而LCD和键盘的速度都很慢,DSP的优势没有得到利用。
1.2 方案二:利用超大规模可编程器件FPGA来控制高速A/D转换器和RAM实现高速数据采集,并且用它来进行数据的存储与处理。
由于超大规模可编程器件是全硬件的,所以速度快,稳定性好,利用较少的外围器件就可以实现复杂的逻辑和时序控制功能,是较为理想的方案。
这种方案实际上是一种片上系统(System On Chip),即用单个芯片完成所有的控制与数据处理,并且还是全硬件的。
但是该方案实现起来非常困难,并且成本非常高,所以没有采用这种方案。
1.3 方案三:该方案采用FPGA和MSP430单片机来实现。
【FPGA设计实例】基于FPGA的数字示波器设计
【FPGA设计实例】基于FPGA的数字示波器设计Digital oscilloscopeA digital oscilloscope has many advantages over its analog counterpart, like the ability to capture single events, and to display what happens before the trigger.You can build a digital oscilloscope simply by hooking an ADC and an FPGA together.This particular design uses an 100MHz flash ADC, so we are building an 100MSPS(mega-samples-per-seconds) oscilloscope.This oscilloscope design is interesting because it shows how powerful and useful modern FPGAs can be. But if you are new to FPGA technology, keep that in mind this is not the easiest design to understand on this site.HDL designOr how to create the oscilloscope logic inside the FPGA.•HDL part 1 - FIFO-based design.•HDL part 2 - RAM-based design.•HDL part 3 - Trigger mechanism.•HDL part 4 - More functionality.Hardware•This design was created using the Flashy boards.•See also the "hands-on" page on how to build a simple oscilloscope. Software•History, features, screen shots.•See also the interference patterns page.ScreenshotHere's the view of a 27MHz signal, sampled at 100MHz and reconstructed using the "sample equivalent time" technique.Digital oscilloscope - part 1Here's what is built here:The FPGA receives 2 clocks:• A slow "system" clock, fixed at 25MHz.•An ADC sampling clock (something faster, let's say 100MHz), that is connected to both the ADC and the FPGA.Having these 2 clocks gives flexibility to the design. But that also means we need a way to transfer information from one clock domain to the other. To validate that the hardware works,let's go the easy route and use a FIFO. The acquired samples from the ADC are stored in the FPGA FIFO at full ADC speed (100MHz).Then, the FIFO content is read back, serialized and sent on a serial port at a much slower speed (115200 baud). Finally we connect the serial output to a PC that receives each byte and displays a signal trace.For this first attempt, there is no trace triggering mechanism. The ADC storage starts at random intervals so the trace will jump left and right, but that's fine for now.Design considerationsAt 100MHz, the FIFO fills up in about 10us. That's pretty fast. Once full, we have to stop feeding it. What is stored needs to be completely sent to the PC before we can start feeding the FIFO again.The serial communication used here works at 115200 bauds, so roughly 10KBytes/s. 1024 samples take about 100ms to transmit. During that time, the oscilloscope is "blind", because we discard the data coming from the ADC. So it is blind 99.99% of the time. That's typical of this type of architecture.That can be partially compensated when we add a trigger mechanism later, because while the trigger is armed, it works at full ADC speed and can stay armed as long as it takes for the trigger condition to happen. More on that later.Register the inputsThe ADC output data bus is connected to the FPGA using 8 pins that we call "data_flash[7:0]". These come at speed of up to 100MHz. Since this is fast, it is best to "register" them right when they come in the FPGA.reg [7:0] data_flash_reg;always @(posedge clk_flash) data_flash_reg <= data_flash;Now "data_flash_reg" is fully internal to the FPGA and can be fed to the FPGA FIFO. The FIFOThe FIFO is 1024 words deep x 8 bits wide. Since we receive 8 bits per clock from the ADC, we can store 1024 ADC samples. At 100MHz, it takes about 10us to fill up the FIFO.The FIFO uses synchronous static RAM blocks available inside the FPGA. Each storage block can store typically 512x8bits. So the FIFO uses 2 blocks.The FIFO logic itself is created by using the FPGA vendor "function builder". Xilinx calls it "coregen" while Altera "Megafunctions wizard". Here let's use Altera's Quartus to create this file.So now, using the FIFO is just a connectivity issue.fifomyfifo(.data(data_flash_reg), .wrreq(wrreq), .wrclk(clk_flash), .wrfull(wrfull), .wrempty(w rempty), .q(q_fifo), .rdreq(rdreq), .rdclk(clk), .rdempty(rdempty));Using a FIFO is nice because it takes care of the different clocks. We connected the write side of the FIFO to the "clk_flash" (100MHz), and the read side of the FIFO to "clk" (25MHz).The FIFO provides the full and empty signals for each clock domain. For example, "wrempty" is an empty signal that can be used in the write clock domain ("clk_flash"), and "rdempty" can be used in the read clock domain ("clk").Using the FIFO is simple: Writing to it is just a matter of asserting the "wrreq" signal (and providing the data to the ".data" port), while reading from it a matter of asserting "rdreq" (and the data comes on the ".q" port).Writing to the FIFOTo start writing to the FIFO, we wait until it is empty. Of course, at power-up (after the FPGA is configured), that is true.We stop only when it gets full. And then the process starts again... we wait until it is empty... feed it until it is full... stop.reg fillfifo;always @(posedge clk_flash)if(~fillfifo)fillfifo <= wrempty; // start when emptyelsefillfifo <= ~wrfull; // stop when fullassign wrreq = fillfifo;Reading to the FIFOWe read from the FIFO as long as it is not empty. Each byte read is send to a serial output.wire TxD_start = ~TxD_busy & ~rdempty;assign rdreq = TxD_start;async_transmitterasync_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data( q_fifo));We use the async_transmitter module to serialize the data and transmit it to a pin called "TxD".Complete designOur first working oscilloscope design, isn't that nice?module oscillo(clk, TxD, clk_flash, data_flash);input clk;output TxD;input clk_flash;input [7:0] data_flash;reg [7:0] data_flash_reg; always @(posedge clk_flash) data_flash_reg <= data_flash;wire [7:0] q_fifo;fifomyfifo(.data(data_flash_reg), .wrreq(wrreq), .wrclk(clk_flash), .wrfull(wrfull), .wrempty(w rempty), .q(q_fifo), .rdreq(rdreq), .rdclk(clk), .rdempty(rdempty));// The flash ADC side starts filling the fifo only when it is completely empty,// and stops when it is full, and then waits until it is completely empty againreg fillfifo;always @(posedge clk_flash)if(~fillfifo)fillfifo <= wrempty; // start when emptyelsefillfifo <= ~wrfull; // stop when fullassign wrreq = fillfifo;// the manager side sends when the fifo is not emptywire TxD_busy;wire TxD_start = ~TxD_busy & ~rdempty;assign rdreq = TxD_start;async_transmitterasync_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data( q_fifo));endmoduleDigital oscilloscope - part 2The FIFO allowed us to get a working design very quickly.But for our simple oscilloscope, it is overkill.We need a mechanism to store data from one clock domain (100MHz) and read it in another (25MHz). A simple dual-port RAM does that.The disadvantage of not using a FIFO is that all the synchonization between the 2 clock domains (that the FIFO was doing for us) has to be done "manually" now.TriggerThe "FIFO based" oscilloscope design didn't have an explicit trigger mechanism.Let's change that. Now the oscilloscope will be triggered everytime it receives a character from the serial port. Of course, that's still not a very useful design, but we'll improved on that later.We receive data from the serial port:wire [7:0] RxD_data;async_receiverasync_rxd(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data ));Everytime a new character is received, "RxD_data_ready" goes high for one clock. We use that to trigger the oscilloscope.SynchronizationWe need to transfer this "RxD_data_ready went high" information from the "clk" (25MHz) domain to the "clk_flash" (100MHz) domain.First, a signal "startAcquisition" goes high when a character is received.reg startAcquisition;wire AcquisitionStarted;always @(posedge clk)if(~startAcquisition)startAcquisition <= RxD_data_ready;elseif(AcquisitionStarted)startAcquisition <= 0;We use synchronizers in the form of 2 flipflops (to transfer this "startAcquisition" to the other clock domain).reg startAcquisition1; always @(posedge clk_flash) startAcquisition1 <= startAcquisition; reg startAcquisition2; always @(posedge clk_flash) startAcquisition2 <= startAcquisition1;Finally, once the other clock domain "sees" the signal, it "replies" (using another synchronizer "Acquiring").reg Acquiring;always @(posedge clk_flash)if(~Acquiring)Acquiring <= startAcquisition2; // start acquiring?elseif(&wraddress) // done acquiring?Acquiring <= 0;reg Acquiring1; always @(posedge clk) Acquiring1 <= Acquiring;reg Acquiring2; always @(posedge clk) Acquiring2 <= Acquiring1;assign AcquisitionStarted = Acquiring2;The reply resets the original signal.Dual-port RAMNow that the trigger is available, we need a dual-port RAM to store the data.Notice how each side of the RAM uses a different clock.ram512 ram_flash(.data(data_flash_reg), .wraddress(wraddress), .wren(Acquiring), .wrclock(clk_flash),.q(ram_output), .rdaddress(rdaddress), .rden(rden), .rdclock(clk));The ram address buses are created easily using binary counters.First the write address:reg [8:0] wraddress;always @(posedge clk_flash) if(Acquiring) wraddress <= wraddress + 1;and the read address:reg [8:0] rdaddress;reg Sending;wire TxD_busy;always @(posedge clk)if(~Sending)Sending <= AcquisitionStarted;elseif(~TxD_busy)beginrdaddress <= rdaddress + 1;if(&rdaddress) Sending <= 0;endNotice how each counter uses a different clock.Finally we send data to the PC:wire TxD_start = ~TxD_busy & Sending;wire rden = TxD_start;wire [7:0] ram_output;async_transmitterasync_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data( ram_output));The complete designmodule oscillo(clk, RxD, TxD, clk_flash, data_flash);input clk;input RxD;output TxD;input clk_flash;input [7:0] data_flash;///////////////////////////////////////////////////////////////////wire [7:0] RxD_data;async_receiverasync_rxd(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data ));reg startAcquisition;wire AcquisitionStarted;always @(posedge clk)if(~startAcquisition)startAcquisition <= RxD_data_ready;elseif(AcquisitionStarted)startAcquisition <= 0;reg startAcquisition1; always @(posedge clk_flash) startAcquisition1 <= startAcquisition ; reg startAcquisition2; always @(posedge clk_flash) startAcquisition2 <= startAcquisition1;reg Acquiring;always @(posedge clk_flash)if(~Acquiring)Acquiring <= startAcquisition2;elseif(&wraddress)Acquiring <= 0;reg [8:0] wraddress;always @(posedge clk_flash) if(Acquiring) wraddress <= wraddress + 1;reg Acquiring1; always @(posedge clk) Acquiring1 <= Acquiring;reg Acquiring2; always @(posedge clk) Acquiring2 <= Acquiring1;assign AcquisitionStarted = Acquiring2;reg [8:0] rdaddress;reg Sending;wire TxD_busy;always @(posedge clk)if(~Sending)Sending <= AcquisitionStarted;elseif(~TxD_busy)beginrdaddress <= rdaddress + 1;if(&rdaddress) Sending <= 0;endwire TxD_start = ~TxD_busy & Sending;wire rden = TxD_start;wire [7:0] ram_output;async_transmitterasync_txd(.clk(clk), .TxD(TxD), .TxD_start(TxD_start), .TxD_busy(TxD_busy), .TxD_data( ram_output));///////////////////////////////////////////////////////////////////reg [7:0] data_flash_reg; always @(posedge clk_flash) data_flash_reg <= data_flash;ram512 ram_flash(.data(data_flash_reg), .wraddress(wraddress), .wren(Acquiring), .wrclock(clk_flash),.q(ram_output), .rdaddress(rdaddress), .rden(rden), .rdclock(clk));endmoduleDigital oscilloscope - part 3Our first trigger is simple - we detect a rising edge crossing a fixed threshold. Since we use an 8-bit ADC, the acquisition range goes from 0x00 to 0xFF.So let's set the threshold to 0x80 for now.Detecting a rising edgeIf a sample is above the threshold, but the previous sample was below, trigger!reg Threshold1, Threshold2;always @(posedge clk_flash) Threshold1 <= (data_flash_reg>=8'h80);always @(posedge clk_flash) Threshold2 <= Threshold1;assign Trigger = Threshold1 & ~Threshold2; // if positive edge, trigger!Mid-display triggerOne great feature about a digital scope is the ability to see what's going on before the trigger.How does that work?The oscilloscope is continuously acquiring. The oscilloscope memory gets overwritten over and over - when we reach the end, we start over at the beginning. But if a trigger happens, the oscilloscope keeps acquiring for half more of its memory depth, and then stops. So it keeps half of its memory with what happened before the trigger, and half of what happened after.We are using here a 50% or "mid-display trigger" (other popular settings would have been 25% and 75% settings, but that's easy to add later).The implementation is easy. First we have to keep track of how many bytes have been stored. reg [8:0] samplecount;With a memory depth of 512 bytes, we first make sure to acquire at least 256 bytes, then stop counting but keep acquiring while waiting for a trigger. Once the trigger comes, we start counting again to acquire 256 more bytes, and stop.reg PreTriggerPointReached;always @(posedge clk_flash) PreTriggerPointReached <= (samplecount==256);The decision logic deals with all these steps:always @(posedge clk_flash)if(~Acquiring)beginAcquiring <= startAcquisition2; // start acquiring?PreOrPostAcquiring <= startAcquisition2;endelseif(&samplecount) // got 511 bytes? stop acquiringbeginAcquiring <= 0;AcquiringAndTriggered <= 0;PreOrPostAcquiring <= 0;endelseif(PreTriggerPointReached) // 256 bytes acquired already?beginPreOrPostAcquiring <= 0;endelseif(~PreOrPostAcquiring)beginAcquiringAndTriggered <= Trigger; // Trigger? 256 more bytes and we're set PreOrPostAcquiring <= Trigger;if(Trigger) wraddress_triggerpoint <= wraddress; // keep track of where the trigger happenedendalways @(posedge clk_flash) if(Acquiring) wraddress <= wraddress + 1;always @(posedge clk_flash) if(PreOrPostAcquiring) samplecount <= samplecount + 1;reg Acquiring1; always @(posedge clk) Acquiring1 <= AcquiringAndTriggered;reg Acquiring2; always @(posedge clk) Acquiring2 <= Acquiring1;assign AcquisitionStarted = Acquiring2;Notice that we took care of remembering where the trigger happened. That's used to determine the beginning of the sample window in the RAM to send to the PC.reg [8:0] rdaddress, SendCount;reg Sending;wire TxD_busy;always @(posedge clk)if(~Sending)beginSending <= AcquisitionStarted;if(AcquisitionStarted) rdaddress <= (wraddress_triggerpoint ^ 9'h100);endelseif(~TxD_busy)beginrdaddress <= rdaddress + 1;SendCount <= SendCount + 1;if(&SendCount) Sending <= 0;endDigital oscilloscope - part 4Now that the oscilloscope skeleton is working, it is easy to add more functionality. Edge-slope triggerLet's add the ability to trigger on a rising-edge or falling-edge. Any oscilloscope can do that.We need one bit of information to decide with direction we want to trigger on. Let's use bit-0 of the data sent by the PC.assign Trigger = (RxD_data[0] ^ Threshold1) & (RxD_data[0] ^ ~Threshold2);That was easy.More optionsLet's add the ability to control the trigger threshold. That's an 8-bits value. Then we require horizontal acquisition rate control, filtering control... That requires multiple control bytes from the PC to control the oscilloscope.The simplest approach is to use the "async_receiver" gap detection feature. The PC sends control bytes in burst, and when it stops sending, the FPGA detects it and assert an "RxD_gap" signal.wire RxD_gap;async_receiverasync_rxd(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data ), .RxD_gap(RxD_gap));reg [1:0] RxD_addr_reg;always @(posedge clk) if(RxD_gap) RxD_addr_reg <= 0; else if(RxD_data_ready)RxD_addr_reg <= RxD_addr_reg + 1;// register 0: TriggerThresholdreg [7:0] TriggerThreshold;always @(posedge clk) if(RxD_data_ready & (RxD_addr_reg==0)) TriggerThreshold <=RxD_data;// register 1: "0 0 0 0 HDiv[3] HDiv[2] HDiv[1] HDiv[0]"reg [3:0] HDiv;always @(posedge clk) if(RxD_data_ready & (RxD_addr_reg==1)) HDiv <=RxD_data[3:0];// register 2: "StartAcq TriggerPolarity 0 0 0 0 0 0"reg TriggerPolarity;always @(posedge clk) if(RxD_data_ready & (RxD_addr_reg==2)) TriggerPolarity <= RxD_data[6];wire StartAcq = RxD_data_ready & (RxD_addr_reg==2) & RxD_data[7];We've also added a 4 bits register (HDiv[3:0]) to control the horizontal acquisition rate. When we want to decrease the acquisition rate, either we discard samples coming from the ADC, or we filter/downsample them at the frequency we are interested in.More and more featuresAs you can see, there are lots of features that can be added. The interesting thing is that you can design the oscilloscope the way you need it - maybe a special trigger mechanism? a special filtering function?Your turn to experiment.。
电子设计大赛基于FPGA的数字示波器
本系统基于示波器的基本原理,通过阻抗匹配和程控放大对被测信号处理后,利用ADC9220以不同的采样率对信号进行实时采样和等效采样,使示波器输入阻抗≥1MΩ,并实现了对频率范围10Hz~20MHz,峰峰值10mV~8V的输入信号垂直分辨率1V/div、0.1V/div、2mV/div三档可调,水平扫描速度20ms/div、200us/div、20 us/div、2 us/div、100 ns/div五档可调。
利用软件检波和等精度测频的方法,达到了题目中信号电压、频率测量误差≤5%的要求。
仪器采用内部触发方式,且实现了触发电平可调,增加了存储/调出、单次触发及波形水平移动的功能。
该系统采用矩阵键盘和点阵式液晶显示器,人机界面友好,操作简单方便。
一、系统总体实现方案系统由分辨率控制模块,触发控制模块,软件检波模块,存储/释放与单次触发控制模块,内部双口RAM,人机交互控制模块构成。
用户通过人机交互选择需要示波器实现的功能。
单片机经总线对FPGA 内部各个硬件电路模块进行控制,各个模块间经由总线进行数据交换。
在选择不同的水平、垂直分辨率时,在89S52的控制下,程控放大选择不同的档位,AD9220采用不同的采样速度。
AD9220将信号送入双口RAM中,并能在通用示波器中显示信号波形,其中,扫描速度要求含20ms/div、1ms /div、20μs /div、2μs /div、200 ns/div 五档,垂直灵敏度要求含1V/div、0.1V/div、2mV/div三档。
此外,系统还具有单次触发、存储波形、波形水平移动等功能可供选择。
二、系统实现框图图1系统实现框图三、理论分析与计算1.AD采样率的分析为了实现题目要求的扫描速度,需要控制系统的AD采样率,在信号显示时每一屏为200个点且水平分辨率≥20点/div的情况下,最高采样率为1Msa/s时,可以达到的扫描速度为20us/div。
为达到更高的扫描速度,需采用等效采样。
fpga 示波器 算法
fpga 示波器算法
FPGA(现场可编程门阵列)示波器算法是指基于FPGA平台,实现对波形的采集、显示和分析的算法。
下面是一种基于FPGA的数字示波器频率计算方式:
常用的频率测量方法有两种:周期测量法和频率测量法。
周期测量法是先测量出被测信号的周期T,然后根据频率f=1/T求出被测信号的频率。
频率测量法是在时间t内对被测信号的脉冲数N进行计数,然后求出单位时间内的脉冲数,即为被测信号的频率。
等精度测量的一个最大特点是测量的实际门控时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。
在计数允许时间内,同时对基准时钟和被测信号进行计数,再通过数学公式推导得到被测信号的频率。
由于门控信号是被测信号的整数倍,就消除了对被测信号产生的±1周期误差,但是会产生对基准时钟±1周期的误差。
在实际应用中,FPGA示波器算法需要根据实际需求进行调整和优化,以满足不同的测试需求。
基于FPGA的数字示波器串行总线SPI触发设计
基于FPGA的数字示波器串行总线SPI触发设计
彭海军
【期刊名称】《电子科学技术》
【年(卷),期】2014(000)002
【摘要】数字示波器的触发系统主要包括触发同步比较器、触发源选择、异步触发、触发释抑、同步触发、双斜坡扩展、内插计数等,常用的触发类型有边沿、脉宽、TV和电源触发等,这几种触发类型可以满足大部分应用场合的要求,但是针
对串行总线领域,已经不能满足要求。
SPI是一种高速的、全双工、同步的串行通信总线,应用十分广泛。
本文介绍了一种数字示波器串行总线SPI触发的设计方法,采用FPGA来实现,资金投入低,开发周期短,且具有极高的触发精度和准确度,并使用软件Modelsim6.5进行设计仿真。
【总页数】4页(P144-147)
【作者】彭海军
【作者单位】电子信息测试技术安徽省重点实验室,安徽蚌埠,233006
【正文语种】中文
【中图分类】TP335+.1
【相关文献】
1.基于SPI串行总线的语音接口电路的软硬件设计 [J], 郭小波;刘永平
2.基于FPGA的串行总线的信号发送卡设计 [J], 赵宏钧;陆健;张乐年
3.基于FPGA的高速同步串行总线设计 [J], 黄润龙
4.基于FPGA的异步串行总线设计 [J], 黄振;郭日峰
5.利用示波器解决嵌入式系统中I2C和SPI串行总线设计挑战 [J], 陈鑫磊
因版权原因,仅展示原文概要,查看原文内容请购买。
基于FPGA数字示波器设计
摘要高速数字化采样技术和FPGA技术的发展,已经开始对传统测试仪器,包括现有的数字化仪器发展产生着深刻的影响,对传统仪器体系结构,传统测量方法,传统仪器的定义和分类等都将产生深刻的变革。
近几年来,数字仪器通常采用DSP或FPGA结构,从信息处理技术的发展上看,以FPGA为基础的软件硬件化是其重要的发展方向,本文设计的基于FPGA的数字示波器,是由单片机和FPGA相结合的方式组成,即用单片机完成人机界面,系统调控,用FPGA完成数据采集,数据处理等功能。
由通道输入调整,数据采集,数据处理,波形显示和操作界面等功能模块组成,系统中的数据采集及数据处理模块,采用了FPGA 内制的RAM IP核,使系统的工作频率基本不受外围器件影响。
设计中采用了自顶向下的方法,将系统按逻辑功能划分模块,各模块使用VHDL语言进行设计,在ISE中完成软件的设计和仿真关键词:FPGA 数字示波器数字采样AbstractHigh-speed digital sampling and FPGA technology has begun to influnence the development of traditional test equipment, including existing digital instruments , the architecture of traditional instruments, traditional measurement methods, definition and classification of traditional instruments and so will produce profound changes.In recent years, independent instrument is made up of DSP or FPGA structure, from the point of information processing technology development, to FPGA based hardware of software is an important direction of development, the paper design FPGA-based digital oscilloscope, which combines a single chip and FPGA , namely, with a microcontroller for interface and system control, with the FPGA for data acquisition, data processing and other functions. It is made up of adjustable channel input, data acquisition, data processing,waveform display and user interface features such as modules, the system of data collection and data processing module, using the FPGA within the system RAM IP core, which make a great significance on the data processing speed and real-time entry requirements. Using top-down approach, the system is logical and functional modules, each module is designed using the VHDL language, completed in the ISE software .Keywords: FPGA,Digital Oscilloscope,Digital Sampling目录摘要 (1)第一章绪论 (5)1.1研究概况与意义 (5)1.2 主要工作 (6)第二章数字示波器的工作原理 (8)2.1 工作原理框图 (8)2.1.1 数字示波器系统框图 (8)2.2 采样定理 (9)2.3 频率测量 (10)2.3.1高频双计数器测量方法 (10)2.3.2大范围双计数器测量法 (11)2.3.3 等精度测量法 (11)2.4扫描速度 (12)第三章硬件电路 (13)3.1 系统组成结构 (13)3.2放大电路 (14)3.2.1程控衰减放大器电路 (15)3.2.2 ADS830的应用 (16)3.2.3 放大器AD603介绍 (17)3.3整形电路 (20)3.3.1信号整形电路设计 (20)3.4采样与保持电路 (21)3.4.1 随机采样 (21)3.4.2 采样与保持电路设计 (22)3.5 数据采集电路 (22)3.5.1 FIFO的选择 (23)3.5.2 随机采样展宽电路 (23)3.6 电路的保护及滤波处理 (24)第四章 FPGA软件设计及仿真 (25)4.1分频电路及产生A/D转换器的控制信号 (25)4.2 FIFO功能单元设计 (26)4.3双口RAM (27)4.4液晶显示及键盘模块 (27)4.5系统软件住程序设计 (28)第五章实验结果 (29)5. 1 垂直灵敏度测试 (29)5. 2 水平扫描速度的测试 (29)总结 (30)参考文献 (31)第一章绪论与传统模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。
基于FPGA的简易数字示波器工作原理及方框图
基于FPGA的简易数字示波器工作原理及方框图摘要:本文介绍了一种基于FPGA的采样速度60Mbit/s的双通道简易数字示波器设计,能够实现量程和采样频率的自动调整、数据缓存、显示以及与计算机之间的数据传输。
关键词:数据采集;数字示波器;FPGA引言传统的示波器虽然功能齐全,但是体积大、重量重、成本高、等一系列问题使应用受到了限制。
有鉴于此,便携式数字存储采集器就应运而生,它采用了LCD显示、高速A/D采集与转换、ASIC芯片等新技术,具有很强的实用性和巨大的市场潜力,也代表了当代电子测量仪器的一种发展趋势,即向功能多、体积小、重量轻、使用方便的掌上型仪器发展。
系统组成结构及工作原理系统的硬件部分为一块高速的数据采集电路板。
它能够实现双通道数据输入,每路采样频率可达到60Mbit/s。
从功能上可以将硬件系统分为:信号前端放大及调理模块、高速模数转换模块、FPGA逻辑控制模块、单片机控制模块、USB数据传输模块、液晶显示和键盘控制等几部分,其结构形式如图1所示。
图1 系统原理结构图输入信号经前置放大及增益可调电路转换后,成为符合A/D转换器要求的输入电压,经A/D转换后的数字信号,由FPGA内的FIFO缓存,再经USB接口传输到计算机中,供后续数据处理,或直接由单片机控制将采集到的信号显示在液晶屏幕上。
高速数据采集模块本系统可实现双通道同步数据采集,而且每通道的采集速度要达到60Mbit/s,考虑到两路数据采集应保持同步并行,因此在设计中采用每通道都有独自的采样保持器和A/D转换器。
选用MAXIM公司MAX1197型A/D 转换器,它是一款双通道、3.3V供电、每通道60Mbit/s采样频率的模数转换器芯片。
它内部集成双路差分宽带采样保持器和A/D转换器,可以输出锁存,具有低功耗、小尺寸、高动态性能的特点。
本系统的测量电压的范围可达到±300V,采用示波器探头和电路板上分压的方法将输入信号先进行1:1或10:1或100:1衰减,然后再通过后续电路处理以满足A/D转换器的输入电压范围要求。
基于FPGA的嵌入式数字存储示波器
第九届电子设计竞赛论文所在院系:电控学院题目:基于FPGA嵌入式的双通道数字存储示波器作者:朱俊兰方威夏俊伟指导老师:柴钰二○一一年五月基于FPGA嵌入式的双通道数字存储示波器摘要:本设计是以FPGA为核心,结合衰减电路、程控放大电路、ADC采样、整形测频电路以及VGA显示模块实现了双通道数字存储示波器的设计。
用户可以获取当前输入波形的峰峰值、频率等信息,另外用户可以对波形实现存储和回显功能。
双通道的设计使得用户可以同时观察和对比两路波形,设计时充分利用了FPGA的高速数据处理能力,嵌入了诸多IP 软核组成SOPC系统,尤其是NiosII软核的嵌入,使得在一块FPGA上完成了数据采集、存储、处理、显示等所有功能,使得系统更为简洁、稳定。
关键词:FPGA NiosII SOPC VGA ADS830E1、引言数字存储示波器(Digital Storage Oscilloscopes,简称DSO)是随着数字模拟电路技术和数字处理技术(尤其是微型计算机的发展)的发展而日益强大的一种具有存储波形功能的示波器。
和传统示波器相比,数字示波器具有体积轻巧功耗低、使用方便且波形可存储,对波形可以进行复杂数学分析等优点。
在诸多领域中,数字示波器已经完全取代模拟示波器,但是在国内,数字示波器的市场一直为外国厂商(安捷伦、泰克等)虽占据,而且价格不菲,这样,对于像我们学生这样的消费者根本无法支付,那么,本文就基于此,研究探讨了一种基于FPGA的DIY示波器的方案。
经过我们的不断测试,在低端场合,这样一款数字示波器完全合乎需求。
2、方案设计2.1总体方案描述系统的组成框图如图2.1所示,包括输入信号耦合选择、双路程控衰减放大、数据采集存储、数据处理、数据显示等部分。
信号分别从通道1、通道2输入,送入程控放大(衰减)电路进行放大(衰减),再对被放大(衰减)的信号进行电平调整后,送入高速ADC 对信号进行采样,FPGA则用于完成系统高速采样信号的存储及分频,并将波形显示在显示模块上。
基于FPGA的数字存储示波器对外围芯片的控制设计
基于FPGA的数字存储示波器对外围芯片的控制设计
数字存储作为测试技术的重要工具,被广泛应用于各个领域,并逐步取代传统模拟示波器。
其采样数据是波形运算和分析的基础,挺直影响到囫囵数字存储示波器的精确性。
从这点出来,提出采纳现场可编程规律器件( ) 作为数字存储示波器采样控制系统的核心,从芯片间有效帮助的角度,基于FPGA 设计接口通信控制模块和外围芯片驱动功能模块,以FPGA 为核心有效地组织其它芯片,共同完成数字存储示波器数据采样过程,确保数据按需求采样,有效地提高数字存储示波器的采样效率和数据的牢靠性。
1 数字存储示波器的总体设计计划
数字存储示波采纳双处理器( ARM + FPGA) 的系统设计计划,ARM 内嵌WINCE 操作系统,囫囵采样系统主要在FPGA 里完成,从功能的角度分成采样信息处理子系统与采样控制子系统,本文着重介绍采样控制子系统的驱动部分,由ARM 接口控制模块与芯片驱动模块组成。
1 所示: 图1 数字存储示波器总体功能模块图
2 系统驱动模块设计
2. 1 ARM 接口通信控制模块设计
ARM 接口通信控制模块为主要的控制模块,2 所示。
图2 ARM 接口通信控制部分功能模块图
加入这个模块而不挺直链接两个芯片有以下两点缘由:
1) ARM 作为主控芯片的控制模块,引脚数量有限。
假如ARM 接口挺直与FPGA 接口相连,会占用ARM 过多的接口。
第1页共8页。
基于fpga的数字示波器的设计任务书
基于fpga的数字示波器的设计任务书下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!基于FPGA的数字示波器的设计任务书1. 引言本文档旨在详细描述基于FPGA的数字示波器的设计任务,包括项目的背景、目标、关键要求以及预期的成果。
基于FPGA的数字示波器波形合成器研究
基于FPGA的数字示波器波形合成器研究
引言
波形刷新率是评判数字示波器性能优劣的重要指标之一,它直接体现了示波器抓取波形细节的能力,刷新率越高意味着捕获异常的能力越强。
目前国内示波器的最高波形刷新率在200000wfms/s左右,而高于200000wfms/s的基本上依赖进口。
国内示波器刷新率做不高的主要原因有2个:
①波形合成技术和国际先进水平相比,差距还比较大;
②波形存储采用外部存储器。
本文通过对示波器波形合成技术的深入研究,提出一种基于FPGA的高刷新率的波形合成器,刷新率可达到400000wfms/s,该波形合成器已经成功应用在高刷新率示波器中。
1、波形三维映射模型。
基于FPGA技术的数字存储示波器设计
第1章前言 (1)1.1数字存储示波器的发展概况 (2)1.2本文所做的研究工作 (2)2.1示波器的工作原理 (5)2.1.1模拟示波器的基本工作原理 (5)2.2数字(存储)示波器的工作原理 (6)第3章DSP处理器和FPGA的开发过程简介 (8)3.1 DSP处理器的开发过程和应用 (9)3.2 FPGA的开发过程与应用 (11)第4章整体设计方案 (14)4.1系统整体设计流程图 (14)4.2整个系统的性能指标 (15)4.3系统的实现方案 (16)4.4元器件的选择 (19)第5章整个系统硬件设计 (20)5.1前端数据采集部分硬件电路设计 (22)5.2 FPGA外围电路的设计和内部逻辑电路设计 (28)5.3 DSP部分的硬件设计 (40)第6章系统软件设计 (48)6.1 系统初始化 (48)6.2 数据处理的相关算法 (57)6.3波形显示程序 (60)参考文献 (66)摘要数字存储示波器在仪器仪表领域中占有重要的地位,应用范围相当广泛,所以对示波器的研制有重要的理论和实际意义。
本文针对数字存储示波器的设计进行了深入的研究,旨在研制出100MHz带宽的数字存储示波器。
从各个方面考虑,选用了DSP、FPGA和单片机的方案来设计整个系统。
整个系统采用单通道的方式。
信号进来首先经过前端的调节电路把信号电压调整到AD的输入电压范围之内,这里调节电路主要是由信号衰减电路和信号放大电路所组成。
调节后的信号再送到AD变换电路里面完成信号的数字化。
然后把AD转换后的数据送到FPGA中,并把数据保存到FPGA中的FIFO中,FPGA中的电路主要包括有FIFO、触发系统、峰值检测、时基电路等。
由于本文采用FPGA,使得数字存储示波器的设计比较灵活,容易升级。
可以根据自己的需要进行相关的改进,例如对外围电路做进一步地扩展。
关键词:DSP;FPGA;LCD;单片机;数字存储示波器ABSTRACTDigital storage oscilloscopes play an important role in the field of instrumentation,it has a wide range of applications,the development of the oscilloscope has a very important theoretical and practical significance.In this paper, we have do a lot of work to the design of digltal storage oscilloscope.The goal is aimed at the development of the repeat 100MHz bandwidth digital storage oscilloscope.Considereing from various aspects,we select DSP,FPGA and microcontroller to design the whole system.The whole system is single channel.The signa that come in from the first front-end have been changed a fit voltage which put into a voltage signal AD.Front-end circmts here mainly are composed of by signal attenuation and signal amplifier circuit.After the front-end,the signals have changes the digital signal the by AD circuit.This data has been sent to FPGA,the data is saved to the FIFO in theFPGA.The main circuit in the FPGA,including FIFO,the trigger system,the peak detection circuit,time-ased circuit,and so on.At the same time,the use of FPGA makes the design more flexible,and easier to upgrade,for example,it is possible to expand extemal circuit of oscilloscopes.KEY WORDS:DSP,FPGA,LCD ,microcontroller,digital storage oscilloscope第1章前言示波器应用非常广泛,包括工业、军事、科研、教育领域都有很大的应用。
基于FPGA的数字存储示波器的设计的开题报告
基于FPGA的数字存储示波器的设计的开题报告一、选题背景随着科技的不断进步和发展,数字化技术已成为当今各个领域的主流趋势,数字存储示波器便是其中之一。
数字存储示波器的优点在于数字化处理数据,能够有效地处理和分析信号,同时具有高速、高精度、高灵敏度等优点,因此被广泛用于电子工程、通信工程、机械工程等领域。
而基于FPGA的数字存储示波器则是电子工程领域内的一项重要技术,在满足科技迅速发展的同时,有着快速响应时间、高速数据处理等优点。
FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,具有灵活的可编程性和快速的实时数据处理能力,被广泛应用于数字系统中。
基于FPGA的数字存储示波器则是将数字存储示波器技术与FPGA技术相结合,使得数字存储示波器具有更高的性能和功能。
二、研究目的本次课题旨在研究设计一种基于FPGA的数字存储示波器,并实现以下功能:1. 采样率高:采用高速ADC转换器,并使用FPGA进行数字信号处理,实现高速的采样和存储。
2. 示波器屏幕显示:采用液晶显示屏或者其他显示屏,显示采集到的波形数据。
3. 波形记录和回放功能:实现对采集的波形数据的记录和回放,方便工程师进行数据分析和处理。
三、研究内容1. FPGA开发环境的搭建:使用Vivado或Quartus等软件工具,完成FPGA开发环境的搭建。
2. 高速ADC转换器的选择和接口设计:选择合适的高速ADC转换器,并设计其与FPGA的接口电路。
3. 数据存储与处理的实现:使用FPGA对采集的数据进行存储和处理,实现数字存储示波器的基本功能。
4. 示波器屏幕的显示:设计示波器屏幕的驱动电路,并实现波形数据的实时显示。
5. 波形记录和回放功能的实现:对采集到的波形数据进行存储和压缩,实现波形记录和回放功能。
四、技术路线技术路线如下:1. 硬件方面:采购合适的高速ADC转换器,设计合适的FPGA接口电路,并选择合适的显示屏或者液晶显示屏。
基于FPGA的数字示波器触发模块设计实验
基于FPGA的数字示波器触发模块设计实验一.实验目的1.熟悉数字存储示波器基本工作原理。
2.掌握触发系统的工作原理。
3.掌握在现有综合实践平台上开发DSO触发模块的方案及流程。
二.实验内容1.结合数据采集、存储和触发模块的FPGA代码,理解DSO的基本工作原理。
2.编写FPGA代码完善DSO的触发模块,重点实现预触发和脉宽触发功能。
三.预备知识1.了解综合实践平台硬件结构。
2.熟悉Xilinx ISE Design Suite 13.2开发环境使用方法。
3.熟悉Verilog HDL硬件描述语言的语法及运用。
四.实验设备与工具硬件:测试技术与嵌入式系统综合实践平台,PC机Pentium100 以上,XILINX USB调试下载器。
软件:PC机Win XP操作系统,Xilinx ISE Design Suite 13.2开发环境五.实验步骤1. 打开工程文件SYPT_FPGA.xise双击SYPT_FPGA.xise(E:/work/触发模块设计实验指导/试验程序/学生实验用未完成程序/PG1000/PG1000_FPGA_ADC目录下)2. 打开pre_trig_counter.v和PulWide.v文件,先根据定义好的模块端口输入输出信号,结合图4触发方案流程图,在提示添加代码处补充代码:a. 预触发控制模块(pre_trig_counter.v)模块内自己所定义的所有寄存器型变量应采用clr清零信号(低电平有效)进行同步清零,当count_en有效时,可定义一个预触发深度计数器与预触发深度(data时间值)进行比较,如果大小一致,则表明FIFO预触发深度满,此时可以产生一个预触发信号(cout)输出。
注意本模块工作时钟频率是250 MHz,因此,位数较大的计数器可拆分为多个位数较小的计数器进行级联计数。
b. 脉宽触发控制模块(PulWide.v)当sys_tri信号的上升沿到来时,可产生一脉冲宽度计数器使能信号并使这个使能信号有效,当使能信号有效时,计数器开始对标准时钟计数;当sys_tri信号的下降沿到来时,关闭脉冲宽度计数器使能信号,计数器停止计数,同时,比较判断出脉宽与脉冲宽度设定值width_set之间的关系。
基于FPGA的数字示波器设计
基于FPGA的数字示波器设计
随着信息技术的发展,对信号的测量技术要求越来越高,示波器的使用越来越广泛。
模拟示波器使用前需要进行校正,使用比较麻烦;而数字示波器,由于受核心控制芯片的影响,对输入信号的频率有严格的限制。
基于FPGA的数字示波器,其核心芯片可达到50万门,配合高速外围电路,可以测量频率为1 MHz的信号,有效地克服了以往示波器的不足。
1 系统方案设计
设计的数字示波器系统主要使用了Xilinx系统的开发环境,并在此环境内部建立了AD采样控制模块、键盘控制模块、VGA显示模块等多个模块,从很大程度上减少了硬件电路的搭建,也因此提高了系统的稳定性和可靠性,系统框图如图1所示。
另外,设计使用XPS将32位的MicroBlaze微处理器嵌入到了FPGA 中,实现了可编程片的嵌入以及在可编程片上的系统设计。
MieroBlaze通过。
基于FPGA的数字示波器电路模块设计
实验室科学LABORATORY SCIENCE 第22卷第3期2019年6月Vol.22No.3Jun.2019ISSN1672-4305CN12-1352/N基于FPGA的数字示波器电路模块设计赵秀丽-王晓娜',宋世德$(大连理工大学1.物理学院;2.土木工程学院,辽宁大连116024)摘要:如何利用新兴起的FPGA芯片设计岀生产生活中常用的仪器是电路设计中的重点和难点。
提出了一种新的实验思路,基于FPGA开发平台设计了一款数字示波器。
对VGA控制原理和电路设计、A/D控制电路设计、D/A控制电路设计三个模块进行了详细分析,其中A/D控制电路主要用TI公司生产的TLC549芯片实现,D/A控制电路通过一个串并联电阻网络来模拟实现。
整个设计操作简单,易于调节,显示直观。
通过实验测量和对比,具有良好的精度和采样率,符合对数字示波器的简易要求,具有一定的应用前景。
关键词:现场可编程门阵列;数字示波器;采样率中图分类号:TM935.37文献标识码:A doi:10.3969/j.issn.1672-4305.2019.03.019Design of circuit module based on FPGA for oscilloscopeZHAO Xiu-li1,WANG Xiao-na1,SONG Shi-de2(1.School of Physics; 2.School of Civil Engineering,Dalian University of Technology,Dalian 116024,China)Abstract:How to make use of emerging FPGA chips to design the frequently-used instruments are the circuit design of the key and difficult point.This paper presents a new experimental ideas,a digital oscilloscope is designed based on the FPGA development platform.The VGA control principle and circuit design,A/D control circuit design and D/A control circuit design are analyzed in detail.The A/D control circuit is mainly realized by the TLC549chip produced by TI Company,and the D/A control circuit is achieved by a series-parallel resistance network.The entire design is simple,easy to adjust, display intuitive.Through experimental measurement and comparison,with good accuracy and sampling ratio,in line with the simple requirements of digital oscilloscope,has a certain application prospect.Key words:FPGA;digital oscilloscope;sampling rate1研究内容及意义现场可编程门阵列(即FPGA)堪称半导体产业颠覆性的设计,FPGA在通信领域、算法实现领域以及嵌入式领域有了广泛且大规模的应用[1~2]0数字示波器不仅有着传统的模拟示波器所没有的诸多优点,而且数字示波器的波形更加容易存储,目前已经得到广泛应用,针对这一学习工作中常见的数字仪器,以及FPGA运行速度快、功耗低、管脚丰富、集成度更高等优点,研究了如何实现一个简单的数字基金项目:2016年辽宁省普通高等教育本科教学改革研究项目;大连理工大学实验室重点建设项目。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA的数字示波器论文题目:基于FPGA的数字示波器1.摘要 (4)2.原理 (4)3.系统方案对比及分析 (5)3.1.以FPGA来实现整个系统 (5)3.2.采用DSP与FPGA来实现整个系统 (5)3.3.采用FPGA与单片机来实现整个系统 (5)4.系统设计方案 (6)5.系统框图 (6)6.系统技术指标 (7)7.AD模块简介 (7)8.频率测量模块及方案比较 (7)8.1.测周期法 (8)8.2.测频率法 (8)8.3.方法选择及使用 (8)8.4.Verilog设计结构 (9)9.数据处理模块 (10)10.FIFO存储模块 (10)10.1.FIFO_1 (10)10.2.FIFO_2 (10)11.Nios II软核模块 (11)12.VGA显示 (11)13.系统软件构架设计 (12)13. Nios II软件实现 (14)14.1.DMA传输 (14)14.2.1.PIO中断 (15)14.系统的测试和分析 (16)15.总结 (23)16.参考文献 (24)1.摘要随着信息技术的发展,对信号的测量技术要求越来越高,示波器的使用越来越广泛。
数字示波器是模拟示波器技术、数字化测量技术、计算机技术的综合产物,他主要以微处理器、数字存储器、A/D转换器和D/A转换器为核心,输入信号首先经A/D转换器转换成数字信号,然后存储在RAM中,需要时再将RAM中的内容读出,经D/A转换器恢复为模拟信号显示在示波器上,或者通过接口与计算机相连对存储的信号作进一步处理,这样可大大改进显示特性,增强功能,便于控制和智能化。
这种数字示波器中看到的波形是由采集到的数据经过重构后得到的波形,而不是加到输入端上信号的波形。
设计提出一个经过优化的数据采集方法,辅以FPGA为主控制器和必备的外围电路完成了基于FPGA的数字存储示波器的设计。
系统最大限度地利用了FPGA的高速数字信号处理能力以及众多硬核和软核内嵌的特性,降低了成本和开发难度,且性能优良。
2.原理数字示波器具有存储数据的能力,数字存储就是在示波器中以数字编码的形式来贮存信号。
当信号进入数字存储示波器,或称 DSO 以后,在信号到达CRT 的偏转电路之前,示波器将按一定的时间间隔对信号电压进行采样。
然后用一个模/数变换器(ADC)对这些采样值进行变换从而生成代表每一个采样电压的二进制字。
这个过程称为数字化。
获得的二进制数值贮存在存储器中,对输入信号进行采样的速率称为采样速率。
采样速率由采样时钟控制。
对于一般使用情况来说,采样速率的范围从每秒 20 兆次(20MS/s)到 200MS/s。
存储器中贮存的数据用来在示波器的屏幕上重建信号波形。
所以,在DSO中的输入信号接头和示波器 CRT 之间的电路不只是仅有模拟电路。
输入信号的波形在 CRT 上获得显示之前先要存贮到存储器中,我们在示波器屏幕上看到的波形总是由所采集到数据重建的波形,而不是输入连接端上所加信号的直接波形显示。
示波器原理框图如下:3.系统方案对比及分析3.1.以FPGA来实现整个系统以可编程器件FPGA为主控来实现整个系统,设计时电路相对简洁,因为FPGA 的可编程性适用于模块化设计,内部集成大量电路模块,如A/D转换器,锁相环,甚至有些FPGA内部嵌入ARM相关处理器,DSP模块,电源模块,所以FPGA 可以实现DSP相关算法,可以做大量运算,并且它的处理速度由于其并行性,在协调多个模块的工作时候非常方便,控制能力强。
在整个数值示波器的设置中,通过采样数据然后存储,再做相应的数据处理,执行相关任务,完全可以实现示波器的基本功能,设计可行性非常高。
辅助一些外围电路模块,基本能实现设计期望达到的功能和参数。
3.2.采用DSP与FPGA来实现整个系统采用DSP和FPGA开发起来比较灵活,升级也容易,通用性强,在以FPGA为主控的同时辅以DSP作为信号处理,提高系统的效率。
但是DSP在与外围电路接口的时候,比如说LCD显示和键盘进行通信时候,因为DSP速度非常快,而LCD 显示器和键盘电路比较慢,会造成资源浪费。
3.3.采用FPGA与单片机来实现整个系统采用FPGA与单片机来实现,主要是利用单片机进行一些外部接口的监控,对键盘电路和显示电路实时更新,减轻FPGA主控的任务。
且单片机控制比较简单,现在大多单片机内设比较丰富,能很好地胜任工作。
但是这里使用单片机进行控制,增加了一些额外开销,且单片机任务比较简单,而且不多,本身FPGA集成一些内核可以进行比普通单片机更快的处理,再另外使用单片机有点多余。
综上,直接采用FPGA为主控芯片,资源足够丰富,就能很好地满足设计需求,不需要再多的控制器,因此直接选用方案一。
4.系统设计方案当信号进入数字存储示波器时,首先对信号进行前置处理,然后将按一定的时间间隔对信号电压进行采样,之后对这些采样值进行数字化,即通过AD转换器变换得到代表每一个实际电压的二进制数字,进一步把这些数字贮存在存储器中,最终根据数字大小按一定比例把每一个采样点重现在显示器上,这样就能看到清晰的波形。
整个系统由高速采样电路、FIFO存储器、时钟分时电路、控制器FPGA和显示电路构成。
数字示波器系统框图如图所示,其中FPGA构成控制器,信号从探头输入,一路送入高速AD转换器对信号进行采样,采样所得的数据通过处理后存入FIFO存储器中,FIFO模块有两个,前者FIFO1通过开关来控制数据采样频率,后者FIFO2通过脉冲来控制其工作状态;当FIFO2存满后通知Nios II软核处理器 , Nios II从FIFO存储器中通过DMA形式接受数据进行处理,然后将波形和频率等数据通过VGA显示在显示器上。
时钟电路为高速AD转换器和FIFO存储器提供不同的频率信号,作为不同水平扫描时的采样时钟频率。
输入信号第二路送入FPGA板的一个串口,通过频率计算模块计算该信号的频率。
FPGA以被测信号的频率数据作为频率、水平扫描、灵敏度和峰峰值计算、显示的依据。
5.系统框图整个系统框图大概如上图所示,通过FPGA硬件设计和软件设计相结合,以NIOS 为主控,配合上外部硬件设计,实现功能。
首先数据经过AD转换后变成14位数据,直接进入数据处理模块,数据会进行相应的伸缩变化,并且转换为16位数据。
处理后的数据进入FIFO,这块FIFO用来做一级缓冲,一直在采样,采样满会直接溢出,就是说FIFO一直都会存在数据,接着数据会传到第二块FIFO,这块FIFO有一个触发电路控制,控制进行数据采样。
这里的FIFO是nios的外设,已经挂载到总线,传入的数据会在DMA通道的作用下直接传输到内部的ram,再由nios控制显示输出。
其中频率测量模块或者峰值模块均有NIOS内核监控,并实时显示。
6.系统技术指标a)带宽:4MHz(根据五倍准则,示波器的误差不会超过±2%)b)测量频率范围:0~4MHzc)电压检测:0-2Vp-pd)水平灵敏度:e)垂直灵敏度:0.05 v/div 、0.15v/div 、1v/divf)AD采样率:65MHzg)存储深度:512h)通道:双通道7.AD模块简介高速A/D采集经过模拟信号调理电路后的信号,采样值送入FPGA内缓存,经过相应数据处理后,ARM把数据取走。
设计采用terasic公司的信号转换子板(THDB_ADA)Terasic--高速数字模拟转换子板。
该AD板块用于样本模拟信号,根据子接口的不同,可以分为GPIO 0 header和GPIO 1 header两种。
AD9248是一款双核、3 V、14位、20/40/65 MSPS 模数转换器(ADC),集成了两个高性能采样保持放大器和一个基准电压源。
AD9248采用多级差分流水线架构,内置输出纠错逻辑,在最高65 MSPS数据速率时可提供14位精度,并保证在整个工作温度范围内无失码。
AD9248的模拟电压的输入范围为1Vp-p 至2Vp-p,其带宽可以达到500MHz 3dB。
8.频率测量模块及方案比较频率测量是能够测量和显示信号频率的电路。
所谓频率,就是周期性信号在单位时间内变化的次数。
常用的直接测频法有两种,一种是测周期法,一种是测频率法。
8.1.测周期法测周期法如下图所示,需要有基准系统时钟频率Fs,在待测信号一个周期Tx 内,记录基准系统时钟频率的周期数Ns,则被测频率可表示为:Fx=Fs/NsTx基准系统时钟频率Fs周期数Ns8.2.测频率法测频率法就是在一定时间间隔Tw(该时间定义为闸门时间)内,测得这个周期性信号的重复变换次数为Nx,则其频率可表示为:Fx=Nx/TwTw闸门时间周期数Nx8.3.方法选择及使用这两种方法的计数值会产生正负一个字的误差,并且被测精度与计数器中记录的数值Ns或Nx有关,为保证测试精度,一般对于低频信号采用测周期法,对于高频信号采用测频率法。
模拟信号分成两路,其中一路未经直接处理直接输入FPGA开发板中的IO引脚,系统为测量频率提供了一专用的模块。
该模块采用直接测频法对信号的周期进行检测,在精确规定计数允许周期T内使能计数器,对被测信号的周期(脉冲)数进行计数,计数允许周期T的长度决定了被测信号频率的范围。
较长的计数允许周期T对低频信号而言有利于改善测量精度,但对于高频信号来说,则会产生溢出;较短的计数允许周期T对低频信号的测量,虽然精度降低,但能测量的最大频率较高,且不会产生溢出。
波形图理论计算:1.被测频率:2.测量误差:考虑最大误差为1, 则= =由于阈值闸门时间为1s ,为使测量误差尽量小,设计时选Fc=1MHz 。
8.4.Verilog 设计结构Sync Rst _ n Sys _ C lkGateFxCounter Rst _ n Sys _ C lk Sync _ G ate Fx Fc Nx [ 31 : 0 ] Nc [ 31 : 0 ] Data _ D one Fx _ D ata [16..0] Compute Rst _ n Sys _ C lk En Nx [ 31 : 0 ] Nc [ 31 : 0 ] CLOCK Rst _ n Sys _ C lk Gate Fc 频率测量模块9.数据处理模块该模块将AD转换出来的14位数据处理成16位的数据以匹配FIFO的数据位,否则FIFO队列的数据输出将会不完整,导致最后波形还原的失真。
因为对于16位宽的FIFO队列,输入数据位为十四位,当栈满输出时,第一个16位输出数据将是第一个14位输入数据与第二个输入数据中的高两位。
为了我们采取的处理是对数据进行伸缩变换,输出十六位的数值。
通过两个拨马开关,可以控制四种不同的压缩比例的转换。
10.FIFO存储模块FIFO存储器是系统的缓冲环节,是系统的关键部分,如果没有FIFO存储器,整个系统就不可能正常工作。