本帖最后由 XLDZZ 于 2013-3-8 21:37 编辑
今天用这个程序去测试了下 RIGOL DS2102的示波器
觉得很实用 拿出来和大家分享
`define DUTY 15'd20000 //周期加入数
`define TIME1 15'd20 //窄脉冲
`define TIME2 15'd200 //宽脉冲 标准信号
//作者 XLDZZ
module MSO_TEST(
SYSCLK,
RST_B,
OUT2,
OUT1
);
//==============================================================================================
// 输入和输出口定义
//==============================================================================================
input SYSCLK;
input RST_B;
output OUT1;
output OUT2;
//==============================================================================================
// 输入输出口类型定义
//==============================================================================================
wire SYSCLK;
wire RST_B;
reg OUT1;
reg OUT2;
reg OUT1_N;
//==============================================================================================
// logic 描述
//==============================================================================================
reg[15:0]P_CNT;
reg[15:0]P_CNT_N;
reg[15:0]T_CNT;
reg[15:0]T_CNT_N;
reg[15:0]DATA;
reg[15:0]P_DATA;
reg[15:0] CNT;
reg[15:0]CNT_N;
always@(posedge SYSCLK or negedge RST_B)
begin
if(!RST_B)
P_DATA<=0;
else
P_DATA<=`DUTY;
end
always@(posedge SYSCLK or negedge RST_B) //脉冲发生器
begin
if(!RST_B)
T_CNT<=0;
else
T_CNT<=T_CNT_N;
end
always@(*)
begin
if(T_CNT==DATA)
begin
T_CNT_N<=0;
end
else
begin
T_CNT_N<=T_CNT+1'b1;
end
end
always@(posedge SYSCLK or negedge RST_B)
begin
if(!RST_B)
OUT1<=0;
else
OUT1<=OUT1_N;
end
always@(*)
begin
if(T_CNT==DATA)
OUT1_N<=~OUT1;
else
OUT1_N<=OUT1;
end
//==============================================================
always@(posedge SYSCLK or negedge RST_B) //次数发生器
begin
if(!RST_B)
P_CNT<=0;
else
P_CNT<=P_CNT_N;
end
always@(*)
begin
if(T_CNT==DATA)
P_CNT_N<=P_CNT+1'b1;
else if(P_CNT==P_DATA)
P_CNT_N<=0;
else
P_CNT_N<=P_CNT;
end
always@(posedge SYSCLK)
begin
if(P_CNT==(P_DATA-1))
DATA<=`TIME1;
else
DATA<=`TIME2;
end
always@(posedge SYSCLK or negedge RST_B)
begin
if(!RST_B)
CNT<=0;
else
CNT<=CNT_N;
end
always@(*)
begin
if(CNT==`TIME2)
CNT_N<=0;
else
CNT_N<=CNT+1'b1;
end
always@(posedge SYSCLK)
begin
if(!RST_B)
OUT2<=0;
else if(CNT==`TIME2)
OUT2<=~OUT2;
else
OUT2<=OUT2;
end
endmodule
|