52 / 0 / 0
Регистрация: 30.06.2019
Сообщений: 48
|
|
1 | |
Перевод SystemVerilog в Verilog02.12.2024, 17:05. Показов 811. Ответов 0
Здравствуйте. Не могли бы Вы мне помочь? Я нашел статью, где описано как извлекать квадратный корень из числа. Проблема в том, что 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
|
02.12.2024, 17:05 | |
Ответы с готовыми решениями:
0
Перевод VHDL в Verilog Перевод кода VHDL на Verilog Icarus Verilog. GNU GPL компилятор под Verilog Таблица истинности в SystemVerilog |
02.12.2024, 17:05 | |
02.12.2024, 17:05 | |
Помогаю со студенческими работами здесь
1
Кто знает SystemVerilog SystemVerilog. case(1'b1) vs priority casez (1'b1) Ищу литературу по SystemVerilog на русском Лабораторная: генератор и периодические сигналы. SystemVerilog Как использовать интерфейс с параметрами в systemverilog? SystemVerilog. Как сделать стартовую инициализацию регистров? Как правильно реализовать простой конечный автомат на SystemVerilog? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |