2017-08-22 4 views
0

Ich möchte Verschiebung std_logic_vector.Wie man std_logic_vector verschiebt?

Aber dieser Code hat einen Fehler:

architecture led_main of testing is 
    signal clk_cnt : std_logic_vector(64 DOWNTO 0) := (others => '0'); 
    signal led_buf : std_logic_vector(3 downto 0) := "0001"; 
begin 
    process(clk) 
    begin 
     if rising_edge(clk) then 
      clk_cnt <= clk_cnt + 1; 
      if clk_cnt >= 24999999 then 
       led_buf <= led_buf(0) & led_buf(3 downto 1); 
      end if; 
     end if; 
    end process; 

    ground <= '0'; 
end led_main; 

Ich denke, "0001", "0010", "0100" ...

+0

diese co de led_buf <= led_buf (0) & led_buf (3 abwärts 1); ändern led_buf <= led_buf srl 1; (Fehler) –

+0

Möchten Sie verschieben oder drehen? Ihre Frage fragt nach Verschiebung, aber Ihr Code zeigt rotieren. Willst du eine Operation nach rechts oder links, weil dein Code auf der rechten Seite ist, während deine Texte ein Beispiel auf der linken Seite zeigt! – Paebbels

+0

@ YannVernier Nein, ein Barrel Shifter ist eine Implementierungsform eines Shifters, der sehr schnell, aber auch ressourcenintensiv ist. Sie können eine Barrel Shift auch auf Rotationen erweitern, aber der Barrel Shifter beschreibt die Struktur, wie man einen guten Shifter baut, nicht dass er rotiert. Finden Sie diese Antwort [n Bit Barrel Shifter] (https://stackoverflow.com/questions/26551049/vhdl-n-bit-barrel-shifter) für die Barrel Shifter-Struktur. – Paebbels

Antwort

4

Ihr Shifter ist OK. Eigentlich ist es ein Rotator.

Aber Ihr Counter ist zu groß (65 Bits) und es wird nicht zu einem geeigneten Zeitpunkt umgerollt oder auf Null zurückgesetzt. Ihr derzeitiges Design wartet auf 25M Zyklen und wechselt dann in jedem Zyklus von 25M auf 2 ** 64.

Darüber hinaus verwenden Sie ein nicht standardmäßiges IEEE-Paket, um arithmetische Operationen (Addition) unter std_logic_vector durchzuführen. Bitte verwenden Sie den Typ unsigned aus dem Paket numeric_std.

function log2ceil(arg : positive) return natural is 
    variable tmp : positive; 
    variable log : natural; 
begin 
    if arg = 1 then return 0; end if; 
    tmp := 1; 
    log := 0; 
    while arg > tmp loop 
     tmp := tmp * 2; 
     log := log + 1; 
    end loop; 
    return log; 
end function; 

Quelle: https://github.com/VLSI-EDA/PoC/blob/master/src/common/utils.vhdl

Voll Code Rewrite:

use IEEE.numeric_std.all; 

architecture led_main of testing is 
    constant CNT_MAX : positive := 25000000; 
    signal clk_cnt : unsigned(log2ceil(CNT_MAX) - 1 downto 0) := (others => '0'); 
    signal led_buf : std_logic_vector(3 downto 0)   := "0001"; 
begin 
    process(clk) 
    begin 
     if rising_edge(clk) then 
      clk_cnt <= clk_cnt + 1; 
      if clk_cnt = (CNT_MAX - 1) then 
       clk_cnt <= (others => '0'); 
       led_buf <= led_buf(0) & led_buf(3 downto 1); 
      end if; 
     end if; 
    end process; 
end led_main; 

`

Die benötigte Anzahl von Bits, die für Ihre Zähler kann durch eine log2 Funktion wie folgt erhalten werden "

Verwandte Themen