- --当一组数据来到时,要求检测到55、AA两个字节,然后把两个字节后边的N个字节保存下来
- --这段程序我检测到55、aa两个数据后,拉高一个标志位falg,然后对rdsig计数N后,再拉低标志位
- --然后在下一模块,当标志位为1时,保存数据
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.std_logic_unsigned.all;
- entity frametest is
- port(
- datain:in std_logic_vector(7 downto 0);
- rdsig :in std_logic; --高电平时,一个字节的数据来到
- flag :out std_logic; --检测到帧头后,帧数据的长度
- );
- end entity frametest;
- architecture behav of frametest is
- constant N:integer:=10;
- constant framehead1:std_logic_vector(7 downto 0):="01010101";
- constant framehead2:std_logic_vector(7 downto 0):="10101010";
- signal cnt:integer:(0 to N+1);
- begin
- process(rdsig)
- cin:integer:(0 to 1);
- begin
- if rising_edge(rdsig) then
- IF framehead1=datain then
- cin:=1;
- ELSIF cin=1 and framehead2=datain then
- flag<='1'; --当检测到第一二两个字节为55、AA时,标志位置1
- END IF;
- end if;
-
- if cnt=N+1 then
- flag<='0'; --当有N个数据来到后,标志位置0
- end if;
- end process;
- process(flag,rdsig) --对flag的长度计数
- begin
- if falling_edge(rdsig) then --有数据到来
- if flag='1' then
- cnt<=cnt+1; --数据个数加1
- elsif flag='0' then
- cnt<=0;
- end if;
- end if;
- end process;
- 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。
别的数字我就没试了~~
这是为什么呢??百思不得其解啊~~
此帖出自
小平头技术问答
2. 从逻辑上看,混合了上升沿和下降沿两种描述,时序不知道如何保证的。 代码中错误太多无法编译。
2.不同的进程里也不让用不同的时钟沿吗??为什么有些是正确的,有些不行呢??
一周热门 更多>