МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: itoa Verilog

itoa Verilog 3 года 7 мес. назад #3118

  • aske12345
  • 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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от aske12345.

itoa Verilog 3 года 7 мес. назад #3120

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 631
  • Спасибо получено: 51
Гуглить по "binary to BCD".

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

itoa Verilog 3 года 7 мес. назад #3186

Для начала.
Инициализация как у Вас не определена в языке. Скорее всего такая конструкция не будет синтезирована
reg [5:0] count = 0;
reg  .... =0;
Как вариант сделайте в модуле где работаете с соответствующими переменными сброс в "0" по "rst"

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.120 секунд

facebook  GitHub  YouTube  Twitter