【问题标题】:short way to write VHDL priority encoder编写VHDL优先级编码器的捷径
【发布时间】:2012-12-16 07:02:25
【问题描述】:

您能否告诉我是否有比仅使用 if-else 语句更好的方法在 VHDL 中编写优先级编码器?我的意思是,我有这个代码并且它可以工作,但它可以写得更短吗? Switch 是一个 std_logic_vector。

感谢您的帮助!

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

【问题讨论】:

    标签: if-statement vhdl encoder


    【解决方案1】:

    在一个进程中,你可以使用循环。

    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;
    

    【讨论】:

    • 您还可以从最高到最低的 switch 排序评估,并在 if 语句中使用 exit 语句。它简化了综合优化的数量并加快了仿真速度。当没有“1”时,您可能还想将highest_switch 分配给NONE(设置为15 会出现原始缺陷)。
    • @user1155120 感谢您的回滚。您对退出语句是正确的,但我怀疑模拟时间很重要。正如你所猜测的,我想效仿原版的“特征”。
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2016-08-18
    • 2016-03-10
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多