错误(10028):无法在uart_rl.vhd(77)

时间:2018-04-28 21:25:27

标签: vhdl uart

我正在尝试编写UART代码,但是我收到以下错误:

  

错误(10028):无法在uart_rl.vhd解析网络“ledr [7]”的多个常量驱动程序(77)

简短说明:

  • 重置:重置程序
  • load:从切换器获取数据
  • 开始:程序开始
  • 启动信号为1 =未从tx发送到rx,当它变为0时开始发送启动信号8个数据位(从开关获得),奇偶校验位=如果数据是0x111 pairty bit ='1'2 stop bit和1 eror bit =如果奇偶校验位错误/数据没有发送。

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;

1 个答案:

答案 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的区别在于,其中一个静态源是由未驱动的端口引起的,该端口提供缓冲输出,提供恒定的默认值。