【发布时间】:2014-12-07 01:44:05
【问题描述】:
是否有一种简单的方法来实现以下行:
DataTX(255-index*8 downto 248-index*8) <= encoded;
index 是一个整数,可以在 0 到 31 的范围内。
DataTx 是一个 STD_LOCIC_VECTOR(263 down to 0)。
现在它当前抛出一个错误,指出 DataTx(263) 和 DataTx(260) 有多个驱动程序,这实际上并没有发生在这一行中。
有没有什么方法可以编写或实现它而不必做大量的 if 语句或 case 语句。
在此先感谢。
编辑: 上面的行放在一个进程中。 同时DataTx的其他部分在进程外设置如下
DataTX(263 downto 261) <= "000" when spi_mode=reading else "001" when spi_mode=writing
else "011" when spi_mode=rxMode else "101" when spi_mode=txMode;
DataTX(260 downto 256) <= SPI_register;
编辑2:
DataTX(263 downto 261) <= "000" when spi_mode=reading else "001" when spi_mode=writing
else "011" when spi_mode=rxMode else "101" when spi_mode=txMode;
DataTX(260 downto 256) <= SPI_register;
-- Set the RF Chan based on input
rf_chan <= RfChans(0) when base_selection="00" else RfChans(1) when base_selection="01" else
RfChans(2) when base_selection="10" else RfChans(3) when base_selection="11";
-- Set the Base Address based on input
base_addr <= Bases(0) when base_selection="00" else Bases(1) when base_selection="01" else
Bases(2) when base_selection="10" else Bases(3) when base_selection="11";
process(clk)
variable s_index : integer range 0 to 31 := 0;
variable e_index : integer range 0 to 31 := 0;
variable r_index : integer range 0 to 31 := 0;
variable counter : integer range 0 to 7 := 0;
begin
if (rst = '1') then
...
elsif (clk'event and clk='1') then
case state is
when setup =>
case setup_state is
-- Some code like this is set here
spi_mode <= writing;
spi_register <= "10000";
DataTX(255 downto 224) <= base_addr;
DataTX(223 downto 0) <= (others => '1'); -- Fill with FF
when idle =>
... -- nothing here of relevance
-- Moves to E_setup
when E_setup =>
-- DataTx set here
spi_mode <= writing;
spi_register <= "00000";
SPI_trigger <= '1';
state <= E_setupd;
when E_setupd => -- one cycle delay
SPI_Trigger <= '0';
if ((counter = 7) and SS='1') then
-- Signals that SPI module has finished
state <= E_encode;
counter := 0;
elsif (counter < 7) then -- Give it some time to start
counter := counter +1;
end if;
when E_encode =>
encode_input <= SEQUENCE(e_index);
e_index := e_index +1;
state <= E_done;
when E_done =>
spi_register <= "00000";
-- Error here
DataTX(255-index*8 downto 248-index*8) <= encoded;
if (e_index = 31) then
e_index := 0;
state <= E_send;
else
e_index := e_index +1;
state <= E_encode;
end if;
end case;
end if;
end process;
【问题讨论】:
-
在适当的上下文中,您给出的行将适用于
index等适当的值。如果没有更多代码,我们只能猜测多个驱动程序的来源。请使用您可以制作的最小的独立示例来更新 Q 以说明问题。 -
看来错误不在于切片,而在于分配给
DataTX(263和DataTX(260)。更多代码(可能还有错误日志)将有助于确定问题。