как я могу создать функцию vhdl, которая делает мой путь намного короче

#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. В ответе должно быть указано, почему ответ таков.