[求助] 求大神看看这段程序啊

pinggougou   2015-1-5 00:14 楼主

  1. --当一组数据来到时,要求检测到55、AA两个字节,然后把两个字节后边的N个字节保存下来
  2. --这段程序我检测到55、aa两个数据后,拉高一个标志位falg,然后对rdsig计数N后,再拉低标志位
  3. --然后在下一模块,当标志位为1时,保存数据

  4. library ieee;
  5. use ieee.std_logic_1164.all;
  6. use ieee.std_logic_unsigned.all;

  7. entity frametest is
  8. port(
  9.         datain:in std_logic_vector(7 downto 0);
  10.         rdsig :in std_logic;                        --高电平时,一个字节的数据来到
  11.         flag  :out std_logic;                        --检测到帧头后,帧数据的长度
  12. );

  13. end entity frametest;

  14. architecture behav of frametest is
  15.         constant N:integer:=10;
  16.         constant framehead1:std_logic_vector(7 downto 0):="01010101";
  17.         constant framehead2:std_logic_vector(7 downto 0):="10101010";
  18.         signal cnt:integer:(0 to N+1);
  19. begin
  20.         process(rdsig)
  21.                 cin:integer:(0 to 1);
  22.         begin
  23.            if rising_edge(rdsig) then
  24.                 IF framehead1=datain then
  25.                         cin:=1;
  26.                 ELSIF cin=1 and framehead2=datain then
  27.                         flag<='1';           --当检测到第一二两个字节为55、AA时,标志位置1
  28.                 END IF;
  29.             end if;
  30.             
  31.            if cnt=N+1 then
  32.                 flag<='0';                --当有N个数据来到后,标志位置0
  33.            end if;
  34.         end process;

  35.         process(flag,rdsig)      --对flag的长度计数
  36.         begin
  37.                 if falling_edge(rdsig) then        --有数据到来
  38.                         if flag='1' then
  39.                                 cnt<=cnt+1;        --数据个数加1        
  40.                         elsif flag='0' then
  41.                                 cnt<=0;
  42.                         end if;
  43.                 end if;
  44.         end process;
  45. end behav;



现在是:我用modelsim仿真,完全没问题啊!
可是下载到fpga里就变样了,我用示波器观察的,当N=1,2,3,4,5,7,8,9,11……时,flag的长度是包含N个rdsig。
可是当N=6的时候,flag的长度为3个rdsig;当N=10的时候,flag的长度为7个rdsig。
别的数字我就没试了~~
这是为什么呢??百思不得其解啊~~

回复评论 (3)

1. 你这段代码语法错误很多, modelsim编译不可能通过。
2. 从逻辑上看,混合了上升沿和下降沿两种描述,时序不知道如何保证的。 代码中错误太多无法编译。
点赞  2015-1-5 10:42
1.不好意思,我这是在私人电脑上打的,无法错误没有检查。
2.不同的进程里也不让用不同的时钟沿吗??为什么有些是正确的,有些不行呢??
点赞  2015-1-5 14:58

  让是让,但是要尽量避免。 因为上升沿和下降沿之间传递数据的延时是时钟周期的一半,所以时序分析的时候就要做的更细一些,时序约束文件要做好。 你看下时序分析报告看是否有timing violation.
点赞  2015-1-6 09:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复