我正在尝试编写UART代码,但是我收到以下错误:
错误(10028):无法在uart_rl.vhd解析网络“ledr [7]”的多个常量驱动程序(77)
简短说明:
RX + TX:
library ieee;
use ieee.std_logic_1164.all;
entity sertopar is
port (txd : buffer std_logic;
data_out: out std_logic_vector(7 downto 0);
p :out std_logic;
ending : out std_logic_vector(1 downto 0));
end;
architecture tow of sertopar is
signal data_reg2: std_logic_vector (10 downto 0);
signal cnt2: integer;
signal flag2: std_logic:= '0';
begin
process (txd,flag2)
begin
if(txd = '0') then
if(flag2 = '0') then
if(cnt2 = 0) then
flag2 <= '1';
end if;
end if;
end if;
if(flag2 = '1') then
if(cnt2 = 0) then
cnt2 <= cnt2 + 1;
elsif((cnt2 > 0) and (cnt2 < 10)) then
data_reg2(cnt2-1) <= txd;
cnt2 <= cnt2 + 1;
elsif(cnt2 = 10) then
data_reg2(cnt2-1) <= '1';
data_reg2(cnt2) <= '1';
flag2 <= '0';
end if;
end if;
if(flag2 = '0') then
if(cnt2 = 10) then
cnt2 <= 0;
data_out <= data_reg2(7 downto 0);
p<=data_reg2(8);
ending<=data_reg2(10 downto 9);
end if;
end if;
end process;
end;
------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity partoser is
port (data_in: in std_logic_vector(10 downto 0);
clk, start: in std_logic;
txd : buffer std_logic;
txd_rdy : out std_logic);
end;
architecture one of partoser is
signal data_reg: std_logic_vector (10 downto 0);
signal cnt: integer;
begin
process (clk, start, data_in)
begin
if start = '1' then
cnt <=0; txd_rdy <='0'; data_reg <=data_in;
elsif clk'event and clk = '1' then
cnt <= cnt+1;
if cnt = 11 then txd_rdy <='1';
else txd_rdy <='0';
end if;
txd <= data_reg(0);
data_reg (9 downto 0) <= data_reg(10 downto 1);
end if;
end process;
end;
-------------------------------------------------------
顶级:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity uart_rl is
port(
clock_50 : in std_logic;
sw : in std_logic_vector (17 downto 9);
key : in std_logic_vector (2 downto 0);
ledr : out std_logic_vector (17 downto 0);
ledg : out std_logic_vector (7 downto 0));
end uart_rl;
architecture txd of uart_rl is
alias clk : std_logic is CLOCK_50;
alias reset: std_logic is key(0);
--alias load: std_logic is key(1);
alias start: std_logic is key(2);
alias par_type: std_logic is sw(9);-- 0 even
--alias start: std_logic is sw(8);
alias parallel: std_logic_vector(7 downto 0) is sw(17 downto 10);
signal txd : std_logic is ledg(0);
alias txd_rdy: std_logic is ledg(1);
alias paritybit: std_logic is ledg(2);
alias Rdata : std_logic_vector (7 downto 0) is ledr(7 downto 0);
alias R_p : std_logic is ledg(7);
alias Rend : std_logic_vector (1 downto 0) is ledg(6 downto 5);
component partoser
port (data_in: in std_logic_vector(10 downto 0);
clk, start: in std_logic;
txd : buffer std_logic;
txd_rdy : out std_logic);
end component;
component sertopar
port(txd : buffer std_logic;
data_out: out std_logic_vector(7 downto 0);
p :out std_logic;
ending : out std_logic_vector(1 downto 0));
end component;
signal parity_res: std_logic;
signal Tframe: std_logic_vector (10 downto 0);
--signal Rdata: std_logic_vector (7 downto 0);
--signal R_p: std_logic;
--signal Rend: std_logic_vector (1 downto 0);
signal flag: std_logic := '0' ;
begin
process (clk,reset, start) --without load
variable temp: std_logic:='0';
begin
if (reset ='0') then --to check
Rdata<="00000000";
R_P<= '0';
Rend<= "00";
paritybit<= '0';
txd <= '1';
txd_rdy <= '1';
flag <= '0';
elsif (start='0') then
flag <= '1'; --when to off?
temp := par_type;
for i in 0 to 7 loop
temp:= parallel (i) xor temp;
end loop;
end if;
parity_res <= temp;
end process;
Tframe <='1'& parity_res & parallel & '0';
u1: partoser port map (Tframe, clk, flag, txd_rdy, txd);
u2: sertopar port map (txd, Rdata, R_p, Rend);
paritybit <= parity_res;
ledr(17 downto 9) <= sw(17 downto 9);
--dataR_red<= Rdata;
--dataR_green_P <= R_p;
--dataR_green_end(1 downto 0) <= Rend;
end;
答案 0 :(得分:0)
参见IEEE Std 1076-2008 6.4.2.3信号声明,第9段(部分):
信号可能包含一个或多个来源。对于标量类型的信号,每个源都是驱动程序(参见14.7.2)或输出,输入,缓冲区,或者链接组件实例的端口或与信号关联的块语句的端口。
驱动程序来自流程中的赋值语句请参阅14.7.2第1段:
14.7.2司机 进程语句中的每个信号赋值语句都为某些标量信号定义了一组驱动程序。如果在该进程语句中至少有一个信号赋值语句并且该信号赋值语句的目标信号的最长静态前缀表示S或表示a,则在进程语句中存在用于给定标量信号S的单个驱动器。复合信号,其中S是子元素。每个这样的信号分配语句被称为与该驱动器相关联的。执行信号赋值语句仅影响相关的驱动程序。
在这种情况下,您的错误是由多个源(模式缓冲区的两个端口)引起的,其中一个不是从驱动程序和赋值语句派生的,具有静态默认值(模拟的'X',可能是' 0'用于合成)。
您可以将模式缓冲区端口更改为模式 (sertopar
)和模式输出(partoser
)。不要忘记更新要匹配的组件声明。
注意它们都连接到信号txd
(在uart_rl的声明中显示语法错误,应该是:
signal txd : std_logic;
并要求分配给ledg(0):
ledg(0) <= txd;
对于来自partoser的串行输出使用相同的信号作为sertopar的串行输入将提供串行回送。实际上,所有这一切都会使LED闪烁。
如果没有测试平台,那么确定该模型在结构上没有任何其他问题并不容易。错误的通常情况导致其中某些部分在合成期间被门控吃掉。
我们发现Rdata
有两个来源。 uartrl
中的进程(应该删除的赋值语句,提供所有'0的静态值)以及data_out
进程语句中sertopar
的赋值,提供两个源。
您还可以注意到uart_rl
中的流程在敏感列表中有clk
,但在流程中未对其进行评估。这导致发现txd_rdy
在那里和partoser
都有一个驱动程序。我们还发现有一个驱动程序用于parity_bit以及U2之后的并发语句。 Rend
也被赋予值“00”,没有其他值。看起来设计并不完全正常。
在问题分析期间未搜索到其他错误。找到任何进一步错误的最简单方法是通过模拟。
报告错误的原因与Error (10028): Can't resolve multiple constant drivers for net… VHDL ERROR的区别在于,其中一个静态源是由未驱动的端口引起的,该端口提供缓冲输出,提供恒定的默认值。