如何用VHDL做一个数字示波器
如何用VHDL做一个数字示波器 首先要有硬件载体,其次楼下补充 楼上太不负责任了。。。载体就是FPGA了,我有用Verilog做,当然要外接AD和信号调理电路的,只显示波形的话好办,可以VGA硬件画,要是还要控制放大倍数,可选择触发,测量,自动,显示信息什么的就最好嵌核了。其他楼下补充给你个顶层模块参考下,Verilog做的
////////////////////////////////////top moudle main_ctrl.v
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: SDU
// Engineer: Ljt
// Create Date: 20:08:59 08/28/2010
// Module Name: top_moudule
// Project Name: MPU_VGA
//////////////////////////////////////////////////////////////////////////////////
module vga_top_moudule(
clk,
//VGA的IO
h_sync,v_sync,red,green,blue,
//MicroBlaze核用IO
fpga_0_Micron_RAM_Mem_A_pin,fpga_0_Micron_RAM_Mem_CEN_pin,,fpga_0_Micron_RAM_Mem_OEN_pin,
fpga_0_Micron_RAM_Mem_WEN_pin,fpga_0_Micron_RAM_Mem_BEN_pin,fpga_0_Micron_RAM_Mem_DQ_pin,
fpga_0_rst_1_sys_rst_pin,
//外设
fpga_0_LEDs_8Bit_GPIO_IO_O_pin,
fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin,
fpga_0_Switches_8Bit_GPIO_IO_I_pin,
fpga_0_RS232_PORT_RX_pin,
fpga_0_RS232_PORT_TX_pin,
//键盘
ps2k_clk,ps2k_data,
//AD
max1242_sclk,max1241_cs,max1241_data,sam_clk_out,ad_data,
//EEP//继电器
gpio_5,JiDaQ,
//数字输入,数字输出
digt_in,digt_a,digt_b
);
input clk;//50MHz
//VGA
output h_sync,v_sync;
output red;
output green;
output blue;
//数字输出
output digt_a;
output reg digt_b;
//AD
output max1242_sclk,max1241_cs;
input max1241_data;
//EEP
inout gpio_5;
//键盘
input ps2k_clk;
input ps2k_data;
//IP外设
output fpga_0_LEDs_8Bit_GPIO_IO_O_pin;
input fpga_0_Switches_8Bit_GPIO_IO_I_pin;
input fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin;
input fpga_0_RS232_PORT_RX_pin;
output fpga_0_RS232_PORT_TX_pin;
output JiDaQ;
input digt_in;
//CPU的RAM引脚
output fpga_0_Micron_RAM_Mem_A_pin;
output fpga_0_Micron_RAM_Mem_CEN_pin;
output fpga_0_Micron_RAM_Mem_OEN_pin;
output fpga_0_Micron_RAM_Mem_WEN_pin;
output fpga_0_Micron_RAM_Mem_BEN_pin;
inout fpga_0_Micron_RAM_Mem_DQ_pin;
input fpga_0_rst_1_sys_rst_pin;
//模块之间的互联信号
wire clkb;
wire addrb;
wire doutb;
wire addra;
wire dina;
wire mainclk;
wire clk100M;
wire wea=1;
wire keyclr=1;
wire xps_gpio_2_GPIO_IO_I_pin;
wire xps_gpio_3_GPIO_IO_I_pin;
wire rst_n=fpga_0_rst_1_sys_rst_pin;
wire ps2_byte;
wire ps2_state;
wire gpio4;
wire iobuf;
wire b_doutb;
wire markline;
//寄存器变量
//连续性赋值
assign clka=clk100M;
assign xps_gpio_2_GPIO_IO_I_pin=ps2_state;
assign xps_gpio_2_GPIO_IO_I_pin=ps2_byte;
assign xps_gpio_2_GPIO_IO_I_pin=0;
assign iobuf=gpio4;//6位
assign markline=gpio4;
//assign xps_gpio_3_GPIO_IO_I_pin=max1241_data;//接到了gpio3上
assign max1241_cs=gpio4;
assign max1242_sclk=gpio4;
wire sam_start,sam_done;
wire ad_addra;
//AD IO
output sam_clk_out;
input ad_data;
wire sam_clk;
wire ad_doutb;//MCU,in
wire ad_addrb;//MCU use,o
wire clkdivid;//MCU ,o
assign ad_addrb=gpio4;
assign sam_start=gpio4;
assign clkdivid=gpio4;
assignxps_gpio_3_GPIO_IO_I_pin=ad_doutb;
assignxps_gpio_3_GPIO_IO_I_pin=ad_addra;
wire trig_1sa;//CPU给出,置1单次触发状态
wire trig_now;//Comp模块给出
assign trig_1sa=gpio4;//6位
////////////////////////////////////////////////////例化各个模块
wire addrb_b;
wire b_wave_clk;
vga vgadrv (
.mainclk(mainclk),
.h_sync(h_sync),
.v_sync(v_sync),
.red(red),
.green(green),
.blue(blue),
.clkb(clkb),
.addrb(addrb),
.doutb(doutb),
.b_doutb(b_doutb),
.markline(markline),
.addrb_b(addrb_b),
.clk(b_wave_clk)
);
reg r_addra; reg b_addra;
reg r_dina; reg b_dina;
b_GRam_wave b_GRam_wave (
.clka(clka),
.wea(wea), // Bus
.addra(b_addra), // Bus
.dina(b_dina), // Bus
.clkb(b_wave_clk),
.addrb(addrb_b), // Bus
.doutb(b_doutb)); // Bus
GRam GRam (
.clka(clka),
.wea(wea),
.addra(r_addra),
.dina(r_dina),
.clkb(clkb),
.addrb(addrb),
.doutb(doutb)
);
always@(posedge clk100M)
begin
if(addra) begin b_addra<=addra; b_dina<=dina; end
else begin r_addra<=addra; r_dina<=dina; end
end
wire gpio6;
reg per_reg;
MicroBlaze MicroBlaze (
.fpga_0_LEDs_8Bit_GPIO_IO_O_pin(fpga_0_LEDs_8Bit_GPIO_IO_O_pin),
.fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin(fpga_0_Push_Buttons_4Bit_GPIO_IO_I_pin),
.fpga_0_Switches_8Bit_GPIO_IO_I_pin(fpga_0_Switches_8Bit_GPIO_IO_I_pin),
.fpga_0_RS232_PORT_RX_pin(fpga_0_RS232_PORT_RX_pin),
.fpga_0_RS232_PORT_TX_pin(fpga_0_RS232_PORT_TX_pin),
.fpga_0_Micron_RAM_Mem_A_pin(fpga_0_Micron_RAM_Mem_A_pin),
.fpga_0_Micron_RAM_Mem_CEN_pin(fpga_0_Micron_RAM_Mem_CEN_pin),
.fpga_0_Micron_RAM_Mem_OEN_pin(fpga_0_Micron_RAM_Mem_OEN_pin),
.fpga_0_Micron_RAM_Mem_WEN_pin(fpga_0_Micron_RAM_Mem_WEN_pin),
.fpga_0_Micron_RAM_Mem_BEN_pin(fpga_0_Micron_RAM_Mem_BEN_pin),
.fpga_0_Micron_RAM_Mem_DQ_pin(fpga_0_Micron_RAM_Mem_DQ_pin),
.fpga_0_clk_1_sys_clk_pin(clk100M),
.fpga_0_rst_1_sys_rst_pin(fpga_0_rst_1_sys_rst_pin),
.xps_gpio_0_GPIO_IO_O_pin(dina),
.xps_gpio_1_GPIO_IO_O_pin(addra),
.xps_gpio_2_GPIO_IO_I_pin(xps_gpio_2_GPIO_IO_I_pin),
.xps_gpio_3_GPIO_IO_I_pin(xps_gpio_3_GPIO_IO_I_pin),
.xps_gpio_4_GPIO_IO_O_pin(gpio4),
.xps_gpio_5_GPIO_IO(gpio_5),
.JiDaQ_GPIO_IO_O_pin(JiDaQ),
.xps_gpio_digt_ctrl_GPIO_IO_O_pin(gpio6),
.xps_gpio_freq_GPIO_IO_I_pin(per_reg)
);
MCU_OutputCantain McuIObuf (
.ioblock(iobuf),
.mainclk(mainclk)
);
ClockManger DPLL (
.CLKIN_IN(clk),
.CLKIN_IBUFG_OUT(CLK0_OUT),
.CLK0_OUT(mainclk),
.CLK2X_OUT(clk100M)
);
ps2scan ps2scan( .clk(mainclk), //按键扫描模块
.rst_n(rst_n),
.ps2k_clk(ps2k_clk),
.ps2k_data(ps2k_data),
.ps2_byte(ps2_byte),
.ps2_state(ps2_state)
);
wire ad_data_10bit;
reg ad_data_reg;
always@(posedge sam_clk)
ad_data_reg<=ad_data_10bit;
assign ad_data_10bit=ad_data;
assign ad_data_10bit=digt_in;
AD_Cache AD_Cache (
.clka(sam_clk),
.wea(wea), // 1
.addra(ad_addra), //
.dina(ad_data_reg), //ad输入
.clkb(clk100M),
.addrb(ad_addrb), // Bus
.doutb(ad_doutb)); // Bus
AD_Sample_Ctrl Sample_Ctrl (
.clk100M(clk100M),
.sam_startin(sam_start),
.clkdivid(clkdivid),
.sam_clk(sam_clk),
.ad_addra(ad_addra),
.trig_now(trig_now),
.sam_clk_out(sam_clk_out)
);
Comp_trig Comp_trig (
.sam_clk(sam_clk),
.clk100M(clk100M),
.trig_1sa(trig_1sa),
.trig_now(trig_now),
.ad_data_reg(ad_data_reg)
);
reg digt_a0;
reg per_cnt;
reg digt_freq;
reg digt_a;
reg data_cnt;
reg c_data_cnt;
always@(posedge clk100M)//频率设置
begin
case(gpio6)
4'h1:data_cnt=16'd500; //100K
4'h2:data_cnt=16'd250;//200K
4'h3:data_cnt=16'd167;//300K 500/3
4'h4:data_cnt=16'd125; //400K 500/4
4'h5:data_cnt=16'd100; //500K
4'h6:data_cnt=16'd83; //600K
4'h7:data_cnt=16'd71; //700K
4'h8:data_cnt=16'd63; //800K
4'h9:data_cnt=16'd56; //900K
4'h10:data_cnt=16'd50; //1M
default:data_cnt=16'd100; //100K
endcase
if(c_data_cnt==data_cnt)
begin
c_data_cnt<=1;
digt_freq<=~digt_freq;
end
else
c_data_cnt<=c_data_cnt+1;
end
always@(posedge clk100M)//频率设置
begin
if(gpio6==0)
digt_a<=ad_data>480;
else
digt_a<=digt_freq;
end
always@(posedge clk100M)
begin
digt_a0<=digt_a;
end
always@(posedge clk100M)
begin
if(digt_a==1&digt_a0==0)//检测到digta上升
begin
per_reg<=per_cnt;//记录周期
per_cnt<=0;
end
else
per_cnt<=per_cnt+1;
end
always@(posedge clk100M)
begin
if(per_cnt>per_reg/8&&per_cnt<per_reg/8+per_reg/8+per_reg/8)//在1/8到3/8周期之间,b为1
digt_b<=1;
else
digt_b<=0;
end
endmodule 回复【2楼】sdu1028
-----------------------------------------------------------------------
谢谢,我看看,再请教。 邯郸老乡好棒。你QQ什么? 回复【4楼】mkliop 幻瞑少主柳梦璃
邯郸老乡好棒。你qq什么?
-----------------------------------------------------------------------
744叁唔其而依依 该说的1楼2楼基本上都说过了,论坛里有魏坤老师的手持示波器开源资料,资料很全,从电路到程序,不过那个好像是Verilog写的,你可以去看看,参考一下。 求原理图,还有源码!
页:
[1]