如何将奇偶校验位附加到给定的4位std_logic_vector?

时间:2019-04-22 19:36:36

标签: vhdl

Image of the DUT

我正在尝试编写由奇偶校验位保护的内部半字节传输。 为此,我想编写一个发送器/接收器逻辑,如所附图像所示。

所以我有一个4位输入向量并为其生成一个奇偶校验位,这就是我的问题。 我想将奇偶校验位附加到输入向量。但是输入向量只有4位。有没有一种方法可以通过简单地将奇偶校验位附加到输入向量来调整它的大小,或者我是否必须单独发送奇偶校验位? 关于整个实现的一个小问题: 我是否需要像代码中那样为接收器和发送器创建单独的进程,还是只需要编写一个包含两者的进程?

我的第一个想法是简单地使用5位内部向量来附加奇偶校验位,但是问题是我只希望最终将给定的输入作为输出,并且存在相同的问题。在奇偶校验器的过程中,我必须用内部5位矢量填充4位的输出矢量,并且不知道这是否像我在代码中尝试的那样简单地工作。

希望您能理解这个问题。 谢谢。

architecture rtl of odd parity is
    signal rxdat_s   : out std_logic_vector(3 downto 0);
    signal ok_s      : out std_logic;
    signal txdat_s   : in std_logic_vector(3 downto 0);
    signal secured_s : std_logic_vector (4 downto 0);

begin 
    odd_parity_gen: process ( txdat_s, clk ) is
        variable txdat_v      : std_logic_vector(3 downto 0);
        variable secured_v    : std_logic_vector(4 downto 0);
        variable odd_parity_v : integer;
    begin 
        txdat_v := txdat_s;

        odd_parity_v := xnor txdat_v;
        secured_v    := txdat_v + odd_parity_v;

        secured_s <= secured_v;

    end process odd_parity_gen;

    odd_parity_check: process () is
        variable ok_v         : integer;
        variable rxdat_v      : std_logic_vector(3 downto 0);
        variable secured_v    : std_logic_vector(4 downto 0);
    begin
        rxdat_v   := rxdat_s;
        secured_v := secured_s;
        ok_v      := ok_s;

        ok_v    := xnor secured_v;
        rxdat_v := secured_v;

        ok_s    <= ok_v;
        rxdat_s <= rxdat_v;


    reg: process ( clk ) is
    begin
        if rising_edge (clk) then 
            if nres = '0' then
                --reset all signals
            else
                --main logic
            end if;
        end if;
    end process;

1 个答案:

答案 0 :(得分:1)

我假设此代码已被拼凑在一起作为示例。您在体系结构中具有输入/输出端口,并且端口相当混乱:rxdat_s是输出,而txdat_s是输入。另外,您没有5位输出端口,需要发送4位加奇偶校验。

此外:secured_v := txdat_v + odd_parity_v;添加一个整数和一个需要转换的std_logic_vector或一个库。

假设您的奇偶校验生成器正确,则可以使用串联&运算符在前面添加一个奇偶校验位。

 secured_s  <= odd_parity_v  & rxdat_s;

或在后面使用:

secured_s  <= rxdat_s & odd_parity_v;