Das folgende VHDL-Design soll die N- ten Bits aus den vier Werten x_0, x_1, x_2 und x_3 extrahieren und bei jedem Takt einen neuen Wert erzeugen, aber das geschieht nicht.
Nachfolgend finden Sie das Design und die generierte Ausgabe für einige erzwungene Werte für x_0 = 1100, x_1 = 0100, x_2 = 0010 und x_3 = 1011.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity gen_input is
port (x_0,x_1,x_2,x_3 : in std_logic_vector(3 downto 0);
y : out std_logic_vector(3 downto 0);
clk : std_logic);
end gen_input;
architecture Behavioral of gen_input is
signal i : integer := 0;
begin
inst_process : process (clk,x_3,x_2,x_1,x_0)
begin
if(clk'event and clk='1') then
if(i < 4) then
y <= x_3(i)&x_2(i)&x_1(i)&x_0(i);
i <= i + 1;
else
i <= 0;
end if;
end if;
end process inst_process;
end Behavioral;
und jeden Takt einen neuen Wert schaffen, aber das passiert nicht
Der Grund dafür ist, dass Ihr Code einen Taktzyklus hat, dem kein Ausgang zugewiesen ist:
if(clk'event and clk='1') then
if(i < 4) then
y <= x_3(i)&x_2(i)&x_1(i)&x_0(i);
i <= i + 1;
else
i <= 0; -- here you have no assignment to y
end if;
end if;
Außerdem wäre Ihr Code einfacher, wenn Sie i
als variable
anstelle von deklarieren würden signal
, was Sie wahrscheinlich sowieso beabsichtigen. Siehe dies für einige Diskussionen über die Unterschiede.
Dieser Code ist wahrscheinlich das, wonach Sie suchen (als Simulation):
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity gen_input is
end gen_input;
architecture Behavioral of gen_input is
signal y : std_logic_vector(3 downto 0);
signal clk : std_logic := '0';
constant x_0 : std_logic_vector(3 downto 0) := b"1100";
constant x_1 : std_logic_vector(3 downto 0) := b"0100";
constant x_2 : std_logic_vector(3 downto 0) := b"0010";
constant x_3 : std_logic_vector(3 downto 0) := b"1011";
begin
clkgen: process
begin
wait for 10 ns;
clk <= not clk;
end process clkgen;
inst_process : process (clk)
variable i : natural range 0 to 3 := 0;
begin
if rising_edge(clk) then
y <= x_3(i) & x_2(i) & x_1(i) & x_0(i);
i := i + 1;
if i = 4 then
i := 0;
end if;
end if;
end process inst_process;
end Behavioral;
Beachten Sie, dass Sie, da innerhalb des Prozesses i
als deklariert ist variable
, inkrementieren i
und dann sofort prüfen können, ob es auf 0 zurückgesetzt werden soll. Sie könnten auch Folgendes tun:
if i = 3 then
i := 0;
else
i := i + 1;
end if;
aber es ist mehr Tippen und nicht notwendig. In beiden Fällen erhalten Sie am Ende genau dieselbe RTL.
Hier ist die Sim:
user_1818839
Toni M
user_1818839
Toni M
Benutzer8352
clk'event and clk='1
während sie nicht erfüllt wärerising_edge(clk)
, was einen Übergang von „0“ oder „L“ zu „1“ oder „H“ erfordert (Filtern des Parameterwerts und des letzten Werts durch die Funktion An_X01). Beachten Sie, dass der erste Nicht-U-Werty_gen
der zweite Bitwert von X_3–X_0 ist. Bitte formulieren Sie eine Frage.Benutzer8352
WilfredK