0 / 0 / 0
Регистрация: 29.02.2020
Сообщений: 2
1

Перевод VHDL в Verilog

11.11.2024, 10:50. Показов 500. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Код
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use	IEEE.numeric_std.all;

entity rx_framer is
	 port(
	 	clk_i : in STD_LOGIC;
	 	rst_i : in STD_LOGIC;
	 	s_axis_valid_i  : in STD_LOGIC;
		s_axis_last_i   : in STD_LOGIC;
		s_axis_data_i   : in STD_LOGIC_VECTOR(7 downto 0);
		s_axis_ready_o  : out STD_LOGIC;
		m_axis_valid_o  : out STD_LOGIC;
		m_axis_last_o   : out STD_LOGIC;
		m_axis_data_o   : out STD_LOGIC_VECTOR(7 downto 0);
		
		debug_err_o  : out STD_LOGIC;
		debug_rcv_o  : out STD_LOGIC;
        
        err_cnt_o : out STD_LOGIC_VECTOR(31 downto 0);
        rcv_cnt_o : out STD_LOGIC_VECTOR(31 downto 0)
        

        
        
	     );
end rx_framer;

--}} End of automatically maintained section

architecture rx_framer of rx_framer is

	signal frame_len_reg, frame_mb_len_reg, frame_uart_len_reg : std_logic_vector(15 downto 0):=(others=>'0');
	signal di_reg1, di_reg2, data : std_logic_vector(7 downto 0):=(others=>'0');
	signal frame_len_cnt, frame_mb_len_cnt, frame_uart_len_cnt : unsigned(15 downto 0):=(others=>'1');
	signal last, valid : std_logic:='0';
    
    signal packet_len_cnt: unsigned(15 downto 0) :=(others=>'0'); 
    signal frame_size_reg : unsigned(15 downto 0) :=(to_unsigned(130,16)); 
    signal last_reg : std_logic:='0';
    -- CRC16
    constant polynome           : std_logic_vector(15 downto 0) := x"1DB7"; -- x"4C11DB7" 
    signal LFSR_INITIAL_VALUE   : std_logic_vector(15 downto 0) := x"ffff";
    signal data_crc16, packet_crc           : std_logic_vector(15 downto 0) := (others=>'0');
    signal crc_reg, lfsr_reg              : std_logic_vector(15 downto 0) := (others=>'0');
	
    signal err_cnt : unsigned(31 downto 0):= (others=>'0');
    signal rcv_cnt : unsigned(31 downto 0):= (others=>'0');
    

    -- attribute mark_debug : string;

    -- attribute mark_debug of
        -- err_cnt, rcv_cnt

        -- : signal is "true";
begin

	process(clk_i)
        variable feedback       : std_logic_vector(15 downto 0) := (others=>'0');
        variable lfsr           : std_logic_vector(15 downto 0) := LFSR_INITIAL_VALUE;
	begin
		if rising_edge(clk_i) then
            lfsr_reg <= lfsr;
			if rst_i = '1' then
				di_reg1 <= (others=>'0');
				frame_len_reg <= (others=>'0');
				frame_len_cnt <= (others=>'1');                
				valid <= '0';
				last<='0';

                
			else
				err_cnt_o <= std_logic_vector(err_cnt);
                rcv_cnt_o <= std_logic_vector(rcv_cnt);
				di_reg1 <= s_axis_data_i;
                di_reg2 <= di_reg1;
                last_reg <= s_axis_last_i;
                
                m_axis_last_o <= last;
                m_axis_valid_o <= valid;
                
                debug_rcv_o <= '0';
                debug_err_o <= '0';
                
				if frame_len_cnt <= unsigned(frame_size_reg-3) then -- signed(frame_len_reg) then
					valid <= '1';
					frame_len_cnt <= frame_len_cnt +1;
				else
					valid <= '0';
				end if;	
				
				if frame_len_cnt = unsigned(frame_size_reg-3) then -- signed(frame_len_reg) then
					last <= '1';
				else
					last <= '0';
				end if;	
				
				if last_reg = '1' and packet_crc = crc_reg then
                    -- if to_integer(signed(di_reg1 & s_axis_data_i)) <= 1024 and di_reg2 = x"5D" then
                        -- frame_uart_len_reg <= std_logic_vector(signed(di_reg1 & s_axis_data_i) - 1);
                        -- frame_uart_len_cnt <= (others=>'0');
                    -- elsif to_integer(signed(di_reg1 & s_axis_data_i)) <= 1024 and di_reg2 = x"ff" then
                        -- frame_mb_len_reg <= std_logic_vector(signed(di_reg1 & s_axis_data_i) - 1);
                        -- frame_mb_len_cnt <= (others=>'0');
                    -- else
                        -- frame_len_reg <= std_logic_vector(signed(di_reg1 & s_axis_data_i) - 1);
                        frame_len_cnt <= (others=>'0');
                    -- end if;
                    rcv_cnt <= rcv_cnt + 1;
                    debug_rcv_o <= '1';
                elsif last_reg = '1' and packet_crc /= crc_reg then
                    err_cnt <= err_cnt + 1;
                    rcv_cnt <= rcv_cnt + 1;
                    
                    debug_rcv_o <= '1';
                    debug_err_o <= '1';
				end if;
                
				-- if frame_mb_len_cnt <= signed(frame_mb_len_reg) then
					-- m_axis_mb_valid_o <= '1';
					-- frame_mb_len_cnt <= frame_mb_len_cnt +1;
				-- else
					-- m_axis_mb_valid_o <= '0';
				-- end if;	
				
				-- if frame_mb_len_cnt = signed(frame_mb_len_reg) then
					-- m_axis_mb_last_o <= '1';
				-- else
					-- m_axis_mb_last_o <= '0';
				-- end if;	
                
                
                -- if frame_uart_len_cnt <= signed(frame_uart_len_reg) then
					-- m_axis_uart_valid_o <= '1';
					-- frame_uart_len_cnt <= frame_uart_len_cnt +1;
				-- else
					-- m_axis_uart_valid_o <= '0';
				-- end if;	
				
				-- if frame_uart_len_cnt = signed(frame_uart_len_reg) then
					-- m_axis_uart_last_o <= '1';
				-- else
					-- m_axis_uart_last_o <= '0';
				-- end if;	
                
                
                if s_axis_last_i = '1' then
                    packet_len_cnt <= (others => '0');
                    crc_reg <= lfsr;
                    lfsr := LFSR_INITIAL_VALUE;
                elsif s_axis_valid_i = '1' then
                    packet_len_cnt <= packet_len_cnt + 1;
                    if packet_len_cnt < frame_size_reg-2 then
                        if packet_len_cnt(0) = '1' then
                            for i in 15 downto 0 loop
                                feedback        := (others=>(lfsr(15) xor data_crc16(i)));
                                for k in 15 downto 0 loop
                                    feedback(k) := feedback(k) and polynome(k);
                                end loop;
                                
                                lfsr            := (lfsr(14 downto 0)  & '0') xor feedback;
                            end loop;
                            -- data_crc16_tmp <= data_crc16;
                            -- data_crc16(15 downto 8) <= axis_data_i;
                        else
                            data_crc16(7 downto 0) <= s_axis_data_i;                            
                        end if;
                    end if;

                
                end if;
                
                    
                if packet_len_cnt = frame_size_reg-1 then
                    packet_crc(7 downto 0) <= s_axis_data_i;
                end if;
                if packet_len_cnt = frame_size_reg-2 then
                    packet_crc(15 downto 8) <= s_axis_data_i;
                end if;
                        
                
                
                
                

                
			end if;
		end if;
	end process;
	data_crc16(15 downto 8) <= s_axis_data_i;
	--Задержка данных
	xdelay_line : entity work.delay_line
	generic map(
		DATA_BUS_WIDTH => 8,
		MAX_DELAY => 4095,
--		RAM_PERFORMANCE => "LOW_LATENCY"
		RAM_PERFORMANCE => "HIGH_PERFORMANCE"
	)
	port map(
		clk_i => clk_i,
		ce_i => '1',
		rst_i => rst_i,
		delay_i => std_logic_vector(to_unsigned(128+4, 12)), -- x"600",
		di_i => s_axis_data_i,
		do_o => data -- m_axis_data_o
	); 
	

    m_axis_data_o <= data;
    s_axis_ready_o <= '1';
    
	-- m_axis_mb_data_o <= data;
    -- m_axis_uart_data_o <= data;
	
end rx_framer;
Найти ошибки в Verilog-коде и устранить их при необходимости:
Код
`timescale 1ns / 1ps
module rx_framer_k (
  input wire  clk_i,
    input wire  rst_i,
    input wire  s_axis_valid_i,
    input wire  s_axis_last_i,
    input wire [7:0] s_axis_data_i,
    output s_axis_ready_o,
    output reg m_axis_valid_o,
    output reg m_axis_last_o,
    output [7:0] m_axis_data_o,
    output reg debug_err_o,
    output reg debug_rcv_o,
    output reg [31:0] err_cnt_o,
    output reg [31:0] rcv_cnt_o
);
reg signed [15:0] frame_len_reg ='b0;
reg signed [15:0] frame_mb_len_reg ='b0;
reg signed [15:0] frame_uart_len_reg ='b0;
reg signed [7:0] di_reg1 ='b0;
reg signed [7:0] di_reg2 ='b0;
wire signed [7:0] data ='b0;
reg [15:0] frame_len_cnt = 'b1;
reg [15:0] frame_mb_len_cnt ='b1;
reg [15:0] frame_uart_len_cnt = 'b1;
reg last, valid, last_reg;
reg [15:0] packet_len_cnt = 'b0;
reg [15:0] frame_size_reg = 'd130;

localparam [15:0] polynome =16'h1DB7;
localparam [15:0] LFSR_INITIAL_VALUE =16'hFFFF;

reg signed [15:0] data_crc16 ='b0;
reg signed [15:0] packet_crc ='b0;
reg signed [15:0] crc_reg ='b0;
reg signed [15:0] lfsr_reg ='b0;

reg [31:0] err_cnt ='b0;
reg [31:0] rcv_cnt ='b0;
reg signed [15:0] feedback='b0;
reg signed [15:0] lfsr = LFSR_INITIAL_VALUE;
integer i,k;
always @(posedge clk_i==1'b1) begin
lfsr_reg <= lfsr;
    if (rst_i==1'b1) begin
       
        di_reg1 <='b0;
        frame_len_reg <='b0;
        frame_len_cnt <='b1;
        valid <=1'b0;
        last <=1'b0;
    end else begin
        err_cnt_o <= err_cnt;
        rcv_cnt_o <= rcv_cnt;
        di_reg1 <= s_axis_data_i;
        di_reg2 <= di_reg1;
        last_reg <= s_axis_last_i;
        
        m_axis_last_o <= last;
        m_axis_valid_o <= valid;
        
        debug_rcv_o <= 1'b0;
        debug_err_o <= 1'b0;

        if (frame_len_cnt <= frame_size_reg - 3) begin
            valid <= 1'b1;
            frame_len_cnt <= frame_len_cnt + 1;
        end else begin
            valid <= 1'b0;
        end

        if (frame_len_cnt == frame_size_reg - 3) begin
            last <= 1'b1;
        end else begin
            last <= 1'b0;
        end

        if (last_reg && packet_crc == crc_reg) begin
            frame_len_cnt <= 1'b0;
            rcv_cnt <= rcv_cnt + 1;
            debug_rcv_o <= 1'b1;
        end else if (last_reg && packet_crc != crc_reg) begin
            err_cnt <= err_cnt + 1;
            rcv_cnt <= rcv_cnt + 1;
            debug_rcv_o <=1'b1;
            debug_err_o <= 1'b1;
        end

        if (s_axis_last_i==1'b1) begin
            packet_len_cnt <= 'b0;
            crc_reg <= lfsr;
            lfsr <= LFSR_INITIAL_VALUE;
        end else if (s_axis_valid_i==1'b1) begin
            packet_len_cnt <= packet_len_cnt + 1;
            if (packet_len_cnt < frame_size_reg - 2) begin
                if (packet_len_cnt[0]==1'b1) begin
                            for (i = 15; i >= 0; i = i - 1) begin
                        feedback = {16{lfsr[15] ^ data_crc16[i]}};
                        for (k = 15; k >= 0; k = k - 1) begin
                            feedback[k] = feedback[k] & polynome[k];
                        end
                        lfsr = {lfsr[14:0], 1'b0} ^ feedback;
                    end
                        end else begin
                    data_crc16[7:0] <= s_axis_data_i;
                end
            end
        end

        if (packet_len_cnt == frame_size_reg - 1) begin
            packet_crc[7:0] <= s_axis_data_i;
        end

        if (packet_len_cnt == frame_size_reg - 2) begin
            packet_crc[15:8] <= s_axis_data_i;
        end
    end
end

// Instantiate delay_line module
delay_line #(
    .DATA_BUS_WIDTH(8),
    .MAX_DELAY(4095),
    .RAM_PERFORMANCE("HIGH_PERFORMANCE")
) xdelay_line (
    .clk_i(clk_i),
    .ce_i(1'b1),
    .rst_i(rst_i),
    .delay_i(12'd132), // 128 + 4
    .di_i(s_axis_data_i),
    .do_o(data)
);

assign m_axis_data_o = data;
assign s_axis_ready_o = 1'b1;

endmodule
Проверить правильность подключения схемы в pdf файле и подчеркнуть неправильные подключения
Вложения
Тип файла: pdf GFSK_RX_SS.pdf (199.9 Кб, 5 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2024, 10:50
Ответы с готовыми решениями:

Перевод кода VHDL на Verilog
LIBRARY ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use...

VHDL-Verilog
Есть задание,реализовать защелку с входом разрешения. Есть вот такая таблица истинности: ...

Вычисление контрольной суммы VHDL/Verilog
Здравствуйте. В пособии, которое я сюда скинул, описывается в том числе схема параллельного...

VHDL и Verilog в одном проекте ISE Xilinx
Подключила файл verilog производителя микросхемы PSram (Micron) в проект на VHDL в программе ISE...

1
0 / 0 / 0
Регистрация: 29.02.2020
Сообщений: 2
02.12.2024, 11:12  [ТС] 2
http://disk.yandex.ru/d/88LTb4P5z34X7A
Вот что на данный момент получилось.
m_axis_data_o в симуляции verilog кода опережает m_axis_data_o vhdl кода на 2 us.Значение сигнала lfsr2[12:12] у vhdl и verilog после 1215 нс не совпадают. Входным источником фреймера является декодер, входной источник декодера - скремблер, входной источник скремблера - пакет фифо, входной источник пакета фифо - ворд паскер. Vivado на цикл for не ругается, потому что объявил integer переменные.Задача состоит в том, чтобы симуляция Verilog (некорректного) кода совпадала с симуляцией VHDL (корректного) кода. Или неправильно подключаю источники к фреймеру? Ссылка на проект в яндекс.диске (файл rar). Версия программы Vivado2018.2. Файл mem 50k lowfreq work30 tx from_start_rst_ att_63.bin закинуть в корень диска C . Путь к данному файлу указан в testbench.
fd = $fopen("C:/mem_3M_lowfreq_work30_tx_from_start_rst_att63.bin", "rb");
UKV_SDR_TEST_SIM.xpr (из папки vivado_save) открыть в Vivado2018.2.
0
02.12.2024, 11:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2024, 11:12
Помогаю со студенческими работами здесь

Выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a legal VHDL identifier
выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a...

Icarus Verilog. GNU GPL компилятор под Verilog
...представляет собой свободную и компактную реализацию компилятора для IEEE-1364 Verilog языка...

Программа на Verilog
Нужна помощь с написанием программы Необходимо разработать устройство способное вычислять...

Блок always. Verilog
module lalala ( input logic clk, input logic risit, output logic out ); always @(posedge clk...

Разбираюсь с Verilog
Подскажите пожалуйста, начал разбираться, но не понимаю почему: Допустим программа: 00000000...

Verilog и светодиод
Всем привет. Начал изучат Verilog и сразу такой вопрос. Делаю тестовое задание мигания светодиодом...

Функции в Verilog
Приветствую. С удивлением обнаружил, что в Verilog функция должна быть описана в теле модуля. Но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru