std_logic
长度为1的逻辑类型;
有以下九种状态:‘U’(未初始化),‘X’(不确定),‘0’(0),‘1’(1),‘Z’(高阻),‘W’(弱信号不确定),‘L’(弱信号0),‘H’(弱信号1),‘-’(不可能的情况)
clk : in std_logic
std_logic_vector
用于表示数字或逻辑向量。
一个包含多个元素的向量,每个元素可以是VHDL中的标准逻辑值(std_logic),例如’0’,‘1’,‘Z’或’X’
定义的是长度大于1的变量,需要确定赋值方向,比如从第0位开始(n downto 0)或者从第0位结束(0 downto n)
能够灵活地表示多位数字或逻辑值
num : out std_logic_vector(31 downto 0)
signal
在VHDL编程语言中,signal是一种特殊的数据类型,用于在不同的并发进程之间进行通信和交互。signal主要用于定义、赋值、连接、触发和延迟等操作,以实现数据传递和控制信号的交互。
signal的声明语法如下:
signal signal_name : type;
其中,signal_name是你想要声明的信号的名字,type是信号的数据类型。例如,你可以声明一个名为clk的标准逻辑信号,如下所示:
signal clk : std_logic;
signal的赋值语法如下:
signal_name <= expression;
其中,expression是要赋给signal_name的值。例如,你可以将clk信号赋值为’1’,如下所示:
clk <= '1';
signal的连接语法如下:
signal_name <= another_signal_name;
其中,another_signal_name是另一个信号的名字。例如,你可以将clk信号连接到另一个名为clk2的信号,如下所示:
clk <= clk2;
此外,signal还可以用作进程的敏感列表,指定进程在信号发生变化时被触发执行。例如,下面的进程将在clk信号发生上升沿时被触发:
process (clk)
begin
-- code here
end process;
总的来说,signal在VHDL编程中扮演着重要的角色,它是实现复杂电路行为的关键工具之一
process
在VHDL编程语言中,process是一种重要的结构,用于描述数字电路的行为或结构。在VHDL中,process可以被视为一段可以并行执行的代码块,其中可以包含任意数量的语句和过程调用。
process通常用于描述状态机、控制器、时序电路和组合逻辑等数字电路。其基本语法如下:
process (sensitivity_list) begin
-- process语句块中的代码
end process;
其中,sensitivity_list是process的敏感列表,它用于指定process所依赖的信号或变量。当敏感列表中的信号或变量发生改变时,process会自动执行。process语句块中的代码可以是任意合法的VHDL语句,包括信号赋值、条件语句、循环语句、过程调用等。
值得注意的是,在VHDL中,process并不是一个并发语句,它并不会自动创建一个新的进程。相反,process中的代码会被综合为一个组合逻辑电路或者状态机,这个电路或状态机会与其他的电路模块一起被综合为一个完整的数字电路。
此外,VHDL还提供了一种特殊的process结构,称为"process with sensitivity list"。它的语法与普通的process类似,只是省略了begin和end process之间的关键字。例如:
process (clk) begin
if rising_edge(clk) then
-- process语句块中的代码
end if;
end process;
这种process结构被称为"process with sensitivity list",通常用于描述时序电路,其中clk是时钟信号。当时钟上升沿到来时,process中的代码会被执行。
then
在VHDL编程语言中,THEN是一个关键字,常用于IF和ELSIF语句中,用于指定当条件满足时的代码块。
IF和ELSIF语句的基本语法如下:
IF condition THEN
-- code block to execute when the condition is true
ELSIF condition THEN
-- code block to execute when the second condition is true
END IF;
在这个例子中,condition是一个布尔表达式,当它为真(也就是非零)时,THEN后面的代码块就会被执行。如果有多个ELSIF语句,每个ELSIF都会检查一个不同的条件,并且只有当这个条件为真时,它后面的代码块才会被执行。最后,END IF;结束了整个IF语句。
例如,假设我们有一个名为clk的标准逻辑信号和一个名为rst的标准逻辑信号,我们想根据这两个信号的状态来设置一个名为q的标准逻辑信号。我们可以使用IF和ELSIF语句来实现这一点,如下所示:
IF rst = '1' THEN
q <= '0';
ELSIF clk'EVENT AND clk = '1' THEN
q <= d;
END IF;
在这个例子中,如果rst为’1’,那么q就被设置为’0’。如果clk发生了事件并且它的值为’1’,那么q就被设置为d的值。如果rst和clk都不满足条件,那么q就不会被改变。
总的来说,THEN在VHDL编程中用于指定当特定条件满足时应执行的代码块。
rising_edge
在VHDL编程语言中,rising_edge是一个函数,用于检测信号是否处于上升沿状态。这个函数的基本语法如下:
function rising_edge (signal s : std_ulogic) return boolean is
begin
return (s'EVENT AND (To_X01(s) = '1') AND (To_X01(s'LAST_VALUE) = '0'));
end function rising_edge;
在这个函数中,s’EVENT表示信号s是否发生了事件,即信号值是否发生了变化。To_X01(s)将信号s转换为二进制形式,To_X01(s’LAST_VALUE)将信号s的上一次值转换为二进制形式。如果信号s的当前值为’1’且上一次值为’0’,则rising_edge函数返回true,否则返回false。
例如,假设我们有一个名为clk的标准逻辑信号,我们想检测这个信号是否处于上升沿状态,可以使用rising_edge函数,如下所示:
if rising_edge(clk) then
-- code block to execute on the rising edge of clk
end if;
在这个例子中,如果clk处于上升沿状态,那么rising_edge(clk)就会返回true,然后code block to execute on the rising edge of clk就会被执行。
在VHDL中比较运算符是“=”,而不是"=="。
others
在VHDL编程语言中,OTHERS是一个关键字,通常用于WHEN语句中,表示除已明确列出的情况外的所有其他情况。
WHEN语句的基本语法如下:
WHEN choice1 =>
-- code block to execute when choice1 is selected
WHEN choice2 =>
-- code block to execute when choice2 is selected
WHEN OTHERS =>
-- code block to execute when none of the other choices are selected
END SELECT;
在这个例子中,choice1和choice2是可能的选项,而OTHERS表示除这些选项以外的所有其他选项。如果SELECT语句的左侧表达式的值不是choice1也不是choice2,那么WHEN OTHERS后面的代码块就会被执行。
例如,假设我们有一个名为sel的标准逻辑信号,我们想根据这个信号的不同值来执行不同的操作,可以使用WHEN和OTHERS语句,如下所示:
SELECT
WHEN sel = '0' =>
-- code block to execute when sel = '0'
WHEN sel = '1' =>
-- code block to execute when sel = '1'
WHEN OTHERS =>
-- code block to execute when sel is any value other than '0' or '1'
END SELECT;
在这个例子中,如果sel的值不是’0’也不是’1’,那么WHEN OTHERS后面的代码块就会被执行。
xor
在VHDL编程语言中,XOR是一种位运算符,全称为Exclusive-OR,也就是我们常说的异或运算符。它的基本语法如下:
variable result : std_ulogic := ‘0’;
result <= a xor b;
在这个例子中,a和b是需要进行异或运算的变量,result是结果变量。
异或运算符的特点是,如果两个二进制数的对应位相同,则结果为0;如果两个二进制数的对应位不同,则结果为1。例如,如果a的值为’0’,b的值为’1’,那么a xor b的结果就是’1’。
在VHDL编程中,XOR运算符常常用于逻辑运算、编码和解码、数据加密等应用中。
NOT——取反;
AND——与;
OR——或;
NAND——与非;
NOR——或非;
XOR——异或。