搜索
bottom↓
回复: 1

FIFO读写

[复制链接]

出0入0汤圆

发表于 2013-5-16 11:06:43 | 显示全部楼层 |阅读模式
FIFO模块                                                                                              功能:ADC采集的数据,存储在FIFO中,传输给FFT模块。为了提高信噪比,将采集数据进行10次累加。即若采集1024点,将下一个采样周期过来的数据依次与前一次对应位的数据相加,重复10次。此模块在例化FIFO IP core 的基础上实现。
信号:输入信号 clk_fifo FIFO 的时钟
Din 采样数据
Busy, dv, done, FFT的握手信号
输出信号:dout FIFO输出数据
Start FFT 运算开始控制
FIFO IP核

                              
问题1 FIFO的读写时钟和采样时钟不同步,因为在WRITE0和WRITE1中分别要求读一个字节和写一个字节,所以读和写的时钟相同,但是在完成读-加-写三个时钟周期内要求采样一个数据,所以采样的时钟与读写的时钟不同步。
2FFT的时钟50M 远远快于FIFO的写时钟,要求数据快速读出,但此时FIFO的读时钟采用的和FIFO写相同时钟。

如何决定采样时钟,FIFO的读写时钟和FFT计算时钟?如何改进这个方法?

部分程序:
module FIFO_0515
  #(parameter N = 12//AD resolution
            )
    (
          input wire clk, rst,  
          input wire done,rfd,
          input wire [N-1:0] din,
          output reg start,
          output wire [N+4-1:0] dout,
          output wire full,empty,
          output reg wr_en, rd_en,
          output wire [15:0] din_0
   );

//reg wr_en, rd_en;
//状态声明
localparam IDLE = 4'b0001,//对FIFO初始化,写0
          WRITE0 = 4'b0010,//循环写FIFO,1024*10次读1位
                              WRITE1 = 4'b0100,//写一位
                              READ = 4'b1000;//装载数据
//状态寄存器                     
reg [3:0] current_state, next_state;

//状态控制
always @(posedge clk)
   if(rst)
             current_state <= IDLE;
          else
             current_state <= next_state;
                    
//在初始化时向FIFO写0控制      
wire [N+4-1:0] sum;
assign sum = din + dout;
//wire [15:0] din_0;
reg ctr;
//assign ctr = (current_state == IDLE)?  0 : 1;
assign din0 = ctr ? sum : 0;      

//reg [9:0] count_idle;
reg [13:0] count_write;
reg [1:0] count_start;

//状态转移
always @*
   begin
          next_state = current_state;
   //count_idle = 1024;
           count_write=1024*10;
           count_start=3;
          wr_en = 0;
          rd_en = 0;
          start = 0;
          ctr=1;
          case(current_state)
              
                    IDLE:
                        begin
                                 wr_en = 1;
                                       rd_en = 0;
                                       ctr =0 ;
                                 if(full)
                                           begin
                                           next_state = WRITE0;
                                                        
                                                        end
                                      // else
                                    // count_idle = count_idle - 1;
                             end
                    WRITE0:
                        begin
                                 wr_en=0;
                                       rd_en=1;
                                       count_write= count_write -1;
                                        next_state = WRITE1;
                              end
                    WRITE1:
                        begin
                                 wr_en = 1;
                                       rd_en = 0;
                                       if(count_write == 0)
                                          next_state = READ;
                                       else                                       
                                          next_state = WRITE0;
                              end
                    READ:
                       begin
                                 wr_en=0;
                                       if(rfd)
                                         rd_en =1;
                                        else rd_en = 0;
                                       if(count_start != 0)
                                           begin
                                                            start = 1;
                                                                  count_start = count_start - 1;
                                                        end
              if(empty)
                  next_state = IDLE;                                    
                                                
                             end
                             
                     
          endcase
          end
         
                             
                             

FIFO uu_fifo (
.rst(rst), // input rst
   
.clk(clk), // input rd_clk
.din(din_0), // input [15 : 0] din
.wr_en(wr_en), // input wr_en
.rd_en(rd_en), // input rd_en
.dout(dout), // output [15 : 0] dout
.full(full), // output full
.empty(empty) // output empty
);

endmodule

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 05:20

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

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