modulepulse_gen(inputrstn,//系统复位,低电平有效input[7:0]trig_level,inputad_clk,//AD9280驱动时钟input[7:0]ad_data,//AD输入数据outputad_pulse//输出的脉冲信号);//因为可能会有抖动,设置一个范围值避免反复触发parameterTHR_DATA=3;//reg defineregpulse;regpulse_delay;//*****************************************************//** main code//*****************************************************assignad_pulse=pulse&pulse_delay;//根据触发电平,将输入的AD采样值转换成高低电平always@(posedgead_clkornegedgerstn)beginif(!rstn)pulse<=1'b0;elsebeginif((trig_level>=THR_DATA)&&(ad_data<trig_level-THR_DATA))pulse<=1'b0;elseif(ad_data>trig_level+THR_DATA)pulse<=1'b1;endend//延时一个时钟周期,用于消除抖动always@(posedgead_clkornegedgerstn)beginif(!rstn)pulse_delay<=1'b0;elsepulse_delay<=pulse;endendmodule
`timescale1ns/1nsmodulefrequency_meter_tb;// Parameters//Portsregclk;regrstn;wiread_clk;reg[7:0]ad_data;wire[7:0]led_display_seg;wire[7:0]led_display_sel;frequency_meterfrequency_meter_inst(.clk(clk),.rstn(rstn),.ad_clk(ad_clk),.ad_data(ad_data),.led_display_seg(led_display_seg),.led_display_sel(led_display_sel));initialbeginclk=0;rstn=1;#10rstn=0;#50rstn=1;endalways#(500/27)clk=~clk;//正弦波生成器realfreq=1e6;// 1x10^6 所以是1Mhzrealamp=127.0;// 8bit满振幅值+-127realphase=0.0;// 初始相位0°initialbegin// Generate continuous waveformforeverbegingen_sine_wave(ad_data,freq,amp,phase);#10ns;// 每隔10ns生成一个波形数据,所以是100MHz采样率 100MHz sampling rateendendtaskautomaticgen_sine_wave(outputreg[7:0]wave_out,// 8-bit waveform outputinputrealfreq,// Frequency in Hzinputrealamplitude,// Amplitude (0-127)inputrealphase_deg// Phase in degrees);// Internal variablesrealphase_rad;// Phase in radiansrealabs_amplitude;// Constrained amplituderealcurrent_time;// Current simulation timerealtime_offset;// Elapsed time since first callrealphase_total;// Total accumulated phaserealsin_val;// Sine calculation resultintegeroffset_val;// Scaled sine value// Static variables maintain state between callsstaticrealstart_time=0;// First call timestampstaticrealprev_phase=0;// Previous phase accumulation// Initialize start time on first callif(start_time==0)start_time=$realtime;// Calculate elapsed time (in seconds)current_time=$realtime;time_offset=(current_time-start_time)*1e-9;// Convert ns to seconds// Constrain amplitude to prevent overflowabs_amplitude=(amplitude>127.0)?127.0:amplitude;// Convert phase to radiansphase_rad=phase_deg*(3.1415926535/180.0);// Calculate total phase (continuous accumulation)phase_total=2*3.1415926535*freq*time_offset+phase_rad;// Calculate sine valuesin_val=$sin(phase_total);// Scale to 8-bit range (128 ± amplitude)offset_val=$rtoi(abs_amplitude*sin_val);wave_out=8'($signed(128+offset_val));// Overflow protection (shouldn't trigger with proper amplitude)if(wave_out>255)wave_out=255;elseif(wave_out<0)wave_out=0;endtask/////////联合仿真要加reggrs_n;GTP_GRSGRS_INST(.GRS_N(grs_n));initialbegingrs_n=1'b0;#5grs_n=1'b1;endendmodule