使用VHDL中的D-FlipFlop为CRC编写代码

时间:2019-09-01 15:00:58

标签: vhdl

我正在为大学项目学习VHDL。目标是在给定特定多项式的情况下编写CRC电路。我找到了使用注册的在线解决方案,但我想使用实际的D-FlipFlop来实现。

因此,我创建了D-FlipFlop,并使用generate将它们的几个实例放入我的主文件中,以使其更加灵活并能够轻松添加或删除触发器。

library IEEE;
use IEEE.std_logic_1164.all;

entity LFSR is
    generic (NBit   : positive := 8);
    port(
        clk :in     std_logic;
        reset   :in     std_logic;
        din :in     std_logic;
        dout    :out    std_logic_vector(Nbit-1 downto 0)
        );
    end LFSR;
architecture rtl of LFSR is

    component DFC
        port(
            clk :in std_logic;
            reset   :in std_logic;
            d   :in std_logic;
            crc :out    std_logic;
            q   :out    std_logic
        );  
    end component DFC;

    signal q_s  : std_logic_vector (NBit-1 downto 0):= (others => '0');
    signal crc_t    : std_logic_vector (NBit-1 downto 0):= (others => '0'); --registro temporaneo su cui fare le operazioni

    signal int_0    :std_logic := '0';
    signal int_2    :std_logic := '0';
    signal int_4    :std_logic := '0';
    signal int_8    :std_logic := '0';




    begin 
        int_0<= din xor q_s(7);
        int_2<= q_s(1) xor q_s(7);
        int_4<= q_s(3) xor q_s(7);

        GEN: for i in 0 to Nbit-1 generate

            FIRST:  if i=0 generate
                    FF1: DFC port map (
                            clk     => clk,
                            reset   => reset,
                            d   => int_0,
                            crc => crc_t(i), --funziona benissimo se metto dout(i)
                            q   => q_s(i)
                            );

                end generate FIRST; 

            THIRD: if i=2 generate
                    FF2: DFC port map (
                            clk     => clk,
                            reset   => reset,
                            d   => int_2,
                            crc => crc_t(i),
                            q   => q_s(i)
                                );
                end generate THIRD;

            FIFTH: if i=4 generate
                    FF4: DFC port map (
                            clk     => clk,
                            reset   => reset,
                            d   => int_4,
                            crc => crc_t(i),
                            q   => q_s(i)
                                );
                end generate FIFTH;


            INTERNAL: if i>0 and i<Nbit-1 and i/= 2 and i/=4 generate
                    FFI: DFC port map (
                            clk     => clk,
                            reset   => reset,
                            d   => q_s(i-1),
                            crc => crc_t(i),
                            q   => q_s(i)
                                );
                end generate INTERNAL;

            LAST:    if i=Nbit-1 generate
                    FFN: DFC port map (
                            clk     => clk,
                            reset   => reset,
                            d   => q_s(i-1),
                            crc => crc_t(i),
                            q   => q_s(i)
                            );
                end generate LAST;
    end generate GEN;


    variable t : natural := 0;

    begin
        if(rising_edge(clk)) then
            t:= t+1;
            if t=24 then 
                dout <= crc_t;
            end if;
        end if;
    end process;

end rtl;

当然,在第35行中,我在其中放置了“ d => din xor q_s(Nbit-1)”,编译器给了我一个错误。如何获得想要获得的结果?

我试图通过中介信号来解决此问题,但我不明白为什么它不能按预期工作。

这是DFC组件的代码:


library IEEE;
use IEEE.std_logic_1164.all;

entity DFC is 
    port(
        clk :in std_logic;
        reset   :in std_logic;
        d   :in std_logic;
        crc :out    std_logic;
        q   :out    std_logic
    );  
end DFC;

architecture rtl of DFC is
    begin
        process(clk, reset, d)
        begin
            if(reset = '1')then
                q <= '0';
                crc<= '0';
            elsif (clk'event and clk='1') then
                q <= d;
                crc <= d;
            end if;
        end process;
end rtl;

谢谢大家提出的要求。 加布里埃。

编辑:我添加了所有LFSR代码和DFC代码。

1 个答案:

答案 0 :(得分:0)

您的问题不完整,因为它没有minimal reproductible code。换句话说,很难为您提供帮助。

VHDL-2008之前的版本: 您无法执行以下操作:d => din xor q_s(Nbit-1),因为此行被视为操作,并且在实例化实体或组件时是不可能的。

(例如,在本帖子中,例如:https://electronics.stackexchange.com/questions/184893/warning-actual-for-formal-port-a-is-neither-a-static-name-nor-a-globally-stati

但是,有一种解决方法,您必须创建一个新信号

请注意,当您使用代码时,错误应该类似于:Actual for formal port a is neither a static name nor a globally static expression

使用VHDL-2008:

如果看标准:http://www.fis.agh.edu.pl/~skoczen/hdl/ieee_std/ieee1076-2008.pdf 您可以在第6.5.6.3节中找到端口子句:

  

如果模式in的正式端口与不是全局静态的表达式相关联(请参见9.4.1),并且   形式是无约束或部分约束的复合类型,需要确定索引   根据5.3.2.2的规则从实际值开始,则表达式应为以下之一:

     
      
  • 子类型为全局静态的对象的名称

  •   
  • 一个索引名称,其前缀是此列表的成员之一

  •   
  • 切片名称,其前缀是此列表的成员之一,并且其离散范围是全局静态离散范围

  •   
  • 一个聚合,条件是所有选择都是局部静态的,并且元素关联中的所有表达式都是此列表中描述的表达式

  •   
  • 函数调用,其返回类型标记表示全局静态子类型

  •   
  • 合格的表达式或类型转换,其类型标记表示全局静态子类型

  •   
  • 此列表中描述的并且括在括号中的表达式

  •   

换句话说,在VHDL-2008中,您提供的代码应该可以使用。

关于初始化问题,目前尚不清楚,哪些信号/变量未初始化?最好的办法是,如果您的第一个问题在本帖子中得到了很好的回答,请接受它的解决方案,或者编辑您的问题以使其更加清晰。然后在另一个线程中询问有关初始化问题的另一个问题。您也可以在Electronics Stackexchange

上发布您的问题