#function #vhdl
#функция #vhdl
Вопрос:
Я новичок в VHDL и только учусь. пытаюсь создать функцию для кода bcd в 7 сегментов, чтобы я мог вызывать ее дальше. итак, я создал функцию с именем bcd_to_ssd. таким образом, он может преобразовывать целочисленные значения temp1 или temp2 в 7-битный вектор, чтобы подключиться к 7 битам сегмента (abcdefg).
я перепробовал много способов, многое изменил, но запутался.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
----------------------------------
entity SEVENSEGMENT is
port(clk,reset : IN STD_LOGIC;
digit1,digit2 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0));
end SEVENSEGMENT;
architecture Behavioral of SEVENSEGMENT is
signal tempx : integer;
-----------------------------
function bcd_to_ssd(signal s : INTEGER range 0 to 10 ) return std_logic_vector is
variable d : std_logic_vector (6 DOWNTO 0);
begin
if s= 0 then d := "1111110";
elsif s= 1 then d := "0110000";
elsif s= 2 then d := "1101101";
elsif s=3 then d := "1111001";
elsif s=4 then d := "0110011";
elsif s=5 then d := "1011011";
elsif s=6 then d := "1011111";
elsif s=7 then d := "1110000";
elsif s=8 then d := "1111111";
elsif s=9 then d := "1111011";
end if;
return d;
end bcd_to_ssd;
---------------------------
begin
Process(clk,reset)
variable temp1,temp2 : integer range 0 to 10;
begin
---------------------
if reset = '1' then
temp1 := 0;
temp2 := 0;
elsif rising_edge(clk) then
temp1 := temp1 1;
if temp1 = 10 then
temp1 :=0;
temp2 := temp2 1;
if(temp2 = 10) then
temp2 := 0;
end if;
end if;
end if;
tempx <= temp1;
-------------------
end process;
digit1 <= bcd_to_ssd(tempx);
end Behavioral;
ошибка:
Строка 51: Направление / границы для формальных сигналов должны совпадать с фактическим типом для подпрограммы bcd_to_ssd
исходный код, который я пытаюсь создать для него, приведен ниже:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity SEVENSEGMENT is
port(clk,reset : IN STD_LOGIC;
digit1,digit2 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0));
end SEVENSEGMENT;
architecture Behavioral of SEVENSEGMENT is
begin
Process(clk,reset)
variable temp1,temp2 : integer range 0 to 10;
begin
---------------------
if reset = '1' then
temp1 := 0;
temp2 := 0;
elsif rising_edge(clk) then
temp1 := temp1 1;
if temp1 = 10 then
temp1 :=0;
temp2 := temp2 1;
if(temp2 = 10) then
temp2 := 0;
end if;
end if;
end if;
-------------------
case temp1 is
when 0 => digit1 <= "1111110";
when 1 => digit1 <= "0110000";
when 2 => digit1 <= "1101101";
when 3 => digit1 <= "1111001";
when 4 => digit1 <= "0110011";
when 5 => digit1 <= "1011011";
when 6 => digit1 <= "1011111";
when 7 => digit1 <= "1110000";
when 8 => digit1 <= "1111111";
when 9 => digit1 <= "1111011";
when OTHERS => NULL;
end case;
case temp2 is
when 0 => digit2 <= "1111110";
when 1 => digit2 <= "0110000";
when 2 => digit2 <= "1101101";
when 3 => digit2 <= "1111001";
when 4 => digit2 <= "0110011";
when 5 => digit2 <= "1011011";
when 6 => digit2 <= "1011111";
when 7 => digit2 <= "1110000";
when 8 => digit2 <= "1111111";
when 9 => digit2 <= "1111011";
when OTHERS => NULL;
end case;
end process;
end Behavioral;
Комментарии:
1. Ваш
tempx
сигнал представляет собой неограниченное целое число, но вашаbcd_to_ssd
функция ожидает ограниченное целое числоrange 0 to 10
.2. Поместите эти значения в постоянный массив, индексируемый
d
, и функция станет еще короче. (Вы также узнаете о другой ошибке диапазона во время компиляции!)3. IEEE Std 1076-1993 2.1.1.2 Параметры сигнала «Если фактический сигнал связан с параметром сигнала любого режима, и если тип формального является скалярным типом, то это ошибка, если границы и направление подтипа, обозначенные указанием подтипа формального, не идентичны границами направление подтипа, обозначаемого указанием подтипа фактического. »
4. -2008 4.2.2.3 Параметры сигнала «Если фактический сигнал связан с параметром сигнала режима in или inout, и если тип формального является скалярным типом, то это ошибка, если подтип фактического не совместим с подтипом формального. Аналогично, если фактический сигнал связан с параметром сигнала режима out или inout, и если тип фактического является скалярным типом, то это ошибка, если подтип формального не совместим с подтипом фактического. »
5. -2008 5.2 Скалярные типы, 5.2.1 Общие сведения «Если в указании подтипа используется ограничение диапазона, тип выражений (аналогично, границ атрибута диапазона) должен совпадать с базовым типом метки типа указания подтипа. Ограничение диапазона совместимо с подтипом, если каждая граница диапазона принадлежит подтипу или если ограничение диапазона определяет нулевой диапазон. В противном случае ограничение диапазона несовместимо с подтипом. Подтип S1 совместим с подтипом S2, если ограничение диапазона, связанное с S1, совместимо с S2. »
Ответ №1:
Ответ таков:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
------Package Decleration-----------
package sevensegmentdisplay is
function bcd_to_ssd(signal s : INTEGER ) return std_logic_vector;
end sevensegmentdisplay;
---------Package Body----------------
package body sevensegmentdisplay is
-----------Function-----------------
function bcd_to_ssd(signal s : INTEGER ) return std_logic_vector is
variable d : std_logic_vector (6 DOWNTO 0);
begin
case s is
when 1 => d := "0110000";
when 2 => d := "1101101";
when 3 => d := "1111001";
when 4 => d := "0110011";
when 5 => d := "1011011";
when 6 => d := "1011111";
when 7 => d := "1110000";
when 8 => d := "1111111";
when 9 => d := "1111011";
when OTHERS => NULL;
end case;
return d;
----------------------------------------
end bcd_to_ssd;
end sevensegmentdisplay;
Комментарии:
1. В ответе должно быть указано, почему ответ таков.