3

我有一个整数信号(范围 0 到 9999)。我正在尝试在一组 7 段显示器上显示它。我已经实现了多路复用器(一次显示一个数字)。现在我需要将我的整数分成个位数。

理论上它很简单:只需使用 mod(例如 NUM / 100 mod 10 给出第二个数字)。问题是,当我使用 mod 编译解决方案(使用 4 次)时,我的代码仅用于 mod 的 9000 多个单元格。这太多了(但有效)。

然后我尝试转换为更小的整数,但它不起作用。整数范围 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;

这部分选择显示(1 of 4)并设置数字值

process (clk)
variable count: integer range 0 to 1000;
begin
    if rising_edge(clk) then
        if count = 1000 - 1 then
            count := 0;
            case digit is
                when "1000" => digit <="0001"; number1 <= year/1000 mod 10;
                when "0001" => digit <="0010"; number1 <= year/100 mod 10;
                when "0010" => digit <="0100"; number1 <= year/10 mod 10;
                when "0100" => digit <="1000"; number1 <= year mod 10;
                when others => digit <="0001"; 
            end case;
        else
            count := count + 1;
        end if;

    end if;
end process;
4

1 回答 1

0

通常,当一个数字需要以十进制形式表示时,该数字的编码选择是二进制编码十进制 (BCD),其中以 10 为基数的每个数字都使用 4 位二进制进行编码。

当然,这意味着您将无法将整个数字视为一个二进制整数,因为每个 4 位数字的有效范围仅为 0-9(AF 是非法的)。因此十进制值 12 将被编码为“0001 0010”。

不是简单地添加两个 VHDL 无符号值(或 std_logic_vectors),您对数字进行的任何操作(通常是加法和减法)都必须使用为 BCD 量身定制的逻辑。有大量的在线资源提供了示例(例如搜索 BCD 加法器),所以我不会在这里详细介绍。

于 2013-05-27T15:58:10.723 回答