lhaiyang1316 发表于 2013-11-17 11:47:31

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

lhaiyang1316 发表于 2013-11-17 15:43:52

大伙别只看不回啊, 欢迎讨论, 4个小时近30个看帖, 看来大家还是很有热情吗
也可以在后面提出自己的问题

max-men 发表于 2013-11-17 15:46:10

因为看不懂

b57203493 发表于 2014-5-25 21:29:06

楼主看懂了没有?哈哈!我是看懂了{:lol:}

mubei 发表于 2014-9-16 15:27:58

b57203493 发表于 2014-5-25 21:29
楼主看懂了没有?哈哈!我是看懂了

{:3_47:}大神,你太坏了,看懂了也不给俺们菜鸟解释下,让俺们一直苦苦挣扎

hanshiruo 发表于 2014-9-24 10:05:05

看不懂...........

hantnt 发表于 2014-10-25 10:11:54

一年了都没人回帖,楼上又有个挖坟的,我来解释一下吧,说的不对勿喷。
存储分三个区域,分别是:触发前区域,预触发区域,触发后区域。分别对应counter counter3 counter2
首先,进入触发前区域存储波形,当存满counter个以后,允许触发,进入预触发区域,若在counter3计满之前的到触发信号,则记录触发地址,进入触发后区域,counter2计满后数据传输至NIOS。若counter3计满也无触发信号,同样进入触发后区域,直到counter2计满。

hantnt 发表于 2014-10-25 10:14:51

纠正一下
当存满counter个以后------>当计满counter以后

宇豪电子 发表于 2014-10-28 10:53:59

好难理解啊。

b57203493 发表于 2014-11-13 19:33:19

哈哈!这几天给你详细解释一下。

mubei 发表于 2014-11-16 02:01:23

b57203493 发表于 2014-11-13 19:33
哈哈!这几天给你详细解释一下。

{:3_48:} 太感谢了   最近一直在 仿照魏坤的示波器照片山寨他的示波器呢 嘿嘿
先上两张 显示和按键板的3D照片




第一张是AD画完了导入Solidworks后的 照片,结果连线 和焊盘都没了O__O"…
后两张是AD里渲染的也有小问题,不知道为啥在SW里画好的 显示屏并贴了图结果生成step文件到了AD里就没贴图了

另外主控板的原理图也画完了,不过PCB抄的太纠结,东西太多啦,而且自己又做了一些简单的修改添加(增加了校准方波输出)
不知道何时能布完线

等画完PCB就得慢慢啃源代码了,对FPGA不熟悉,边学边看
页: [1]
查看完整版本: spring_2011 示波器 FPGA内存控制模块 求注释