我试图根据来自AXI流信号的信号来计算像素,例如DbFunctions
和tuser
。我写了这个:
tlast
我收到了以下模拟输出
我的问题:
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
吗?0
条件?rising_edge(signal)
,然后在下一个周期中将计数设置为零。不使用信号就可以做到这一点吗? 由于
答案 0 :(得分:0)
首先:不要制作v_hcount
和v_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_hcount
和v_linecount
初始化为1,但将其重置为0?