打印

帮我看看哪儿出现问题了

[复制链接]
989|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wzm123456|  楼主 | 2012-3-29 23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
---系统时钟clk为20MHZ,FPGA为EP4CE15E22C8,环境为quartus10.1。
  --问题现象:要将sv_reg_01到sv_reg_06的数据保存到外部存储器中,
  ---但是sv_reg_01,sv_reg_012,sv_reg_03,sv_reg_04的数据有时出现错误,而sv_reg_05和
  ---sv_reg_06不出现错误。
  ---我将sv_reg_05和sv_reg_06写成立即数主要是为了对比一下。
  --发现错误是依据从存储器读出的数据来判断的,对存储器的读写我已经验证过,没有错误。
  ---比如sv_cj_times_sum上一次的数据为100,下一次写的应当为101,但是这时偶然会变为别的数据如1923。
  ---对存储器写的时间少于cj_times_sum_标志寄存器的脉冲周期。
----部分程序如下
signal cj_times_sum_clr:std_logic;
signal cj_times_sum_标志寄存器:std_logic;
signal cj_times_sum:std_logic_vector(31 downto 0);
signal sv_cj_times_sum:std_logic_vector(31 downto 0);
signal cj_clk_标志寄存器_1:std_logic;
signal cj_clk_标志寄存器_2:std_logic;
signal cj_clk_标志寄存器:std_logic;

signal sv_reg_01:std_logic_vector(7 downto 0);
signal sv_reg_02:std_logic_vector(7 downto 0);
signal sv_reg_03:std_logic_vector(7 downto 0);
signal sv_reg_04:std_logic_vector(7 downto 0);
signal sv_reg_05:std_logic_vector(7 downto 0);
signal sv_reg_06:std_logic_vector(7 downto 0);



------------------------------------------------
-----------计数器进程-----------------------------
----cj_times_sum_标志寄存器高电平维持1个clk
process(clk)
    begin
     if(clk'event and clk='1') then
      if(cj_times_sum_clr='1')                                                   
        cj_times_sum <= (others=>'0');
     elsif(cj_times_sum_标志寄存器='1')then
        cj_times_sum <= cj_times_sum + 1;
     end if;     
   end if;
   end if;
  end process;
--------------------------------------
--------------------------------
process(clk)
   begin
      if(clk'event and clk='1') then
         cj_clk_标志寄存器_1 <= cj_times_sum_标志寄存器;
         cj_clk_标志寄存器_2 <= cj_clk_标志寄存器_1;
         cj_clk_标志寄存器 <= cj_clk_标志寄存器_2;         
         sv_data_标志寄存器 <= cj_clk_标志寄存器;
      end if;
end process;
--------------------------------------
-------数据采集进程-------------------
-------其中cj_clk_标志寄存器宽度维持1个clk--------
process(clk)
    begin
     if(clk'event and clk='1') then
      if((cj_clk_标志寄存器='1')        
        cj_load_data_标志寄存器 <= '1';                                    
        sv_cj_times_sum <= cj_times_sum;
     elsif(cj_load_data_标志寄存器_clr='1') then      
        cj_load_data_标志寄存器 <= '0';                           
     else
      cj_load_data_标志寄存器 <= cj_load_data_标志寄存器;     
   end if;
   end if;
  end process;
  ---------------------------------------------
  
  -----------------------------------------------
  ---保存数据的进程--------------
  ---其中sv_data_标志寄存器高电平维持1个clk
  process(clk)
    begin
      if(clk'event and clk='1')then
         if(sv_data_标志寄存器='1')then
            sv_reg_01 <= sv_cj_times_sum(31 downto 24);
            sv_reg_02 <= sv_cj_times_sum(23 downto 16);
            sv_reg_03 <= sv_cj_times_sum(15 downto 8);
            sv_reg_04 <= sv_cj_times_sum(7 downto 0);
            sv_reg_05 <= "01010101";  --55H
            sv_reg_06 <= "10101010";  --AAH         
          end if;      
      end if;   
  end process;

相关帖子

沙发
wzm123456|  楼主 | 2012-3-29 23:10 | 只看该作者
上述变量中的“标志寄存器”应当为标志寄存器,不知为什么发上去变成了这样.

使用特权

评论回复
板凳
wzm123456|  楼主 | 2012-3-29 23:11 | 只看该作者
上述变量中的“标志寄存器”应当为标志寄存器,不知为什么发上去变成了这样.

使用特权

评论回复
地板
wzm123456|  楼主 | 2012-3-29 23:13 | 只看该作者
上述变量中的“标志寄存器”应当为“F”、“L”、“G”,不知为什么发上去变成“标志寄存器”了.

使用特权

评论回复
5
viatuzi| | 2012-3-30 06:43 | 只看该作者
做过STA么?
虽然20MHz速度是挺慢的,但还是可以做一下STA先把时序上的问题排除掉。

使用特权

评论回复
6
wzm123456|  楼主 | 2012-3-30 19:19 | 只看该作者
对这方面不是很熟悉,只是简单的写了个时序约束条件,综合结果的fmax为150Mhz。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

5

帖子

1

粉丝