请放轻松,我是新手... :) 我有一个信号,我想根据计数 CNT 的值在两个可用输出端口 TX_ADDR 和 TX_DATA 之一之间切换输出。这个想法是将一些值首先传输到我串行获得的 32 位值到地址总线,然后到数据总线,然后是地址,然后是数据......等等。而且我基本上会无限期地保持这种常规。
如果我有类似的东西:
process(sCNT)
begin
if(sCNT = false) then
TX_ADDR <= sTXD;
sCNT <= true;
else
TX_DATA <= sTXD;
sCNT <= false;
end if;
end process;
......它似乎不起作用。基本上这个想法是,一旦另一个进程串行接收 32 位数据,就需要切换 sCNT('s' 表示信号)。接下来的 32 位基本上会再次触发,然后根据 sCNT 的状态再次将输出切换到 TX_ADDR 或 TX_DATA。
谢谢!
约翰
编辑:这是完整的更新和“工作”代码。我没有看到我可以将这么多代码粘贴到评论中,所以我想我会在这里分享:
process(CLK, RST)
begin
if (RST = '1') then
sRXD <= x"00000000";
sINDEX <= 31;
sTXD <= x"00000000";
sSCLK_old <= '0';
sSCLK_l <= '0';
sCS_old <= '0';
sCS_l <= '0';
DONE <= '0';
sMOSI_l <= '0';
elsif( rising_edge(CLK) ) then
sSCLK_l <= SCLK;
sSCLK_old <= sSCLK_l;
sCS_l <= CS;
sCS_old <= sCS_l;
DONE <= '0';
sMOSI_l <= MOSI;
if(TX_EN = '1') then
sTXD <= TX_DATA;
end if;
if (sCS_old = '1' and sCS_l = '0') then
sINDEX <= 31;
end if;
if( sCS_l = '0' ) then
if(sSCLK_old = '0' and sSCLK_l = '1') then
sRXD <= sRXD(30 downto 0) & sMOSI_l;
if(sINDEX = 0) then
sINDEX <= 31;
else
sINDEX <= sINDEX-1;
end if;
elsif(sSCLK_old = '1' and sSCLK_l = '0') then
if( sINDEX = 31 ) then
DONE <= '1';
end if;
sTXD <= sTXD(30 downto 0) & '1';
end if;
end if;
if(sCNT = false) then
RX_ADDR <= sRXD;
sCNT <= true;
else
RX_DATA <= sRXD;
sCNT <= false;
end if;
end if;
end process;
MISO <= sTXD(31);
end arch;