我必须使用VHDL在Basys3板上投射专用计算器。计算器应该能够使用括号对数字进行分组,执行添加和减法,AND和OR运算。例如,表达式可以是:4 + 5 AND 6 +(7 OR 1) - (4 AND 10)
输入数字是4位数字(在我的代码中我使用5位数字,最重要的位是符号位),输出可以是最大值。 16位长(我在代码中使用了17位,最重要的是符号位)。
我写了ALU的代码(加法器/减法器,AND / OR),我设法使计算器工作2个数字作为输入(在端口中使用2)。这是"主要"我写的计算器代码:
library IEEE;
use ieee.STD_LOGIC_1164.all;
use ieee.STD_LOGIC_UNSIGNED.all;
entity calculator is
port(X: in STD_LOGIC_VECTOR(4 downto 0); -- X(4) sign
Y: in STD_LOGIC_VECTOR(4 downto 0);
OPERATIE: in STD_LOGIC_VECTOR(4 downto 0);
CLK, CLR: in STD_LOGIC;
a_to_g: out STD_LOGIC_VECTOR(6 downto 0);
an: out STD_LOGIC_VECTOR(3 downto 0);
negativ: out std_logic);
end calculator;
architecture calculator of calculator is
component ALU is
port(A,B: in STD_LOGIC_VECTOR(16 downto 0);
COMANDA: in STD_LOGIC_VECTOR(4 downto 0);
RESULT: out STD_LOGIC_VECTOR(16 downto 0));
end component;
component BCD_7seg is
port(X: in STD_LOGIC_VECTOR(15 downto 0);
CLK, CLR: in STD_LOGIC;
a_to_g: out STD_LOGIC_VECTOR(6 downto 0);
an: out STD_LOGIC_VECTOR(3 downto 0));
end component;
signal OPERAND_1: STD_LOGIC_VECTOR(16 downto 0) := (others => '0');
signal OPERAND_2: STD_LOGIC_VECTOR(16 downto 0) := (others => '0');
signal TEMP_RESULT: STD_LOGIC_VECTOR(16 downto 0) := (others => '0');
begin
operand_1(3 downto 0) <= x(3 downto 0);
operand_1(16) <= x(4);
operand_2(3 downto 0) <= y(3 downto 0);
operand_2(16) <= y(4);
calculate: ALU port map(operand_1, operand_2, operatie, temp_result);
afis: BCD_7seg port map(temp_result(15 downto 0), clk, clr, a_to_g, an);
negativ <= temp_result(16);
end calculator;
但是,计算器应该适用于N个数字作为输入(仅使用端口中的一个)并且我不知道如何操作。我想在FIFO或LIFO内存中记忆整个表达式(操作者和操作数)(但我不确定这是否可行)然后进行计算但我不知道如何计算所有内容优先级给出的正确顺序以及记忆临时结果的位置(以及如何)。
我想也许你可以给我一些想法,我是VHDL的新手,我是一名学生,我刚开始学习它并且在项目的这一部分陷入困境。
谢谢!