搜索
bottom↓
回复: 10

spring_2011 示波器 FPGA内存控制模块 求注释

[复制链接]

出0入0汤圆

发表于 2013-11-17 11:47:31 | 显示全部楼层 |阅读模式
代码都是开源的了,要是再不搞清楚 真就对不起花的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周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2013-11-17 15:43:52 | 显示全部楼层
大伙别只看不回啊, 欢迎讨论, 4个小时近30个看帖, 看来大家还是很有热情吗
也可以在后面提出自己的问题

出0入0汤圆

发表于 2013-11-17 15:46:10 | 显示全部楼层
因为看不懂

出0入0汤圆

发表于 2014-5-25 21:29:06 | 显示全部楼层
楼主看懂了没有?哈哈!我是看懂了

出0入0汤圆

发表于 2014-9-16 15:27:58 | 显示全部楼层
b57203493 发表于 2014-5-25 21:29
楼主看懂了没有?哈哈!我是看懂了

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

出0入0汤圆

发表于 2014-9-24 10:05:05 | 显示全部楼层
看不懂...........

出0入0汤圆

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

出0入0汤圆

发表于 2014-10-25 10:14:51 | 显示全部楼层
纠正一下
当存满counter个以后------>当计满counter以后

出0入0汤圆

发表于 2014-10-28 10:53:59 | 显示全部楼层
好难理解啊。

出0入0汤圆

发表于 2014-11-13 19:33:19 来自手机 | 显示全部楼层
哈哈!这几天给你详细解释一下。

出0入0汤圆

发表于 2014-11-16 02:01:23 | 显示全部楼层
b57203493 发表于 2014-11-13 19:33
哈哈!这几天给你详细解释一下。

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




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

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

等画完PCB就得慢慢啃源代码了,对FPGA不熟悉,边学边看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 05:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表