将VHDL转换为Verilog

时间:2016-03-23 15:39:23

标签: vhdl verilog

我正在尝试将下面的vhdl代码转换为verilog,但它无法正常工作。我已经完成了大部分工作,但我想我可能错误地转换了VHDL关键字others。有人可以帮忙吗?

VHDL代码

entity debounce is
Port ( clk : in  STD_LOGIC;
       i : in  STD_LOGIC;
       o : out  STD_LOGIC);
end debounce;

architecture Behavioral of debounce is
    signal c : unsigned(23 downto 0);
begin
   process(clk)
   begin
      if rising_edge(clk) then
         if i = '1' then
            if c = x"FFFFFF" then
               o <= '1';
            else
               o <= '0';
            end if;
            c <= c+1;
         else
            c <= (others => '0');   --LINE IN QUESTION
            o <= '0';
         end if;
      end if;
  end process;
end Behavioral;

使用工具建议更新了Verilog代码

module debounce(input clk, input i, output o); 
    reg unsigned [23:0] c;
    reg out_temp;

    always @(posedge clk)begin
        if(i == 1)begin
            if(c==24'hFFFFFF)begin
                out_temp <= 1'b1;           
            end
            else begin
                out_temp <= 1'b0;
            end
            c <= c+1'b1;
        end
        else begin
            c <= {24{1'b0}};
            out_temp <= 1'b0; 
        end
    end
    assign o = out_temp;
 endmodule

2 个答案:

答案 0 :(得分:0)

当你说“看它是否有效”时,你在模拟吗?如果没有,这样做是个好主意。这是一个简单的测试平台,可以比较两个版本:

module debounceTest; 
    reg clk=1'b0;
    reg i=1'b1;
    reg error=1'b0;
    wire oVerilog, oVHDL;
    integer k;

    debounceVerilog UUTverilog (clk, i, oVerilog);

    debounceVHD UUTvhdl (clk, i, oVHDL);

    always
      #5 clk = ~clk;

    initial begin
    for (k=0; k<2**26; k=k+1) begin
      if ((k%(2**25))==0)
        i = ~i;
      #10;
      end
    $stop;
    end

    always @* begin
      #1;
      if (oVHDL!==oVerilog)
        error = 1'b1;
    end

 endmodule

(实际上,我减少了模型中计数器的大小并模拟了更短的时间 - 这需要相当长的时间来模拟)。

为什么不对从一种语言翻译到另一种语言的所有这些块执行此操作?

答案 1 :(得分:-1)

如何将vhdl翻译成verilog:

图书馆; 使用ieee.std_logic_1164.all; - Definiçãodasbibliotecas a serem utilizadas no projeto。

实体elevador_simples_4是 - Iníciodoprojeto,ondeserra definido as entradasesaídas

                                        -- utilizadas
port
(
    RESETn, CLK             : in std_logic;

    SNS_ANDAR, BOTAO        : in std_logic_vector (1 to 5);

    MOTOR                       : out std_logic_vector (1 downto 0);

    TRAVA_PORTA             : out std_logic

);

结束实体elevador_4;

Elevador_4的架构comportamento是

- CHAMADOS registra os andares em que o elevador foi solicitado

-- ANDAR registra o ultimo andar pelo qual o elevador passou

signal  CHAMADOS, ANDAR             : std_logic_vector (1 to 4);



-- SENTIDO apresenta o sentido que o elevador esta indo

-- '1' = subindo e '0' = descendo
signal  PAUSA_ANDAR     : std_logic;



-- Estados associados ao comportamento do elevador:

type ESTADO is (ESPERA, PARTIDA, PARADO, DESCENDO, SUBINDO);



-- Estado atual da maquina de estados

signal MAQUINA_ELEVADOR : ESTADO;

signal flag : std_logic := '1';

开始

process (RESETn, CLK, SNS_ANDAR, BOTAO, CHAMADOS, MAQUINA_ELEVADOR)

    variable ANDAR_CHAMADO: std_logic_vector (1 to 4) := "0000";
begin


    if (CLK'event and CLK = '1' ) then

        if  (SNS_ANDAR /= "0000") then

            ANDAR <= SNS_ANDAR;

        end if;



        if (BOTAO /= "0000") then

        -- Se o botao for apertado, ANDAR_CHAMADO seta o bit correspondente ao andar

        -- de forma que ele nao registra duas vezes o mesmo andar 

            ANDAR_CHAMADO := ANDAR_CHAMADO or BOTAO;

        end if;



        if  (MAQUINA_ELEVADOR = PARADO) then

                ANDAR_CHAMADO := ANDAR_CHAMADO and (not SNS_ANDAR);

        end if;

    end if;

    CHAMADOS <= ANDAR_CHAMADO;


end process;


-- Maquina de estados

process (RESETn, CLK, MAQUINA_ELEVADOR, ANDAR, PAUSA_ANDAR) is
 begin
    if (RESETn = '0') then
        MAQUINA_ELEVADOR <= ESPERA;

    elsif (CLK'event and CLK = '1' ) then

        case MAQUINA_ELEVADOR is



        -- Se o elevador chega a algum andar ele vai para o estado PARADO

            when ESPERA =>

                    MAQUINA_ELEVADOR <= PARTIDA;



            when PARTIDA =>

                if (SNS_ANDAR /= "0000") then

                    MAQUINA_ELEVADOR <= PARADO;

                end if;

-- Elevador SUBINDO:

        -- O elevador sobe até o andar mais alto e depois vai descendo e parando

            when SUBINDO =>

                -- Rotina de detecçao do andar mais alto solicitado

                if CHAMADOS(4) = '1' then

                    if SNS_ANDAR (4) /= '0'  then

                    MAQUINA_ELEVADOR <=  PARADO;

                    flag <= '0';

                    end if;

                elsif CHAMADOS(3) = '1' then

                    if SNS_ANDAR (3) /= '0'  then

                    MAQUINA_ELEVADOR <=  PARADO;

                    flag <= '0';

                    end if;

                elsif CHAMADOS(2) = '1' then

                    if SNS_ANDAR (2) /= '0'  then

                    MAQUINA_ELEVADOR <=  PARADO;

                    flag <= '0';

                    end if;                     

                elsif CHAMADOS(1) = '1' then

                    if SNS_ANDAR (1) /= '0'  then

                    MAQUINA_ELEVADOR <=  PARADO;

                    flag <= '0';

                    end if;



                end if;



            -- Se o elevador passar por algum andar solicitado, ele vai para o estado PARADO,

            -- e desce até o andar mais baixo solicitado antes de voltar a subir.

            when DESCENDO =>

                if ( SNS_ANDAR and CHAMADOS) /= "0000"  then

                    MAQUINA_ELEVADOR <= PARADO;

                end if;

                -- Rotina de detecção do andar solicitado mais baixo para possibilitar a habilitação

                -- de subida novamente

                if CHAMADOS(1) = '1' then

                    if SNS_ANDAR (1) /= '0'  then

                    flag <= '1';

                    end if;

                elsif CHAMADOS(2) = '1' then

                    if SNS_ANDAR (2) /= '0'  then

                    flag <= '1';

                    end if;

                elsif CHAMADOS(3) = '1' then

                    if SNS_ANDAR (3) /= '0'  then

                    flag <= '1';

                    end if;                     

                elsif CHAMADOS(4) = '1' then

                    if SNS_ANDAR (4) /= '0'  then

                    flag <= '1';

                    end if;

                elsif CHAMADOS(5) = '1' then

                    if SNS_ANDAR (5) /= '0'  then

                    flag <= '1';

                    end if;

                end if;





            when others =>  -- Ou seja, quando PARADO:

                if (PAUSA_ANDAR = '0') and (CHAMADOS /= "0000") then

                    if (CHAMADOS < ANDAR) and flag = '1' then

                        MAQUINA_ELEVADOR <= SUBINDO;                         

                    else

                        MAQUINA_ELEVADOR <= DESCENDO;

                    end if;

                end if;

        end case;                        
    end if;

end process;



-- Pausa no Andar:

process (RESETn, CLK, MAQUINA_ELEVADOR)

    variable CONTAGEM   : integer range 0 to 8000 :=0;

begin

    if (RESETn = '0')   then
            CONTAGEM :=0;

    elsif (CLK'event and CLK = '1') then

       if (MAQUINA_ELEVADOR = PARADO) then

            if CONTAGEM < 2000 then

                CONTAGEM := CONTAGEM + 1;

                PAUSA_ANDAR <= '1';

            else

                PAUSA_ANDAR <= '0';

            end if;

        else

            PAUSA_ANDAR <= '1';

            CONTAGEM :=0;

        end if;

    end if;

end process;



controla_saidas:

with MAQUINA_ELEVADOR select
    MOTOR <=    "10" when PARTIDA,

                    "01" when SUBINDO,

                    "10" when DESCENDO,

                    "00" when OTHERS;



with MAQUINA_ELEVADOR select
    TRAVA_PORTA  <= '0' when  PARADO,

                          '1' when OTHERS;

end architecture comportamento;