Verilog-Frage von VHDL-Programmierer

22/09/2015 - 14:34 von Mathias Weierganz | Report spam
Ich versuche gerade Verilog zu lernen und übertrage dazu
ein einfaches Programm von VHDL nach Verilog. Aber es funktioniert
nicht und ich kann den Fehler nicht finden. Vermutlich wird es ganz
einfach sein...

Das folgende VHDL-Programm übernimmt ein asynchrones Signal i und
erzeugt daraus einen Puls o mit der Lànge von clk.
Die positive Flanke von i setzt das i_ff. Das i_ff wird mit clk
in das Schieberegister sr übernommen und durchgeschoben. Wenn im
sr die Bitfolge 01X steht, wird o für einen Takt high.


entity risingedge2pulse is
Port (
clk : in std_logic;
i : in std_logic;
o: out std_logic
) ;
end risingedge2pulse;

architecture Behavioral of risingedge2pulse is

signal i_ff: STD_LOGIC;
signal sr: std_logic_vector (2 downto 0);

begin

process (clk, i, sr)
begin

if (sr(1) = '1') then
i_ff <= '0';
elsif rising_edge(i) then
i_ff <= '1';
end if;

if rising_edge(clk) then
sr(0) <= i_ff;
sr(2 downto 1) <= sr(1 downto 0);
o <= sr(1) and not sr(2);
end if;
end process;
end Behavioral;


Und hier kommt mein Verilog-Versuch (an dessen Ausgang nie etwas raus
kommt):

module risingedge2pulse_v(
input clk,
input i,
output o
);

reg [2:0] sr;
reg i_latch;

always @(posedge i or posedge sr[1]) begin
if (sr[1] == 1) begin
i_latch <= 0;
end else begin
i_latch <= 1;
end
end

always @(posedge clk) begin
sr[0] <= i_latch;
sr[2:1] <= sr[1:0];
oi <= sr[1] &~ sr[2];
end

assign o = oi;
endmodule
 

Lesen sie die antworten

#1 Johann Klammer
22/09/2015 - 15:37 | Warnen spam
On 09/22/2015 02:34 PM, Mathias Weierganz wrote:
[...]

reg [2:0] sr;
reg i_latch;

always @(posedge i or posedge sr[1]) begin
if (sr[1] == 1) begin
i_latch <= 0;
end else begin
i_latch <= 1;
end
end

always @(posedge clk) begin
sr[0] <= i_latch;
sr[2:1] <= sr[1:0];
oi <= sr[1] &~ sr[2];
end

assign o = oi;
endmodule



kommen nur X 'raus?
Kannst du das sr[] am anfang auf 0 setzen?
(ich glaube mit einem initial block)

Ähnliche fragen