spring_2011 示波器 FPGA内存控制模块 求注释
代码都是开源的了,要是再不搞清楚 真就对不起花的800大元了{:titter:}简单 我能看懂的已经加了注释,但还有很多疑问 还请高手 指教。
我理解 预先触发: 存储深度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 MEM_LEN;
input RESET;//reset (start)
input TRIG_EDGE_SEL;
input TRIG_SEL;
input TRIG_DATA;
input ADC_DATA_CH1;
input ADC_DATA_CH2;
input MEM_ADDR;
input TRIG_AN;
output TRIG_ADDR;
output MEM_DATA_CH1;
output MEM_DATA_CH2;
output MEM_DONE;
output TRIG_DONE;
output TRIG_PULSE_CH1;
output TRIG_PULSE_CH2;
wire TRIG_DONE;
reg RAM_ADDR;
reg TRIG_ADDR;
reg MEM_DATA_CH1;
reg MEM_DATA_CH2;
reg MEM_DONE;
reg STOP;
reg MEM_CH1;
reg MEM_CH2;
regQ;
reg TRIG_EN;
reg COUNTER;
reg COUNTER2;
reg COUNTER3;
reg TRIG_PULSE_CH1;
reg TRIG_PULSE_CH2;
reg TRIG_PULSE;
reg TRIG_REG;
reg 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=ADC_DATA_CH1;
MEM_CH2=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_DATA_CH2<=MEM_CH2;
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 大伙别只看不回啊, 欢迎讨论, 4个小时近30个看帖, 看来大家还是很有热情吗
也可以在后面提出自己的问题 因为看不懂 楼主看懂了没有?哈哈!我是看懂了{:lol:} b57203493 发表于 2014-5-25 21:29
楼主看懂了没有?哈哈!我是看懂了
{:3_47:}大神,你太坏了,看懂了也不给俺们菜鸟解释下,让俺们一直苦苦挣扎 看不懂........... 一年了都没人回帖,楼上又有个挖坟的,我来解释一下吧,说的不对勿喷。
存储分三个区域,分别是:触发前区域,预触发区域,触发后区域。分别对应counter counter3 counter2
首先,进入触发前区域存储波形,当存满counter个以后,允许触发,进入预触发区域,若在counter3计满之前的到触发信号,则记录触发地址,进入触发后区域,counter2计满后数据传输至NIOS。若counter3计满也无触发信号,同样进入触发后区域,直到counter2计满。 纠正一下
当存满counter个以后------>当计满counter以后 好难理解啊。 哈哈!这几天给你详细解释一下。 b57203493 发表于 2014-11-13 19:33
哈哈!这几天给你详细解释一下。
{:3_48:} 太感谢了 最近一直在 仿照魏坤的示波器照片山寨他的示波器呢 嘿嘿
先上两张 显示和按键板的3D照片
第一张是AD画完了导入Solidworks后的 照片,结果连线 和焊盘都没了O__O"…
后两张是AD里渲染的也有小问题,不知道为啥在SW里画好的 显示屏并贴了图结果生成step文件到了AD里就没贴图了
另外主控板的原理图也画完了,不过PCB抄的太纠结,东西太多啦,而且自己又做了一些简单的修改添加(增加了校准方波输出)
不知道何时能布完线
等画完PCB就得慢慢啃源代码了,对FPGA不熟悉,边学边看
页:
[1]