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