If statement 编写VHDL优先级编码器的一种简单方法

If statement 编写VHDL优先级编码器的一种简单方法,if-statement,vhdl,encoder,If Statement,Vhdl,Encoder,您能告诉我是否有比使用if-else语句更好的方法用VHDL编写优先级编码器吗?我的意思是,我有这个代码,它可以工作,但它可以写得更短吗?开关是一个标准逻辑向量 谢谢你的帮助 shifting : PROCESS(CLK_IN, new_length_ready, switch) VARIABLE highest_switch : INTEGER RANGE 0 TO 15 := 15; BEGIN -- priority encoder, changes the

您能告诉我是否有比使用if-else语句更好的方法用VHDL编写优先级编码器吗?我的意思是,我有这个代码,它可以工作,但它可以写得更短吗?开关是一个标准逻辑向量

谢谢你的帮助

shifting : PROCESS(CLK_IN, new_length_ready, switch)

    VARIABLE highest_switch :      INTEGER RANGE 0 TO 15 := 15;

BEGIN

    -- priority encoder, changes the length of the snake track 
    -- ( i.e., number of leds for the snake to move )

    IF switch(15) = '1' THEN
        highest_switch := 15;
    ELSIF switch(14) = '1' THEN
        highest_switch := 14;
    ELSIF switch(13) = '1' THEN
        highest_switch := 13;
    ELSIF switch(12) = '1' THEN
        highest_switch := 12;
    ELSIF switch(11) = '1' THEN
        highest_switch := 11;
    ELSIF switch(10) = '1' THEN
        highest_switch := 10;
    ELSIF switch(9) = '1' THEN
        highest_switch := 9;
    ELSIF switch(8) = '1' THEN
        highest_switch := 8;
    ELSIF switch(7) = '1' THEN
        highest_switch := 7;
    ELSIF switch(6) = '1' THEN
        highest_switch := 6;
    ELSIF switch(5) = '1' THEN
        highest_switch := 5;
    ELSIF switch(4) = '1' THEN
        highest_switch := 4;
    ELSIF switch(3) = '1' THEN
        highest_switch := 3;
    ELSIF switch(2) = '1' THEN
        highest_switch := 2;
    ELSIF switch(1) = '1' THEN
        highest_switch := 1;
    ELSIF switch(0) = '1' THEN
        highest_switch := 0;
    ELSE
        highest_switch := 15;
    END IF

在流程中,可以使用循环

type Switches is range 0 to 15;

shifting : PROCESS(switch)
   VARIABLE highest_switch : Switches := 15;
begin
   for i in Switches loop
      if switch(i) = '1' then 
         highest_switch := i;
      end if;
   end loop
...
end process;
请注意,如果设置了多个开关,则会多次指定该变量。然而,当循环以递增的顺序执行时,最后(最高)的分配获胜

顺便说一句,这个过程和你的一样是组合的,但我从灵敏度列表中删除了不必要的信号。最好使其同步

shifting : PROCESS(clk)
begin
   if rising_edge(clk) then
      for i in ...
   end if;
end process;

您还可以将求值顺序从最高到最低切换,并在if语句中使用exit语句。它简化了综合优化的数量,模拟速度更快。当NONE为“1”时,您可能还希望将最高的_开关分配给NONE(设置为15在原始设置中似乎是一个缺陷)。@user1155120感谢回滚。关于退出声明你是对的,但我怀疑模拟时间是否重要。正如你所猜测的,我想模仿原作的“特点”。