0 / 0 / 0
Регистрация: 29.02.2020
Сообщений: 2
|
|
1 | |
Перевод VHDL в Verilog11.11.2024, 10:50. Показов 500. Ответов 1
Метки нет (Все метки)
Код
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; Код
`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
0
|
11.11.2024, 10:50 | |
Ответы с готовыми решениями:
1
Перевод кода VHDL на Verilog VHDL-Verilog Вычисление контрольной суммы VHDL/Verilog VHDL и Verilog в одном проекте ISE Xilinx |
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 | |
02.12.2024, 11:12 | |
Помогаю со студенческими работами здесь
2
Выдает ошибку Error: VLM_0040: VHDL unit cannot be compiled as the target library name is not a legal VHDL identifier Icarus Verilog. GNU GPL компилятор под Verilog Программа на Verilog Блок always. Verilog Разбираюсь с Verilog Verilog и светодиод Функции в Verilog Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |