|
代码都是开源的了,要是再不搞清楚 真就对不起花的800大元了
简单 我能看懂的已经加了注释, 但还有很多疑问 还请高手 指教。
我理解 预先触发: 存储深度1000,预触发深度 500, 那预触发到了以后,如果不满足触发条件,写入指针就不能指向501了, 要更新前500个数据,2到1,3到2.......500到499,新读入的到500。 这样理解对吗?
1.MEM_LEN只是设置预先触发深度吗
2. counter2,counter3 做什么用的?
3. 采样深度 一直是 8192吗
4. 能多加些注释 就多加吧 比如输入 输出信号都是干什么用的
如果可以,我谨代表
module MEM_control_H
(
CLK,
RESET,
RD,
ADC_DATA_CH1,
ADC_DATA_CH2,
MEM_DATA_CH1, //read data
MEM_DATA_CH2,
MEM_ADDR, //read addr
MEM_DONE,
TRIG_ADDR,
TRIG_DATA,
TRIG_DONE,
TRIG_PULSE_CH1,
TRIG_PULSE_CH2,
TRIG_EDGE_SEL,
TRIG_SEL,
MEM_LEN,
TRIG_AN
);
input CLK; // main clock
input RD;
input [12:0] MEM_LEN;
input RESET; //reset (start)
input TRIG_EDGE_SEL;
input TRIG_SEL;
input [7:0] TRIG_DATA;
input [7:0] ADC_DATA_CH1;
input [7:0] ADC_DATA_CH2;
input [12:0] MEM_ADDR;
input TRIG_AN;
output [12:0]TRIG_ADDR;
output [7:0] MEM_DATA_CH1;
output [7:0] MEM_DATA_CH2;
output MEM_DONE;
output TRIG_DONE;
output TRIG_PULSE_CH1;
output TRIG_PULSE_CH2;
wire TRIG_DONE;
reg [12:0] RAM_ADDR;
reg [12:0] TRIG_ADDR;
reg [7:0] MEM_DATA_CH1;
reg [7:0] MEM_DATA_CH2;
reg MEM_DONE;
reg STOP;
reg [7:0] MEM_CH1[8192];
reg [7:0] MEM_CH2[8192];
reg Q;
reg TRIG_EN;
reg [12:0] COUNTER;
reg [12:0] COUNTER2;
reg [12:0] COUNTER3;
reg TRIG_PULSE_CH1;
reg TRIG_PULSE_CH2;
reg TRIG_PULSE;
reg [12:0]TRIG_REG;
reg [3:0] STATE;
assign TRIG_DONE=Q;
always @(posedge CLK or negedge RESET)
begin
if(!RESET)
begin
TRIG_EN<=0;
COUNTER<=0;//超前触发点数计数器
COUNTER2<=0;
COUNTER3<=0;
MEM_DONE<=0;
RAM_ADDR<=0;
end
else if(MEM_DONE==0)
begin
MEM_CH1[RAM_ADDR]=ADC_DATA_CH1;
MEM_CH2[RAM_ADDR]=ADC_DATA_CH2;
RAM_ADDR=RAM_ADDR+1;
if(COUNTER>=MEM_LEN)//MEM_LEN 是预触发的深度吗?
begin
TRIG_EN<=1;
end
else
begin
COUNTER<=COUNTER+1;
end
if(TRIG_EN)
begin
if(COUNTER3<MEM_LEN && TRIG_AN==0)
begin
COUNTER3<=COUNTER3+1;
end
end
if(Q||COUNTER3>=MEM_LEN)
begin
if(COUNTER2>=MEM_LEN)
begin
MEM_DONE<=1;
end
else
begin
COUNTER2<=COUNTER2+1;
end
end
end
end
always @(posedge RD)
begin
if(MEM_DONE)
begin
MEM_DATA_CH1<=MEM_CH1[MEM_ADDR];
MEM_DATA_CH2<=MEM_CH2[MEM_ADDR];
end
end
always @(posedge CLK) //测量CH1频率
begin
if(TRIG_EDGE_SEL) //上升沿触发
begin
if(ADC_DATA_CH1>TRIG_DATA)
TRIG_PULSE_CH1<=1;
else TRIG_PULSE_CH1<=0;
end
else //下降沿触发
begin
if(ADC_DATA_CH1<TRIG_DATA)
TRIG_PULSE_CH1<=1;
else TRIG_PULSE_CH1<=0;
end
end
always @(posedge CLK) //测量CH2频率
begin
if(TRIG_EDGE_SEL)
begin
if(ADC_DATA_CH2>TRIG_DATA)
TRIG_PULSE_CH2<=1;
else TRIG_PULSE_CH2<=0;
end
else
begin
if(ADC_DATA_CH1<TRIG_DATA)
TRIG_PULSE_CH2<=1;
else TRIG_PULSE_CH2<=0;
end
end
always @(posedge CLK) //触发通道选择
begin
if(TRIG_SEL)
begin
if(TRIG_EDGE_SEL) //上升沿触发
begin
if(ADC_DATA_CH1>TRIG_DATA)
TRIG_PULSE<=1;
else TRIG_PULSE<=0;
end
else //下降沿触发
begin
if(ADC_DATA_CH1<TRIG_DATA)
TRIG_PULSE<=1;
else TRIG_PULSE<=0;
end
end
else //CH2为触发源
begin
if(TRIG_EDGE_SEL)
begin
if(ADC_DATA_CH2>TRIG_DATA)
TRIG_PULSE<=1;
else TRIG_PULSE<=0;
end
else
begin
if(ADC_DATA_CH2<TRIG_DATA)
TRIG_PULSE<=1;
else TRIG_PULSE<=0;
end
end
end
always @(posedge TRIG_PULSE or negedge RESET)
begin
if(!RESET)
begin
Q<=0;
end
else
begin
Q<=TRIG_EN; //满足预先触发条件下,使能触发
end
end
always @(posedge Q or negedge RESET)
begin
if(!RESET)
begin
TRIG_ADDR<=0;
end
else
begin
TRIG_ADDR<=RAM_ADDR;
end
end
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|