Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.

Divided integer number

Altera_Forum
Honored Contributor II
1,988 Views

Can I divide the integer number (for example, 120) to each of the numbers 1 2 0 in different variables?

0 Kudos
14 Replies
Altera_Forum
Honored Contributor II
1,269 Views

What exactly is the context? What are you trying to do? 

You could extract 1 2 0 out in VHDL - but why?
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

From the AD converter to read 8-bit vector and the need to get him on the numbers in an integer. I need to send individual characters to UART

0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

 

--- Quote Start ---  

From the AD converter to read 8-bit vector and the need to get him on the numbers in an integer. I need to send individual characters to UART 

--- Quote End ---  

 

 

Problem solved. This is example. 

 

library ieee; 

use ieee.std_logic_1164.all; 

use ieee.numeric_std.all; 

 

 

entity test is 

port( INput:in integer range 0 to 999:=123); 

 

end test; 

 

 

architecture main of test is 

signal hundred:integer range 0 to 9;  

signal ten :integer range 0 to 9 ;  

signal unit : integer range 0 to 9;  

 

 

begin  

hundred<=INput/100; --1 

ten<=((INput rem 100)/(10)); --2 

unit<=(INput rem 10) ; --3 

end main;
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

Hello please.  

 

I need to show 12 -bit value (integer) of the AD converter to the 4 - digit display.  

 

This is my functional code, but takes 756 total logic elements (many).  

I need a way to effectively divide the number and use the minimum number of logic elements. 

 

library ieee; 

use ieee.std_logic_1164.all; 

use ieee.numeric_std.all; 

 

 

entity Number_converter is 

port( INPUT12bit: in unsigned (11 downto 0); 

digit1: out unsigned (11 downto 0); 

digit2: out unsigned (11 downto 0); 

digit3: out unsigned (11 downto 0); 

digit4: out unsigned (11 downto 0)); 

end entity; 

 

 

architecture main of Number_converter is 

signal INPUT12bit_INT:integer range 0 to 4096; 

attribute ramstyle: string; 

attribute ramstyle of digit4 : signal is "M9K"; 

begin 

 

 

digit1<=(INPUT12bit rem 10)/1; 

digit2<=(INPUT12bit rem 100)/10; 

digit3<=(INPUT12bit rem 1000)/100; 

digit4<=(INPUT12bit/1000); 

 

 

end main;
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

I can't read VHDL, sorry. But if you want to trade logic elements for hard memory blocks you could use a look-up table. It would need to be 2^12 deep (4096) and wide enough to drive your 4-digit display. I would think this would take 4 bits per digit, but you've got your output digits defined as 12 bits each. Assuming you only need 16 bits out (4 bits per digit) the look-up table would consume 8 M9Ks I believe. They're there so you may as well use them.

0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

Why don't you simply use the standard function to_string() ?  

This way, each number can be addressed by indexes representing each descending decimal order.
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

 

--- Quote Start ---  

Why don't you simply use the standard function to_string() ?  

This way, each number can be addressed by indexes representing each descending decimal order. 

--- Quote End ---  

 

 

Because to_string is not synthesisable. 

 

To the op.. Why not just have it in hex? That way you just need a small lut for each hex digit.
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

If you don't need it fast, you can use a double dabble algorithm, which cqn help you convert binary to the base of your choice, even bcd.

0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

 

--- Quote Start ---  

If you don't need it fast, you can use a double dabble algorithm, which cqn help you convert binary to the base of your choice, even bcd. 

--- Quote End ---  

 

 

Please, How to?
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

use your favorite web search engine an enter double dabble as keywords, you'll find plenty of resources there.

0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

 

--- Quote Start ---  

use your favorite web search engine an enter double dabble as keywords, you'll find plenty of resources there. 

--- Quote End ---  

 

 

Problem solved. This is my code. 133 logic elements 

 

library ieee; 

use ieee.std_logic_1164.all; 

use ieee.numeric_std.all; 

 

 

entity converter is 

port( INPUT12bit: in unsigned (11 downto 0):="000000101010"; 

digit1_out: buffer integer range 0 to 10; 

digit2_out: buffer integer range 0 to 10; 

digit3_out: buffer integer range 0 to 10; 

digit4_out: buffer integer range 0 to 10; 

clk :in std_logic); 

end entity; 

 

 

architecture main of converter is 

 

begin 

 

 

 

 

process(clk) 

variable digit1: integer range 0 to 10; 

variable digit2: integer range 0 to 10; 

variable digit3: integer range 0 to 10; 

variable digit4: integer range 0 to 10; 

VARIABLE decount_INPUT12bit :unsigned (11 downto 0); 

variable default_INPUT12bit :unsigned (11 downto 0); 

variable LAST_INPUT12bit :unsigned (11 downto 0); 

variable LAST1_INPUT12bit :unsigned (11 downto 0); 

variable ENABLE: std_logic:='0'; 

 

 

begin 

 

 

 

 

 

 

if rising_edge(clk) then 

 

 

 

if ENABLE='1' then 

decount_INPUT12bit := decount_INPUT12bit - 1; 

digit1:=digit1 + 1; 

if digit1=10 then 

digit1:=0; 

digit2:=digit2 + 1; 

if digit2=10 then 

digit2:=0; 

digit3:=digit3 + 1; 

if digit3=10 then 

digit3:=0; 

digit4:=digit4 + 1; 

end if; 

end if; 

end if; 

end if; 

 

if LAST_INPUT12bit/=INPUT12bit then 

ENABLE:='1'; 

if INPUT12bit/=LAST1_INPUT12bit then 

decount_INPUT12bit:=INPUT12bit; 

default_INPUT12bit:=INPUT12bit; 

LAST1_INPUT12bit:=INPUT12bit; 

 

digit1:=0; 

digit2:=0; 

digit3:=0; 

digit4:=0; 

end if; 

end if; 

 

 

 

 

if decount_INPUT12bit = "000000000000" then 

LAST_INPUT12bit:=default_INPUT12bit; 

ENABLE:='0'; 

digit1_out<=digit1; 

digit2_out<=digit2; 

digit3_out<=digit3; 

digit4_out<=digit4; 

end if; 

end if; 

 

 

end process; 

end main;
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

This might have a small logic footprint, but I can see the performance being rather poor, due to the large cascaded logic chains because of no pipelining.

0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

 

--- Quote Start ---  

This might have a small logic footprint, but I can see the performance being rather poor, due to the large cascaded logic chains because of no pipelining. 

--- Quote End ---  

 

 

Yes I need little logic elements. Slow transfer no harm. This module will be multiplexed for 8 digits - 4digit and 4 digit
0 Kudos
Altera_Forum
Honored Contributor II
1,269 Views

Could you use code tags when posting code in the future? 

This makes it way esier to read.
0 Kudos
Reply