С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программируемая логика: ПЛИС, ПАИС
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
52 / 0 / 0
Регистрация: 30.06.2019
Сообщений: 48
1

Перевод SystemVerilog в Verilog

02.12.2024, 17:05. Показов 811. Ответов 0

Author24 — интернет-сервис помощи студентам
Здравствуйте. Не могли бы Вы мне помочь? Я нашел статью, где описано как извлекать квадратный корень из числа. Проблема в том, что Quartus не дает его скомпилировать. Возможно, переход на язык Verilog помог бы мне, но где-то я ошибаюсь при переводе. Не могли бы мне помочь?


Исходный код:
Кликните здесь для просмотра всего текста
Код
module sqrt #(
    parameter WIDTH=8,  // width of radicand
    parameter FBITS=0   // fractional bits (for fixed point)
    ) (
    input wire logic clk,
    input wire logic start,             // start signal
    output     logic busy,              // calculation in progress
    output     logic valid,             // root and rem are valid
    input wire logic [WIDTH-1:0] rad,   // radicand
    output     logic [WIDTH-1:0] root,  // root
    output     logic [WIDTH-1:0] rem    // remainder
    );

    logic [WIDTH-1:0] x, x_next;    // radicand copy
    logic [WIDTH-1:0] q, q_next;    // intermediate root (quotient)
    logic [WIDTH+1:0] ac, ac_next;  // accumulator (2 bits wider)
    logic [WIDTH+1:0] test_res;     // sign test result (2 bits wider)

    localparam ITER = (WIDTH+FBITS) >> 1;  // iterations are half radicand+fbits width
    logic [$clog2(ITER)-1:0] i;            // iteration counter

    always_comb begin
        test_res = ac - {q, 2'b01};
        if (test_res[WIDTH+1] == 0) begin  // test_res ≥0? (check MSB)
            {ac_next, x_next} = {test_res[WIDTH-1:0], x, 2'b0};
            q_next = {q[WIDTH-2:0], 1'b1};
        end else begin
            {ac_next, x_next} = {ac[WIDTH-1:0], x, 2'b0};
            q_next = q << 1;
        end
    end

    always_ff @(posedge clk) begin
        if (start) begin
            busy <= 1;
            valid <= 0;
            i <= 0;
            q <= 0;
            {ac, x} <= {{WIDTH{1'b0}}, rad, 2'b0};
        end else if (busy) begin
            if (i == ITER-1) begin  // we're done
                busy <= 0;
                valid <= 1;
                root <= q_next;
                rem <= ac_next[WIDTH+1:2];  // undo final shift
            end else begin  // next iteration
                i <= i + 1;
                x <= x_next;
                ac <= ac_next;
                q <= q_next;
            end
        end
    end
endmodule



Мой вариант перевода на Verilog:
Кликните здесь для просмотра всего текста
Код
module sqrt #(
    parameter WIDTH=8,  // width of radicand
    parameter FBITS=0   // fractional bits (for fixed point)
    ) (
    input wire clk,
    input wire start,             // start signal
    output     busy,              // calculation in progress
    output     valid,             // root and rem are valid
    input wire [WIDTH-1:0] rad,   // radicand
    output     [WIDTH-1:0] root,  // root
    output     [WIDTH-1:0] rem    // remainder
    );

    reg [WIDTH-1:0] x, x_next;    // radicand copy
    reg [WIDTH-1:0] q, q_next;    // intermediate root (quotient)
    reg [WIDTH+1:0] ac, ac_next;  // accumulator (2 bits wider)
    reg [WIDTH+1:0] test_res;     // sign test result (2 bits wider)

    localparam ITER = (WIDTH+FBITS) >> 1;  // iterations are half radicand+fbits width
    reg [$clog2(ITER)-1:0] i;            // iteration counter

    always @* begin
        test_res = ac - {q, 2'b01};
        if (test_res[WIDTH+1] == 0) begin  // test_res ≥0? (check MSB)
            {ac_next, x_next} = {test_res[WIDTH-1:0], x, 2'b0};
            q_next = {q[WIDTH-2:0], 1'b1};
        end else begin
            {ac_next, x_next} = {ac[WIDTH-1:0], x, 2'b0};
            q_next = q << 1;
        end
    end

    always @(posedge clk) begin
        if (start) begin
            busy <= 1;
            valid <= 0;
            i <= 0;
            q <= 0;
            {ac, x} <= {{WIDTH{1'b0}}, rad, 2'b0};
        end else if (busy) begin
            if (i == ITER-1) begin  // we're done
                busy <= 0;
                valid <= 1;
                root <= q_next;
                rem <= ac_next[WIDTH+1:2];  // undo final shift
            end else begin  // next iteration
                i <= i + 1;
                x <= x_next;
                ac <= ac_next;
                q <= q_next;
            end
        end
    end
endmodule
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2024, 17:05
Ответы с готовыми решениями:

Перевод VHDL в Verilog
library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.numeric_std.all; entity rx_framer is ...

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

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

Таблица истинности в SystemVerilog
По заданию мне нужно сделать приоритетный шифратор 8:3 с сигналом Ready, нужно его реализовать с...

0
02.12.2024, 17:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2024, 17:05
Помогаю со студенческими работами здесь

Кто знает SystemVerilog
Здравствуйте! Кто сможет помочь c программой на SystemVerilog?

SystemVerilog. case(1'b1) vs priority casez (1'b1)
Доброго времени суток, уважаемые форумчане. Не так давно начал изучать FPGA и SystemVerilog. Изучаю...

Ищу литературу по SystemVerilog на русском
Какие существуют актуальные книги по SV на русском ? (Хаханов не в счет)

Лабораторная: генератор и периодические сигналы. SystemVerilog
Выполняю лабораторную №2 Генератор и периодические сигналы, следую инструкции, но получившаяся...

Как использовать интерфейс с параметрами в systemverilog?
Здравствуйте. У меня есть модуль с массивом интерфейсов в портах. Как передать этот массив в тест?...

SystemVerilog. Как сделать стартовую инициализацию регистров?
Приветствую всех читающих это. Что я хочу сделать: мигать светодиодом с заданным периодом. Не...

Как правильно реализовать простой конечный автомат на SystemVerilog?
Нужно спроектировать на SystemVerilog последовательностную схему, которая будет обладать...


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

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