基于FPGA的数字示波器波形合成器研究

合集下载

基于FPGA的多功能波形发生器的设计

基于FPGA的多功能波形发生器的设计

基于FPGA的多功能波形发生器的设计摘要:主要研究了采用FPGA 和VHDL 语言,运用自顶向下设计思想设计多功能数字波形发生器的问题。

数字波形发生器基于FPGA 设计,VHDL编程实现,集成在1 片Altera 公司的EPF10K10LC84-3芯片上,其输出的8 位数据通过D/A 转换并经滤波电路后即得所需波形。

频率可从100~1000Hz 等步进调节,最小步进100Hz。

系统频率范围宽,频率和幅度精度高。

关键词:FPGA;VHDL;EDA;波形发生器中图分类号:TN70 文献标识码:A 文章编号:1006-4311(2010)09-0232-020 引言电子设计的必由之路是数字化,这已成为共识。

在数字化的道路上,我国的电子技术经历了一系列重大的变革。

从应用小规模集成电路构成电路系统,到广泛地应用微控制器或单片机(MCU),在电子系统设计上发生了具有里程碑意义的飞跃。

电子产品正在以前所未有的速度进行着革新,主要表现在大规模可编程逻辑器件的广泛应用。

在可编程芯片CPLD(复杂可编程逻辑器件)和FPGA(现场可编程门阵列)上实现电子系统的设计,必将成为今后电子系统设计的一个发展方向。

所以电子设计技术发展到今天,又将面临另一次更大意义的突破,即CPLD/ FPGA 在EDA(电子设计自动化)基础上的广泛应用。

本设计将采用基于VHDL的EDA设计来实现波形发生器的各种功能。

1 EDA简介1.1 EDA 技术的涵义 EDA是电子设计自动化(Electronic Design Automation)的缩写。

它是以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计电子系统到硬件系统的一门新技术。

EDA技术可以实现逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化,逻辑布局布线、逻辑仿真。

【FPGA设计实例】基于FPGA的数字示波器设计

【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的多功能波形发生器设计研究

基于FPGA的多功能波形发生器设计研究

基于FPGA的多功能波形发生器设计研究设计以VHDL为开发语言,对FPGA芯片进行编程设计,并对输出数据进行数模转换,以完成一个简单的周期可调的多波形发生器。

标签:FPGA;VHDL;多波形发生器1 引言在教学实验和教学研究中,信号发生器作为提供测试用电信号的仪器必不可少。

目前通用的信号发生器一般只能输出常用的波形信号,无法满足教学实验和教学研究的需要。

基于可编程逻辑器件FPGA的多波形信号发生器,采用VHDL 编程实现,整个系统除晶体振荡器和D/A转换外,全部集成在一片美国Altera 公司生产的EPF10K10LC84-3的芯片上,FPGA输出的8位数据经DAC0832模数转换器后接示波器观察其波形,通过改变控制信号线的高低电平实现波行的转换。

它除了输出常用的正弦波、三角波、方波以外,还可以输出以上两种波形任意线性组合波形。

该信号发生器输出波形的频率可数控选择,100HZ~1KHZ,且可手动调节频率,频率步进间隔为100HZ。

2 各模块电路设计2.1 总体设计FPGA器件内部结构多功能波形发生器由初值模块、分频模块、方波产生模块、三角波产生模块、正弦波产生模块、波形输出控制模块等部分组成,如图1所示。

调频模块TIAOPIN的主要目的是使频率调节能够手动执行。

通过手动输入端口RESETY输入若干脉冲,可达到对周期可调的多波形发生器循环选择输出频率的目的。

初值模块CHUZHI提供初值,供下一个模块FANA分频时用,通过不同的初值,在波形产生模块得到不同的工作频率,从而实现调节波形频率的目的。

由于输入的晶振频率是5MHz。

而要求得到的波形的频率为100Hz~1KHz,频率步进为100Hz。

而又由于设计的波形模块都是64个时钟为一个周期。

因此要求波形模块得到的频率是6.4KHz~64KHz。

由5M/64KHz≈78,而又由频率输出分高电平和低电平。

这样78/2≈39,这样可以得到输入状态为1001时,Q的输出参数为39;分频模块FANA的功能是将前一模块CHUZHI送来的初值对时钟进行分频,得到不同的工作频率,从而调节波形频率;方波产生模块ZENG的功能是产生方波;三角波产生模块DELTA的功能是产生三角波;正弦波产生模块SIN的功能产生正弦波;波形输出控制模块CHPRO31设置了三个按键,分别控制三种波形任意一种,或任意两种波形的叠加。

电子设计大赛基于FPGA的数字示波器

电子设计大赛基于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的多功能波形发生器的设计一、实训目的1.懂得利用FPGA芯片实现多种波形的产生方法2.懂得多功能波形发生器的结构组成3.懂得一种复杂FPGA电路的设计二、实训器材1.EDA实验箱1台2.微型计算机1台3.MAX+PLUSII10.2软件1套4.下载电缆1条三、实训原理设计一个多功能波形发生器。

该波形发生器能产生正弦波、方波、三角波和由用户编辑的特定形状波形。

具体要求如下:(1)具有产生正弦波、方波、三角波、锯齿波4种周期性波形的功能。

(2)用键盘输入编辑生成上述4种波形(同周期)的线性组合波形。

(3)具有波形存储功能。

(4)输出波形的频率范围为100Hz~200kHz;重复频率可调,频率步进间隔≤100Hz。

(5)输出波形幅度范围0~5V(峰-峰值),可按步进0.1V(峰-峰值)调整。

(6)具有显示输出波形的类型、重复频率(周期)和幅度的功能。

(7)用键盘或其他输入装置产生任意波形。

多功能波形发生器系统由以下四部分组成.输入部分、FPGA部分、DAC、显示部分组成。

多功能波形发生器方框图四、设计程序(参考程序)--功能:实现4种常见波形正弦、三角、锯齿、方波(A、B)的频率、幅度可控输出(方波--A的占空比也是可控的),可以存储任意波形特征数据并能重现该波形,还可完成--各种波形的线形叠加输出。

--说明:SSS(前三位)和SW信号控制4种常见波形种哪种波形输出。

4种波形的频率、--幅度(基准幅度A)的调节均是通过up、down、set按键和4个BCD码置入器以及一--个置入档位控制信号(ss)完成的(AMP的调节范围是0~5V,调节量阶为1/51V)。

--其中方波的幅度还可通过u0、d0调节输出数据的归一化幅值(AMP0)进行进一步--细调(调节量阶为1/(51*255)V)。

方波A的占空比通过zu、zp按键调节(调节--量阶1/64*T)。

系统采用内部存储器——RAM实现任意输入波形的存储,程序只支--持键盘式波形特征参数置入存储,posting 为进入任意波置入(set)、清除(clr)状态--控制信号,SSS控制存储波形的输出。

基于FPGA的数字示波器

基于FPGA的数字示波器

基于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的高速数字信号处理能力以及众多硬核和软核内嵌的特性,降低了成本和开发难度,且性能优良。

基于fpga多功能波形发生器实验报告含程序

基于fpga多功能波形发生器实验报告含程序

基于FPGA多功能波形发生器实验报告含程序基于FPGA的多功能波形发生器课程设计实验报告学院: 电气与控制工程学院班级: 微电子11011106080118 学号:姓名: 李少飞日期: 2015.4.2一、电路主体电路图二、各模块vhdl代码三、各模块仿真结果四、实验感悟一、实验主体电路二、各模块vhdl代码三角LIBRARY ieee; USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY sanjiao ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END sanjiao;ARCHITECTURE SYN OF sanjiao ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "sanjiao.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=rom3", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;-正弦LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY sinx ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END sinx;ARCHITECTURE SYN OF sinx ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "sinx.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=ROM1", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;方波LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY fangbo ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END fangbo;ARCHITECTURE SYN OF fangbo ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "fangbo.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=rom2", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;斜波LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY xiebo ISPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END xiebo;ARCHITECTURE SYN OF xiebo ISSIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);COMPONENT altsyncramGENERIC (clock_enable_input_a : STRING;clock_enable_output_a : STRING;init_file : STRING;intended_device_family : STRING;lpm_hint : STRING;lpm_type : STRING;numwords_a : NATURAL;operation_mode : STRING;outdata_aclr_a : STRING;outdata_reg_a : STRING;widthad_a : NATURAL;width_a : NATURAL;width_byteena_a : NATURAL);PORT (clock0 : IN STD_LOGIC ;address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END COMPONENT;BEGINq <= sub_wire0(7 DOWNTO 0);altsyncram_component : altsyncramGENERIC MAP (clock_enable_input_a => "BYPASS",clock_enable_output_a => "BYPASS",init_file => "xiebo.hex",intended_device_family => "Cyclone II",lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=rom4", lpm_type => "altsyncram",numwords_a => 256,operation_mode => "ROM",outdata_aclr_a => "NONE",outdata_reg_a => "UNREGISTERED",widthad_a => 8,width_a => 8,width_byteena_a => 1)PORT MAP (clock0 => inclock,address_a => address,q_a => sub_wire0);END SYN;四选一library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity choice_4 isport(sel:in std_logic_vector(1 downto 0); d1,d2,d3,d4:instd_logic_vector(7 downto 0);q:out std_logic_vector(7 downto 0)); end choice_4;architecture behave of choice_4 is beginprocess(sel)begincase sel iswhen "00"=>q<=d1;when "01"=>q<=d2;when "10"=>q<=d3;when "11"=>q<=d4;when others=>null;end case;end process;end architecture;2-4译码器library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY decoder24 ISPORT(sel:IN std_logic_vector(1 downto 0);en1,en2,en3,en4:OUT std_logic); END;ARCHITECTURE be OF decoder24 IS BEGINprocess(sel)BEGINcase sel iswhen "00" => en1 <='1'; when "01" => en2 <='1'; when "10" =>en3<='1'; when "11" => en4 <='1'; when others=>null; end case;END process;END;正选扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY sins ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END sins;ARCHITECTURE behave OF sins IS COMPONENT sinx --调用波形数据存储器LPM_ROM文件:datarom.vhd声明 PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock : IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : sinx PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化 END;斜波扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY xiebos ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END xiebos;ARCHITECTURE behave OF xiebos IS COMPONENT xiebo --调用波形数据存储器LPM_ROM文件:datarom.vhd声明 PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock : IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器 BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : xiebo PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化 END;方波扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fangbos ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END fangbos;ARCHITECTURE behave OF fangbos ISCOMPONENT fangbo --调用波形数据存储器LPM_ROM文件:datarom.vhd声明PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock :IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器 BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : fangbo PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化 END;三角波扫描电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; --正弦信号发生器源文件USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY sanjiaos ISPORT ( CLK,en ,reset: IN STD_LOGIC; --信号源时钟DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );--8位波形数据输出 END sanjiaos;ARCHITECTURE behave OF sanjiaos IS COMPONENT sanjiao --调用波形数据存储器LPM_ROM文件:datarom.vhd声明 PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);--8位地址信号 inclock : IN STD_LOGIC ;--地址锁存时钟q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT;SIGNAL Q1 : STD_LOGIC_VECTOR (7 DOWNTO 0); --设定内部节点作为地址计数器 BEGINPROCESS(CLK,en,reset ) --LPM_ROM地址发生器进程BEGINif reset='0' then Q1<="00000000";elsif CLK'EVENT AND CLK = '1' and en='1' THEN Q1<=Q1+1; --Q1作为地址发生器计数器 END IF;END PROCESS;u1 : sanjiao PORT MAP(address=>Q1, q => DOUT,inclock=>CLK);--例化END;方波仿真三、各模块仿真结果斜波仿真三角仿真正弦仿真四选一仿真二四译码器四、实验感悟大学的生活就要接近尾声,为了巩固我们所学的专业知识,学院为我们开设了这门实验课,说真的我十分喜欢FPGA课程,因为从一开始我就认准这个行业会是将来发展的热门行业,因此我不仅把全部的精力投注到了这门实验上,而且为了进一步学到多的知识,我选择了有关FPGA的毕业设计课题。

基于FPGA的波形信号发生器的设计

基于FPGA的波形信号发生器的设计

基于FPGA的波形信号发生器的设计1、引言随着微电子技术的发展,20世纪80年代中期出现的现场可编程门阵列FPGA器件得到了飞速发展。

由于该器件具有体系结构、逻辑单元灵活、集成度高以及适用范围广等特点,可实现大规模和超大规模的集成电路,而且编程灵活。

因而在数字信号处理中得到了广泛应用,越来越受到硬件电路设计工程师们的青睐。

波形发生器是一种广泛应用于电子电路、自动控制和科学实验等领域的信号源,从某种意义上说高品质的的信号源更是实现高性能指标的关键。

正弦波信号、三角波信号和方波信号都是科研中最常用的三种信号形式,应非常广泛。

它们通常作为标准信号,用于电子电路的性能试验或参数测量。

本文就是利用GW48—SOPC/DSP实验开发系统采用宏功能模块较为方便地实现了正弦波信号、三角波信号和方波信号。

可编程门阵列(FPGA)中的波形发生器控制电路钟,它通过外来控制信号和高速时钟信号,向波形数据ROM 发出地址信号.输出波形的频率由发出的地址信号的速度决定:当以固定频率扫描输出地址时,模拟输出波形是固定频率。

而当以周期性时变方式扫描输出地址时.则模拟输出波形为扫频信号。

波形数据ROM中存有发生器的波形数据.如正弦波数据。

当接受来自FPGA的地址信号后,将从数据线输出相应的波形数据,地址变化得越快,则输出数据的速度越快,从而使D/A输出的模拟信号的变化速度越快。

在本实验设计过程中采用可编程逻辑器件FPGA,并通过运用Alter公司推出的功能强大的支持可编程逻辑器件的设计环境QuartusII软件和基于超高速硬件描述语言VHDL编程语言,可以进行软件模拟检测设计的正确性,大大简化了系统结构,降低了成本,提高了系统的性能和可靠性,从而方便的实现了信号(正弦信号、三角波信号、方波信号)发生器电路。

2、波形发生器的设计原理2.1 硬件电路的设计的理论基础本设计的设计基础是DDS(直接数字频率合成)技术。

DDS(直接数字频率合成)技术是七十年代初提出的一种新的频率合成技术,它是一种心的全数字频率合成技术,其数字结构满足了现代电子系统的许多要求。

基于FPGA的直接数字频率合成波形发生器

基于FPGA的直接数字频率合成波形发生器

基于FPGA的直接数字频率合成波形发生器
马骏然;张春熹
【期刊名称】《电子测量技术》
【年(卷),期】2006(29)4
【摘要】本文介绍了基于FPGA设计,采用直接数字频率合成(DDS)技术,实现数字波形发生器。

该波形发生器电路简单,程控方便,产生的波形具有相噪好、频率步进低、输出电平分辨率小、相位可调等优点。

【总页数】2页(P78-79)
【关键词】波形发生器;FPGA;直接数字频率合成
【作者】马骏然;张春熹
【作者单位】北京航空航天大学光电技术研究所
【正文语种】中文
【中图分类】TN74
【相关文献】
1.基于FPGA的直接数字频率合成信号发生器的设计 [J], 杨会成
2.基于数字信号处理器与直接数字频率合成器的任意信号发生器 [J], 周刚;王磊
3.基于FPGA的直接数字波形合成宽带信号源的设计与实现 [J], 陈波;黎向阳
4.FPGA直接数字频率合成信号发生器 [J], 李王辉;邵明省
5.基于数字频率合成技术的任意波形发生器设计与应用 [J], 张恒毅;刘宁
因版权原因,仅展示原文概要,查看原文内容请购买。

基于FPGA的DDS信号发生器的设计与实现

基于FPGA的DDS信号发生器的设计与实现

基于FPGA的DDS信号发⽣器的设计与实现⼀、实现环境 软件:Quartus II 13.0 硬件:MP801⼆、DDS基本原理 DDS(Direct Digital Synthesizer)即数字合成器,是⼀种新型的频率合成技术,具有相对带宽⼤,频率转换时间短,分辨率⾼和相位连续性好等优点。

较容易实现频率、相位及幅度的数控调制,⼴泛应⽤于通信领域。

DDS的实现⽰意图如下图所⽰: 1、将需要合成的信号的数据存储在rom中,合成待输出信号的⽅法请参考: 2、dds_control实现的功能是将存储在rom中的待合成的信号的数据按照⼀定的规则取出来: dds_control主要由相位累加和频率累加来实现,简单的说,通过控制相位累加和频率累加来实现从rom中取出不同时刻的数据。

(1)相位累加器位数为N位(24~32),相位累加器把正弦信号在相位上的精度定义为N位,其分辨率位1/2N ,决定⼀个波形的起始时刻在哪个点; (2)频率累加器⽤来控制每隔⼏个点从rom中取⼀个数据,决定⼀个波形的频率; (3)若DDS的时钟频率为F clk ,频率控制字fword = 1,则输出频率为 F out = F clk/2N,这个频率相当于“基频”,若fword = B,则输出频率 F out = B * F clk/2N。

因此理论上由以上三个参数就可以得出任意的 f o 输出频率,且可以得出频率分辨率由时钟频率和累加器的位数决定的结论。

当参考时钟频率越⾼,累加器位数越⾼,输出频率分辨率就越⾼。

3、从FPGA中出来的信号都是数字信号(dds_control输出的信号都为数字信号),需要通过dac芯⽚来将数字信号转换为模拟信号,这样将dac芯⽚输出的信号接⼊到⽰波器中,才能看到波形; 4、举例说明频率控制和相位控制: 如上图所⽰,这个是⼀个由33个点构成的正弦波信号,(rom_addr,rom_data),纵坐标为存储在rom中的正弦波信号,横坐标为dds_control ⽣成的地址信号。

基于FPGA的数字示波器

基于FPGA的数字示波器

论文题目:基于FPGA的数字示波器1.摘要 (3)2.原理 (3)3.系统方案对比及分析 (4)3.1.以FPGA来实现整个系统 (4)3.2.采用DSP与FPGA来实现整个系统 (4)3.3.采用FPGA与单片机来实现整个系统 (4)4.系统设计方案 (4)5.系统框图 (5)6.系统技术指标 (6)7.AD模块简介 (6)8.频率测量模块及方案比较 (6)8.1.测周期法 (6)8.2.测频率法 (7)8.3.方法选择及使用 (7)8.4.Verilog设计结构 (8)9.数据处理模块 (9)10.FIFO存储模块 (9)10.1.FIFO_1 (9)10.2.FIFO_2 (9)11.Nios II软核模块 (10)12.VGA显示 (10)13.系统软件构架设计 (11)13. Nios II软件实现 (13)14.1.DMA传输 (13)14.2.1.PIO中断 (14)14.系统的测试和分析 (15)15.总结 (22)16.参考文献 (23)1.摘要随着信息技术的发展,对信号的测量技术要求越来越高,示波器的使用越来越广泛。

数字示波器是模拟示波器技术、数字化测量技术、计算机技术的综合产物,他主要以微处理器、数字存储器、A/D转换器和D/A转换器为核心,输入信号首先经A/D转换器转换成数字信号,然后存储在RAM中,需要时再将RAM中的内容读出,经D/A转换器恢复为模拟信号显示在示波器上,或者通过接口与计算机相连对存储的信号作进一步处理,这样可大大改进显示特性,增强功能,便于控制和智能化。

这种数字示波器中看到的波形是由采集到的数据经过重构后得到的波形,而不是加到输入端上信号的波形。

设计提出一个经过优化的数据采集方法,辅以FPGA为主控制器和必备的外围电路完成了基于FPGA的数字存储示波器的设计。

系统最大限度地利用了FPGA的高速数字信号处理能力以及众多硬核和软核内嵌的特性,降低了成本和开发难度,且性能优良。

基于FPGA的数字示波器波形合成器研究

基于FPGA的数字示波器波形合成器研究

基于FPGA的数字示波器波形合成器研究
 引言
 波形刷新率是评判数字示波器性能优劣的重要指标之一,它直接体现了示波器抓取波形细节的能力,刷新率越高意味着捕获异常的能力越强。

目前国内示波器的最高波形刷新率在200000wfms/s左右,而高于200000wfms/s的基本上依赖进口。

国内示波器刷新率做不高的主要原因有2个:
 ①波形合成技术和国际先进水平相比,差距还比较大;
 ②波形存储采用外部存储器。

 本文通过对示波器波形合成技术的深入研究,提出一种基于FPGA的高刷新率的波形合成器,刷新率可达到400000wfms/s,该波形合成器已经成功应用在高刷新率示波器中。

 1、波形三维映射模型。

基于FPGA的波形产生方法研究

基于FPGA的波形产生方法研究
图332位累加器
32位寄存器由LPM_FF宏模块担任。
图432位寄存器
32位寄存器和32位累加器共同构成了32相位累加器连接如图
图532位相位累加器
其中高6位A[31..26]作为波形ROM的地址输入。
3.2.2ROM
图6波形查找表结构图
ROM查找表由LPM_ROM宏模块担任,设置为8位64个字
图7波形ROM
%%正弦波
%for b=1:64
% a(b)=round(127*cos(2*pi*(b-1)/63))+127
%end
%figure(1)
%stem(1:64,a(1:64));
%%锯齿波
for b=1:64
a(b)=4*(b-1)
图13按键原理电路
4
4.1
采用Quartus II自带的仿真工具进行仿真,首先建立波形仿真文件,时钟信号CLK输入为1us占空比为50%,频率控制字为33554431仿真结果如下图,显然各个功能模块工作正常,按时序输出,同时P[0..7]按照预想输出了所需波形数据仿真图如下:
图14系统仿真结果
4.2
(2)硬件电路限制波形
我们采用的试验箱DAC0832芯片分辨率为8位,建立时间为1us。从理论上来说可以到达的最高输出频率为1M。由于奈奎施特采样定理可知我们能够到达的频率要小得多。同时8位的DAC分辨率较低得到的波形在频率过高和过低会长生毛刺、变形等情况。
(3)程序设计缺陷
我们的ROM表精度为8位深度为64。这个表的精度较低我们考虑到DAC为8位所以我们的表精度为8位。同时为了综合考虑输出波形的速度,我们ROM表的深度只有64.这样精度不是特别高也是导致波形变形的原因。
本实验硬件平台使用凌阳FPGA试验箱,FPGA为Altera公司的EP2C35F672C6,芯片主频50M。

基于FPGA的DDS波形发生器的设计论文

基于FPGA的DDS波形发生器的设计论文

哈尔滨工业大学华德应用技术学院毕业设计(论文)摘要波形发生器己成为现代测试领域应用最为广泛的通用仪器之一,代表了波形发生器的发展方向。

随着科技的发展,对波形发生器各方面的要求越来越高。

近年来,直接数字频率合成器(DDS)由于其具有频率分辨率高、频率变换速度快、相位可连续变化等特点,在数字通信系统中已被广泛采用而成为现代频率合成技术中的佼佼者。

现场可编程门阵列(FPGA)设计灵活、速度快,在数字专用集成电路的设计中得到了广泛的应用,由于现场可编程门阵列(FPGA)具有高集成度、高速度、可实现大容量存储器功能的特性,能有效地实现DDS技术,极大的提高波形发生器的性能,降低生产成本。

本文首先介绍了DDS波形发生器的研究背景和DDS的理论。

然后详尽地叙述了用FPGA完成DDS模块的设计过程,利用Verilog-HDL硬件描述语言设计DDS波形发生器的各个模块,最后利用Altera的设计工具Quartus II并结合Modelsim软件对波形发生器进行电路设计功能仿真,并对仿真结果进行分析。

仿真结果表明,波形发生器可输出正弦波、三角波、方波、锯齿波,并且可通过改变频率控制字和相位控制字的大小来改变输出波形的频率和相位。

通过仿真结果表明,本设计达到了预定的要求,并证明了采用软硬件结合,利用FPGA技术实现DDS波形发生器的方法是可行的。

关键词:直接数字频率合成现场可编程门阵列波形发生器-I-哈尔滨工业大学华德应用技术学院毕业设计(论文)AbstractWaveform generator has become a modern field test one of the most widely used general-purpose equipment, on behalf of the waveform generator development. With the devel opment of technology in all aspects of the waveform generators have become increasingly demanding. In recent years, direct digital synthesizers (DDS) has a frequency resolution because of its high-frequency conversion speed, continuous changes in the phase characteristics in digital communication systems have been widely used in modern frequency synthesis technology to become the leader in . Field-programmable gate array (FPGA) design flexibility, high speed, in digital ASIC design has been widely used, due to field-programmable gate array (FPGA) with high integration, high-speed, large capacity memory can be realized functional characteristics, can effectively achieve DDS technology, which greatly improve the performance of waveform generator and reduce production costs. This paper introduces the DDS waveform generator of the research background and DDS theory. Then a detailed account of the completion of DDS module with FPGA design process, using Verilog-HDL Hardware Description Language Design DDS waveform generator for each module and finally the use of Altera's Quartus II design tool in conjunction with Modelsim software waveform generator circuit design features simulation, and simulation results analysis. Simulation results show that the waveform genera tor can output sine wave, triangle wave, square wave, sawtooth wave, and can be controlled by changing the frequency and phase control words words to change the size of the output waveform of the frequency and phase. The simulation results show that this d esigned to meet the scheduled requirements and proof of use of hardware and software combination of the use of FPGA technology to achieve DDS waveform generator approach is feasible.Keywords:DDS FPGA Waveform Generator-II-哈尔滨工业大学华德应用技术学院毕业设计(论文)目录摘要 (Ⅰ)Abstract (Ⅱ)第1章绪论 (1)1.1 课题背景 (1)1.2 国内外波形发生器发展现状 (2)1.2.1 波形发生器的发展现状 (2)1.2.2 国内外波形发生器产品比较 (4)1.2.3 研究波形发生器的目的及意义 (5)1.3本文研究主要内容 (5)第2章DDS波形发生器理论介绍 (6)2.1 频率合成技术 (6)2.1.1频率合成技术的发展和分类 (6)2.1.2频率合成技术的技术指标 (7)2.1.3直接数字频率合成技术的现状及应用 (8)2.2 DDS的原理及性能特点 (9)2.2.1 DDS的基本原理 (9)2.2.2 DDS的优点 (11)2.2.3 DDS的缺点 (12)本章小结 (12)第3章 FPGA及其开发环境简介 (13)3.1现场可编程门阵列(FPGA)简介 (13)3.2 Quartus II 8.1集成开发环境简介 (15)3.3 ModelSimHDL语言仿真软件简介 (16)3.4 Verilog-HDL语言简介 (17)3.5 FPGA开发流程 (19)本章小结 (19)第4章DDS波形发生器的FPGA实现 (20)4.1 DDS波形发生器的FPGA设计流程 (20)4.2 DDS波形发生器模块划分 (22)4.2.1 DDS波形发生器顶层模块 (22)-III-哈尔滨工业大学华德应用技术学院毕业设计(论文)4.2.2 DDS波形发生器测试模块 (23)4.2.3 DDS波形发生器ROM模块 (25)4.3 DDS波形发生器功能仿真 (25)本章小结 (27)结论 (28)致谢 (29)参考文献 (30)附录1 译文 (31)附录2 英文参考资料 (33)-IV-哈尔滨工业大学华德应用技术学院毕业设计(论文)第1章绪论1.1 课题背景直接数字频率合成(Direct Digital Synthesizer,简称:DDS)技术是一种新的全数字的频率合成原理,它从相位的角度出发直接合成所需波形。

基于FPGA的数字示波器设计

基于FPGA的数字示波器设计

基于FPGA的数字示波器设计
随着信息技术的发展,对信号的测量技术要求越来越高,示波器的使用越来越广泛。

模拟示波器使用前需要进行校正,使用比较麻烦;而数字示波器,由于受核心控制芯片的影响,对输入信号的频率有严格的限制。

基于FPGA的数字示波器,其核心芯片可达到50万门,配合高速外围电路,可以测量频率为1 MHz的信号,有效地克服了以往示波器的不足。

1 系统方案设计
设计的数字示波器系统主要使用了Xilinx系统的开发环境,并在此环境内部建立了AD采样控制模块、键盘控制模块、VGA显示模块等多个模块,从很大程度上减少了硬件电路的搭建,也因此提高了系统的稳定性和可靠性,系统框图如图1所示。

另外,设计使用XPS将32位的MicroBlaze微处理器嵌入到了FPGA 中,实现了可编程片的嵌入以及在可编程片上的系统设计。

MieroBlaze通过。

毕业设计论文基于FPGA技术的数字存储示波器设计

毕业设计论文基于FPGA技术的数字存储示波器设计

毕业设计(毕业论文)系别:电子与电气工程学院专业:电子信息工程技术班级:学生姓名:学生学号:设计(论文)题目:基于FPGA技术的数字存储示波器设计指导教师:设计地点:起迄日期:毕业设计(论文)任务书专业电子信息班级姓名一、课题名称:基于FPGA技术的数字存储示波器设计二、主要技术指标:(1)带宽:100MHz (2)垂直灵敏度:10mv—5v/div (3)水平灵敏度:2.5ns—5s/div (4)输入阻抗:1MΩ(5)存储深度:4KB (6)显示:LED(7)通道:单通道等三、工作内容和要求:本设计的数据采集采用高速模/数转换器ADl674(A/D),直接用FPGA准确定时控制ADC的采样速率,实现整个频段的全速采样。

数据的存储采用双口RAM(UT62-256)存储采样量化后的波形数据,同样用FPGA控制RAM的地址线。

整个系统采用单通道的方式,信号进来首先经过前端的调理电路把信号电压调整到AD的输入电压范围之内,这里调节电路主要是由信号衰减电路和信号放大电路所组成。

调节后的信号再送到AD变换电路里面完成信号的数字化。

然后把AD转换后的数据送到FPGA中,并把数据保存到FPGA中的FIFO中,FPGA中的电路主要包括有FIFO、触发系统、峰值检测、时基电路等。

四、主要参考文献:[1]杨刚、龙海燕.现代电子技术一VHDL与数字系统设计[M].北京:电子工业出版社.2004.[2]侯伯亨、顾新.VHDL硬件描述语言与数字逻辑电路设计[M].西安:两安电子科技人学.1999.[3]潘松下、国栋帅.L实用教程[M].成都:成都电子科技大学出版社.2000.[4]潘松下、黄继业.EDA技术实用教程[M]北京:科学出版社.2002.[5]王振红.VHDL数字电路设计与应用实践教程[M].北京机械工业出版社.2003.学生(签名)2010年5月7日指导教师(签名)2010年5月10日教研室主任(签名)2010年5月10日系主任(签名)2010年5月12日毕业设计(论文)开题报告目录摘要Abstract第1章前言 (1)1.1 数字存储示波器的发展概况 (1)1.2 本文所做的研究工作 (1)第2章示波器的工作原理 (3)2.1 模拟示波器的基本工作原理 (3)2.2 数字存储示波器的工作原理 (4)第3章 D S P处理器和F P G A的开发过程简介 (5)3.1 DSP处理器的开发过程和应用 (5)3.2 FPGA的开发过程与应用 (6)第4章整体设计方案 (8)4.1 系统整体设计流程图 (8)4.2 整个系统的性能指标 (9)4.3 系统的实现方案 (9)4.4 元器件的选择 (11)第5章整个系统硬件设计 (12)5.1 前端数据采集部分硬件电路设计 (12)5.2 FPGA外围电路的设计和内部逻辑电路设计 (17)5.3 DSP部分的硬件设计 (24)第6章系统软件设计 (29)6.1系统初始化 (29)6.2数据处理的相关算法 (33)6.3波形显示程序 (35)第7章结束语 (37)答谢辞参考文献摘要数字存储示波器在仪器仪表领域中占有重要的地位,应用范围相当广泛,所以对示波器的研制有重要的理论和实际意义。

基于FPGA的波形发生器的设计

基于FPGA的波形发生器的设计
在这个仿真图中,可看到当en为高电平的时候,出现一个clk时钟 脉冲的上升沿开始计数,从0增到1,然后每来一个脉冲就增一次, 直到增到255,等下一个脉冲到临时将有从255减到251,然后每 来一个脉冲就减一次,直到减到0,依次重复,如图所示,波形 将出现三角波的规律变化。
正弦波波仿真图

仿真结果分析
module ju( input input clk, /*clock input*/ rst_n, /*async reset ,active low*/ en, /*data output from ROM*/ input output [7:0] q4 ); /***********ROM instance**********************/ wire [6:0] addr; ROM4P ROM4P_inst ( .address ( addr ), .clock ( clk), .q ( q4) ); /***************address generate***************/ reg [6:0] cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 7'd0; else if(en) cnt <= cnt+7'd1; else cnt<=cnt; end assign addr = cnt; endmodule
信号发生器的设计过程
设计规划
根据设计思路,信号发生器的结构框图如图3-1所示。它由信号产生,
信号控制,D/A转换三部分组成。
时钟信号 信号产生 信号控制 D/A转 输 出

基于FPGA的任意波形合成器

基于FPGA的任意波形合成器

基于FPGA的任意波形合成器刘平1,王飞1,魏妙飞21.西安电子科技大学电子工程学院,西安(710071)2.西安德龙电子责任有限公司,西安(710077)E-mail:lp1632008@摘要:本文介绍了直接数字频率合成器(DDS)的设计原理,给出了基于Altera的FPGA 器件的设计方案、程序实现和仿真结果。

关键词:直接数字频率合成,现场可编程门阵列直接数字频率合成(DDS)技术是从相位概念出发直接合成所需波形的一种新的频率合成技术。

它在相对带宽、频率转换时间、相位连续性、正交输出、高分辨力等方面具有显著的特性,这些特性使DDS在雷达和通讯系统中应用日益广泛。

本文结合现行的研究项目,基于DDS的基本原理,使用Altera公司的FPGA Cyclone II Ep2c8芯片完成了一个DDS系统的设计。

本文通过一个正弦波的实例来说明设计的原理。

1 直接数字频率合成器工作原理简介直接数字频率合成(Direct Digital Fraquency Synthesis,即DDFS,一般简称DDS)是从相位概念出发直接合成所需波形的一种新的频率合成技术。

DDS的原理框图如图1.1所示:图1.1 DDS的原理框图DDS的工作原理是以数控振荡器的方式产生频率、相位可控制的任意波形。

电路一般包括基准时钟、频率累加器、相位累加器、控制相位的加法器、控制波形的加法器、幅度/相位转换电路、D/A转换器和低通滤波器(LPF)。

如上原理框图所示,其中K为频率控制字、P为相位控制字、W为波形控制字、fc为参考时钟频率,D为ROM数据位及D/A转换器的字长。

相位累加器在时钟fc的控制下以步长K作累加,输出的N位二进制码与相位控制字P、波形控制字W相加后作为波形ROM的地址,对波形ROM进行寻址,波形ROM 输出D位的幅度码S(n),经D/A转换器变成阶梯波S(t),再经过低通滤波器平滑后就可以得到合成的信号波形。

合成的信号波形形状取决于波形ROM中存储的幅度码,因此DDS 可以产生任意波形。

基于FPGA和传统示波器的多路数字波形显示技术

基于FPGA和传统示波器的多路数字波形显示技术

基于FPGA和传统示波器的多路数字波形显示技术
董晓舟
【期刊名称】《安徽电子信息职业技术学院学报》
【年(卷),期】2004(003)003
【摘要】本文介绍利用FPGA在普通示波器上显示多路数字信号波形的设计思想,以及在Altera公司的FPGA器件(FLEX EP10K10)上的实现过程.
【总页数】1页(P72-72)
【作者】董晓舟
【作者单位】山东大学威海分校,山东,威海,264209
【正文语种】中文
【中图分类】TM935.3
【相关文献】
1.数字示波器波形显示处理技术 [J], 郭献宏;王庚斗;褚洪
2.一种用于数字存储示波器的三维波形显示技术的设计 [J], 郭连平;田书林
3.数字电子技术实验改革案例——基于FPGA与串口通信的波形显示与测量系统[J], 孙敏;金印彬;张皎
4.基于FPGA的手持式数字存储示波器峰值采样技术 [J], 石明江;顾亚雄;何道清
5.支持32通道逻辑信号分析的混合数字示波器可用于测试有多路模拟信号和FPGA、CPLD、闪存等数字电路的系统 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于FPGA的数字示波器波形合成器研究
引言波形刷新率是评判数字示波器性能优劣的重要指标之一,它直接体现了示波器抓取波形细节的能力,刷新率越高意味着捕获异常的能力越强。

目前国内示波器的最高波形刷新率在200000wfms/s左右,而高于200000wfms/s的基本上依赖进口。

国内示波器刷新率做不高的主要原因有2个:
①波形合成技术和国际先进水平相比,差距还比较大;
②波形存储采用外部存储器。

本文通过对示波器波形合成技术的深入研究,提出一种基于FPGA的高刷新率的波形合成器,刷新率可达到400000wfms/s,该波形合成器已经成功应用在高刷新率示波器中。

1、波形三维映射模型波形数据的三维信息包括:时间,幅度和幅度命中次数。

在现代DSO 中,可将多次触发后采集到的多帧数据展现在屏幕上,并通过三维映射灰度图来体现时间,幅度以及波形数据在每一个幅度上的命中次数。

例如进行10次采样每次采样700个样点,那么进行三维映射时,会将这10次采样的波形进行叠加,然后将叠加后的波形数据映射到三维数据库中。

如图1所示,三维波形数据库可以看作是一个mk的二维矩阵,m表示DSO屏幕的垂直分辨率(幅度),k表示DSO的水平分辨率(时间),而矩阵中元素amk表示幅度命中次数(概率),如图所示。

为了将三维波形数据库中的信息转换为方便用户观察的显示画面,需要将幅度命中次数转换为波形灰度或颜色等级,所以波形三维映射模型实质上是一种三维波形成像技术。

它直接将每次采集到得数据映射到三维数据库(灰度图),然后将灰度图以人眼可以接受的速率传送到屏幕上显示。

对于图2这个mk矩阵,若其元素用c位存储,则灰度图需要的存储空间为:mk2c/8字节,国内示波器一般将这个三维数据库(灰度图)存放在外部存储器中例如SRAM,SSRAM。

很明显,频繁的访问外部存储器将会大大的减小数据映射速度,降低了波形刷新率。

相关文档
最新文档