如何使用AXI Stream信号计算像素?

时间:2017-05-30 09:35:32

标签: vhdl

我试图根据来自AXI流信号的信号来计算像素,例如DbFunctionstuser。我写了这个:

tlast

我收到了以下模拟输出enter image description here

我的问题:

  1. p_pixelcount : process (s_clk) variable v_hcount : integer := 1; variable v_linecount: integer:= 1; begin if (rising_edge(s_clk)) then if (s_maxis_s_tvalid_out = '1')and (s_maxis_s_tready_in = '1') then if ( rising_edge(s_maxis_s_tuser_out) ) then v_hcount := 0; v_linecount := 0; else v_hcount := v_hcount + 1; end if; if (s_maxis_s_tlast_out = '1') then v_hcount := 0; v_linecount := v_linecount + 1; end if; end if; end if; end process p_pixelcount; 为高时,tuser不应为v_hcount吗?
  2. 是否允许在同一过程中对不同信号使用两个0条件?
  3. 我想要计算到rising_edge(signal),然后在下一个周期中将计数设置为零。不使用信号就可以做到这一点吗?
  4. 由于

1 个答案:

答案 0 :(得分:0)

首先:不要制作v_hcountv_linecount个变量。它们是时钟,因此需要注册:使用信号。 (可合成代码)

不,你不能在这样的过程中使用rising_edge两次。如果要检测0-> 1转换,则需要在(正确的)时钟域中执行此操作。 E.g。

s_maxis_s_tuser_out_delay <= s_maxis_s_tuser_out when rising_edge(s_clk);
s_maxis_s_tuser_out_rising <= 
    '1' when s_maxis_s_tuser_out = '1' and s_maxis_s_tuser_out_rising = '0'
    else '0';

但在这种情况下你应该只使用

if (s_maxis_s_tuser_out = '1') then
    v_hcount    <= 1;
    v_linecount <= 0;
else 
    v_hcount <= v_hcount + 1;
    if (s_maxis_s_tlast_out = '1') then
       v_hcount <= 0;
       v_linecount <= v_linecount + 1;
    end if;
end if; 

为什么将v_hcountv_linecount初始化为1,但将其重置为0?