Форум программистов, компьютерный форум, киберфорум
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.02.2020
Сообщений: 2

Перевод VHDL в Verilog

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

Студворк — интернет-сервис помощи студентам
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
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-коде и устранить их при необходимости:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
`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 Кб, 8 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2024, 10:50
Ответы с готовыми решениями:

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

[VHDL/Verilog] Реализовать защелку с входом разрешения
Есть задание,реализовать защелку с входом разрешения. Есть вот такая таблица истинности: enabled data gate Q(t) 0 0 0 X ...

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

1
0 / 0 / 0
Регистрация: 29.02.2020
Сообщений: 2
02.12.2024, 11:12  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2024, 11:12
Помогаю со студенческими работами здесь

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

Выдает ошибку 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 legal VHDL identifier. # Compile failure...

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru