Case 在函数中使用VHDL generate语句
我想使用generate语句,但在我的代码中有一个case语句,它只接受顺序语句 然后我想我会在一个包中使用它,在这个包中我可以定义一个函数,这样我也会得到错误:“非法的顺序语句”。 那么我们可以做些什么呢。有什么建议吗 代码块:Case 在函数中使用VHDL generate语句,case,vhdl,Case,Vhdl,我想使用generate语句,但在我的代码中有一个case语句,它只接受顺序语句 然后我想我会在一个包中使用它,在这个包中我可以定义一个函数,这样我也会得到错误:“非法的顺序语句”。 那么我们可以做些什么呢。有什么建议吗 代码块: LIBRARY ieee; USE ieee.std_logic_1164.all; USE work.my_package.all; -- Entity for ALU component -- Use this Entity for your C&A p
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.my_package.all;
-- Entity for ALU component
-- Use this Entity for your C&A project
ENTITY ALU_E IS
PORT(
reset_n : in std_logic;
clk : in std_logic;
OperandA : in std_logic_vector(3 downto 0);
OperandB : in std_logic_vector(3 downto 0);
Operation : in std_logic_vector(2 downto 0);
Start : in std_logic;
Result_Low : out std_logic_vector(3 downto 0);
Result_High : out std_logic_vector(3 downto 0);
Ready : out std_logic;
Errorsig : out std_Logic);
END ALU_E;
architecture Behavioral_ALU of ALU_E is
signal c : std_logic_vector(7 downto 0);
signal carry_internal :std_logic_vector(4 downto 0);
COMPONENT fulladder IS
PORT(
a: IN std_logic;
b: IN std_logic;
cin : IN std_logic;
cout: OUT std_logic;
s: OUT std_logic );
END component fulladder;
begin
adders: for N in 0 to 3 generate
ff1:fulladder
port map
(a => OperandA(N),b => OperandB(N),cin => carry_internal(N),cout => carry_internal(N+1),s => c(N));
end generate adders;
c(4) <= carry_internal(4);
process(clk,reset_n)
begin
if reset_n = '0' then
if (clk'event) then
case Operation is
when "000" => --no operation
NULL;
when "001" => --Rotate left logical operator ?0000?&A by B steps
c <= rotlef (OperandA,OperandB);
when "010" => --Rotate right logical operator ?0000?&A by B steps (result width is 8 bit)
c <= rotrig (OperandA,OperandB);
when "011" => --Bitwise XOR operation
Result_Low <= OperandA xor OperandB;
when "100" => --Sum of A and B
--here i want to use a statement such that i can call the gatelevel --add function
--I have already all functions gatelevel defined when i try to use portmap or ----generate it gives an error illegal sequential statement
when Others =>
NULL;
end case;
end if;
end if;
end process;
end Behavioral_ALU;
ieee库;
使用ieee.std_logic_1164.all;
使用work.my_package.all;
--ALU组件的实体
--将此实体用于您的C&A项目
实体ALU_E是
港口(
复位n:在标准逻辑中;
clk:标准逻辑中;
操作数:标准逻辑向量(3到0);
操作数B:标准逻辑向量(3到0);
操作:标准逻辑向量(2到0);
启动:在标准逻辑中;
结果低:输出标准逻辑向量(3到0);
结果高:输出标准逻辑向量(3到0);
就绪:输出标准逻辑;
错误信号:输出标准逻辑);
结束ALU_E;
ALU的架构行为ALU是
信号c:标准逻辑向量(7到0);
信号进位\u内部:标准逻辑\u矢量(4到0);
组件全加器是
港口(
答:标准逻辑;
b:标准逻辑;
cin:标准逻辑;
cout:输出标准逻辑;
s:输出标准(U逻辑);
端部全加器;
开始
加法器:对于0到3中的N,生成
ff1:全加器
港口地图
(a=>操作数a(N),b=>操作数b(N),cin=>进位内部(N),cout=>进位内部(N+1),s=>c(N));
端生成加法器;
c(4)这个问题中有几个误解
首先是标题:实际代码中没有函数。你用为…做了什么。。。generate
语句是生成一个单独的硬件,与主进程并行运行。它将始终运行,并始终使用总和驱动信号“c”,就好像您已经编写了c,就您获取错误消息的原因而言,组件实例化语句或生成语句是并发语句,而案例选择或函数体由顺序语句组成
您不需要函数,您需要从实例化为fourfulladder
s的generate语句中求和并执行。
o
为fulladder虚拟实体/架构对:
library ieee;
use ieee.std_logic_1164.all;
entity fulladder is
port (
a: in std_logic;
b: in std_logic;
cin: in std_logic;
cout: out std_logic;
s: out std_logic
);
end entity;
architecture foo of fulladder is
begin
s <= a xor b xor cin;
cout <= (a and b) or (a and cin) or (b and cin);
end architecture;
(注意,函数返回值长度与左操作数长度匹配)
为生成的fulladder
s的输出添加新声明:
architecture changed of alu_e is
signal c: std_logic_vector(7 downto 0);
signal carry_internal: std_logic_vector(4 downto 0);
signal s: std_logic_vector(3 downto 0); -- added
更改generate语句以将新信号用于求和:
adders:
for n in 0 to 3 generate
ff1:
fulladder
port map (
a => operanda(n),
b => operandb(n),
cin => carry_internal(n),
cout => carry_internal(n+1),
s => s(n) -- was c(n)
);
end generate;
-- c(4) <= carry_internal(4);
签名标志扩展可能类似于:
result_high <= (others => carry_internal(4)); --sign extended
result_high carry_internal(4))--符号扩展
请注意,当您实例化乘法器时,您还需要为8位结果使用新的信号声明。修改旋转操作以分配result\u low
和result\u high
将允许将c
用于实例化乘法,尽管您可以选择重命名它
将process语句中的case语句视为多路复用器的实例,在某些情况下,您碰巧也在输入上表示逻辑。例如,xor
或符号扩展或函数调用(都是表达式)
当您实例化了提供功能的组件时,您希望将其输出连接到多路复用器输入。将您的问题格式化为可读的形式。我(粗略地检查一下)觉得这些代码没问题,您能更详细地解释您的问题是什么吗?您需要发布更多的代码。您的fulladder
中有一些端口连接到我们看不到任何声明的对象,例如operana
。在生成循环中实例化组件没有什么根本性的错误。谢谢,我已经对代码进行了更改,但我不想让它与我的进程并行工作,而是想构建一个函数,我可以在case语句中调用它,就像我以前做的左移或右移操作一样。看看合成详细的结果。只需使用c“0”)即可删除尚未运行的操作。或者将它们全部删除并逐个重新添加。你会发现这些操作所需的硬件(rotlef等)总是在那里,并且总是并行工作;当你不看它的时候,它就被忽略了。在这方面你别无选择,你不能让门在开关或操作码的一瞬间出现或消失。。。所以这个加法器不会有任何不同。PS:在合成过程中,也可能会有一个关于多个驱动器信号的警告。
when "100" => --sum of a and b
result_low <= s; -- added
result_high(0) <= carry_internal(4); --(un)signed?
result_high(0) <= carry_internal(4); --(un)signed?
result_high <= (others => carry_internal(4)); --sign extended