2013-01-01 38 views
5

Bạn có thể cho tôi biết nếu có cách nào tốt hơn để viết bộ mã hóa ưu tiên trong VHDL hơn là chỉ sử dụng câu lệnh if-else? Ý tôi là, tôi đã có mã này và nó hoạt động, nhưng nó có thể viết ngắn hơn không? Switch là một std_logic_vector.cách ngắn để viết bộ mã hóa ưu tiên VHDL

Cảm ơn sự giúp đỡ của bạn!

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 

Trả lời

8

Trong quá trình xử lý, bạn có thể sử dụng vòng lặp.

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; 

Lưu ý rằng nếu nhiều công tắc được đặt, biến được gán nhiều lần. Tuy nhiên, khi vòng lặp được thực hiện theo thứ tự tăng dần, chiến thắng cuối cùng (cao nhất) được giao.

Ngẫu nhiên quá trình này, giống như của bạn là tổ hợp, nhưng tôi đã xóa các tín hiệu không cần thiết khỏi danh sách độ nhạy. Nó sẽ là tốt hơn để làm cho nó đồng bộ;

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