首页 文章

VHDL解复用器输出端口之间切换信号

提问于
浏览
0

请放轻松我,我是新手...... :)我有一个信号,我希望根据计数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位基本上会再次触发,然后输出再次切换到TX_ADDR或TX_DATA,具体取决于sCNT的状态 .

谢谢!

约翰

编辑:这是完整更新和“工作”代码 . 我没有看到我可以将这么多代码粘贴到评论中,所以我想我会在这里分享:

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;

1 回答

  • 3

    您应该使用时钟来驱动您的过程 .

    process(clk)
    begin
    
        if rising_edge(clk) then
    
            if sCNT = false then
                TX_ADDR <= sTXD;
                sCNT <= true;
            else
                TX_DATA <= sTXD;
                sCNT <= false;
            end if;
    
        end if;
    
    end process
    

    clk 这里应该是您的连续数据的时钟 . 它的方式,它's '喜欢' your process in an infinite loop. You change ' sCNT',你希望它立即更新?但是当你使用时钟时,它只会根据新数据(同步到 clk )更新itselft .

相关问题