3012008225 发表于 2011-8-4 21:24:39

如何用VHDL做一个数字示波器

如何用VHDL做一个数字示波器

NJ8888 发表于 2011-8-4 21:49:33

首先要有硬件载体,其次楼下补充

sdu1028 发表于 2011-8-4 22:20:36

楼上太不负责任了。。。载体就是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

3012008225 发表于 2011-8-5 08:32:03

回复【2楼】sdu1028
-----------------------------------------------------------------------

谢谢,我看看,再请教。

mkliop 发表于 2011-8-5 08:35:52

邯郸老乡好棒。你QQ什么?

sdu1028 发表于 2011-8-5 12:39:47

回复【4楼】mkliop 幻瞑少主柳梦璃
邯郸老乡好棒。你qq什么?
-----------------------------------------------------------------------

744叁唔其而依依

locker 发表于 2011-8-5 16:51:14

该说的1楼2楼基本上都说过了,论坛里有魏坤老师的手持示波器开源资料,资料很全,从电路到程序,不过那个好像是Verilog写的,你可以去看看,参考一下。

2130427 发表于 2011-10-25 15:30:53

求原理图,还有源码!
页: [1]
查看完整版本: 如何用VHDL做一个数字示波器