我有一个整数信号(范围0到9999)。我试图在一组7段显示器上显示它。我已经实现了多路复用器(一次显示一位数)。现在我需要将整数分成单个数字。
理论上它非常简单:只需使用mod(ex NUM / 100 mod 10给出第二位数字)。问题是,当我使用mod(使用4次)编译解决方案时,我的代码使用超过9000个单元格仅用于mod。这太多了(但有效)。
然后我尝试转换为较小的整数,但它不起作用。整数范围0到9使用4位,所以它实际上是0到15的范围。
我确信在明显的解决方案上有更简单但我无法找到它。请注意我是初学者:)。
编辑:代码:
此部分设置适当的输出以显示给定数字
process (clk)
begin
if rising_edge(clk) then
case number1 is
-- od prawej: a b c d e f g
when 0 => segment <="1000000"; -- '0'
when 1 => segment <="1111001"; -- '1'
when 2 => segment <="0100100"; -- '2'
when 3 => segment <="0110000"; -- '3'
when 4 => segment <="0011001"; -- '4'
when 5 => segment <="0010010"; -- '5'
when 6 => segment <="0000010"; -- '6'
when 7 => segment <="1111000"; -- '7'
when 8 => segment <="0000000"; -- '8'
when 9 => segment <="0010000"; -- '9'
when others=> segment <="1111111";
end case;
end if;
end process;
此部分选择显示(4个中的1个)并设置数字值
process (clk)
begin
if rising_edge(clk) then
case number1 is
-- od prawej: a b c d e f g
when 0 => segment <="1000000"; -- '0'
when 1 => segment <="1111001"; -- '1'
when 2 => segment <="0100100"; -- '2'
when 3 => segment <="0110000"; -- '3'
when 4 => segment <="0011001"; -- '4'
when 5 => segment <="0010010"; -- '5'
when 6 => segment <="0000010"; -- '6'
when 7 => segment <="1111000"; -- '7'
when 8 => segment <="0000000"; -- '8'
when 9 => segment <="0010000"; -- '9'
when others=> segment <="1111111";
end case;
end if;
end process;
答案 0 :(得分:0)
通常,当一个数字需要以十进制形式表示时,该数字的选择编码是二进制编码十进制(BCD),其中基数为10的数字的每个数字都使用4位二进制编码。 / p>
当然这意味着您将无法将整个数字视为一个二进制整数,因为每个4位数字的有效范围仅为0-9(A-F是非法的)。因此,十进制值12将被编码为“0001 0010”。
不是简单地添加两个VHDL无符号值(或std_logic_vectors),而是对数字进行的任何操作(通常是加法和减法)都必须使用为BCD定制的逻辑。有大量的在线资源可用示例(例如,搜索BCD加法器),所以我不会在这里详细介绍。