-
aske12345
-
Автор темы
-
Не в сети
-
Новый участник
-
-
Сообщений: 1
-
Спасибо получено: 0
-
-
|
Доброго времени суток!
Недавно начал осваивать verilog прошу сильно не бить. Требуется реализовать аналог функции itoa чтобы преобразовывать 5-значное десятичное в 5 asqii символов.
Сначала попробовал сделать на verilog получилось нечто вроде: module itoa (
in_clk,
in_clk_data,
in_data,
out_A0,
out_A1,
out_A2,
out_ready,
// out_A3,
// out_A4,
);
input in_clk;
input in_clk_data;
input [15:0] in_data;
output [7:0] out_A0;
output [7:0] out_A1;
output [7:0] out_A2;
output out_ready;
//output [7:0] out_A3;
//output [7:0] out_A4;
reg [5:0] count = 0;
reg [15:0] data = 0;
reg [7:0] tmp0_15 = 0;
reg [15:0] tmp1_15 = 0;
reg [15:0] tmp2_15 = 0;
reg [15:0] tmp3_15 = 0;
reg [7:0] tmp1_8 = 0;
reg [7:0] tmp2_8 = 0;
reg [7:0] tmp3_8 = 0;
reg [7:0] tmp4_8 = 0;
reg [7:0] tmp0_8 = 0;
assign out_A0 = tmp0_8;
assign out_A1 = tmp1_8;
assign out_A2 = tmp2_8;
assign out_ready = in_clk;
//assign out_A3 = tmp3_8;
//assign out_A4 = tmp4_8;
always@(posedge in_clk_data)
begin
data <= in_data;
end
always@(posedge in_clk)
begin
count = count + 1;
if (count <10)
begin
tmp1_15 = data / 10;
tmp2_15 = data / 100;
end
else if (10 < count < 15)
begin
tmp0_8 = data % 10;
if (tmp0_8 > 0)
begin
tmp0_8 = tmp0_8 + 8'h30;
end
else
begin
tmp0_8 = 8'h30;
end
end
else if (15 < count < 20)
begin
tmp1_8 = tmp1_15 % 10;
if (tmp1_8 > 0)
begin
tmp1_8 = tmp1_8 + 8'h30;
end
else
begin
tmp1_8 = 8'h30;
end
end
else if (20 < count < 25)
begin
tmp2_8 = tmp2_15 % 10;
if (tmp2_8 > 0)
begin
tmp2_8 = tmp2_8 + 8'h30;
end
else
begin
tmp2_8 = 8'h30;
end
end
end
endmodule В результате компилируется, но при попытке симуляции нормальный только первый символ, вместо остальных символов - какой то бред
После этого от безысходности пошёл другим путём решил попытать счастья описав данный модуль на system veriloge - получилось нечто вроде: module itoa_sv (
in_clk,
in_vverh,
in_vniz,
out_data_asqII,
);
input in_clk;
input in_vverh;
input in_vniz;
output [7:0] out_data_asqII;
reg [31:0] data2 = 10000;
function string [4:0] strin(logic [31:0] data);
return strin = strin.itoa(data);
endfunction
always@(posedge in_vverh or posedge in_vniz)
begin
if (in_vverh & data < 25000)
begin
data2 = data2 + 50;
end
else if (in_vniz & data > 10000)
begin
data2 = data2 - 50;
end
end
always@(posedge in_clk)
begin
out_data_asqII = strin(data2);
end
endmodule Результат - не компилируется просто никак, выдаёт что то вроде:
Error (10170): Verilog HDL syntax error at itoa_sv.sv(43) near text "["; expecting an identifier
Прошу подсказать, что я делаю не так? Заранее спасибо, проекты в Quartus ii 9/1 sp2
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Гуглить по "binary to BCD".
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Stress
-
-
Не в сети
-
Новый участник
-
-
Сообщений: 6
-
Спасибо получено: 3
-
-
-
|
Для начала.
Инициализация как у Вас не определена в языке. Скорее всего такая конструкция не будет синтезирована reg [5:0] count = 0;
reg .... =0; Как вариант сделайте в модуле где работаете с соответствующими переменными сброс в "0" по "rst"
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.105 секунд