奇偶校验的VHDL问题

时间:2014-05-25 13:07:53

标签: vhdl

我正在尝试根据DCF77信号制作原子钟。现在我正在尝试对向量进行偶校验。什么时候可以将正确的数据传递给另一个向量。 现在我的问题是它不会进行奇偶校验(对于xor里面的for循环),对我来说代码是正确的并且编译没有错误。

parity: process(reset, clk, start)
begin
    if((reset /= '1') or (start /= '1')) then
        if(falling_edge(clk)) then
            if(count >= 58 and start = '0' and data(38) = '1' and data /= x"1FFFFFFFFFFFFFF") then -- if every data has arrived and minute mark1 = 1                
                par <= '0';
                for I in 37 downto 31 loop -- loop over every bit of the minutes and count how many logical 1 bits there are
                    par <= par xor data(I); -- check minute parity
                end loop;

                if((par = '1' and data(30) = '1') or (par = '0' and data(30) = '0')) then -- if the minute parity is correct then proceed to hour parity else reset the whole time data
                    par <= '0';
                    for I in 29 downto 24 loop -- loop over every bit of the minutes and count how many logical 1 bits there are
                        par <= par xor data(I); -- check hour parity
                    end loop;

                    if((par = '1' and data(23) = '1') or (par = '0' and data(23) = '0')) then  -- if the hour parity is correct then proceed put data to a seperate vector else reset the whole time data
                        dataTime <= data(37 downto 23);
                    else
                        dataTime <= (others => '1'); -- Error
                    end if;
                else
                    dataTime <= (others => '1'); -- Error
                end if;

                par <= '0';
                for I in 22 downto 1 loop -- loop over every bit of the date and count how many logical 1 bits there are
                    par <= par xor data(I); -- check date parity
                end loop;

                if((par = '1' and data(0) = '1') or (par = '0' and data(0) = '0')) then
                    dataDate <= data(22 downto 0); -- load the date data in to a seperate vector
                else
                    dataDate <= (others => '1'); -- Error
                end if;
            else
                dataTime <= (others => '1');
                dataDate <= (others => '1');
            end if;
        end if;
    else
        dataTime <= (others => '1');
        dataDate <= (others => '1');
        par <= '0';
    end if;
end process;

请帮忙

1 个答案:

答案 0 :(得分:2)

使用par的信号计算奇偶校验,但在VHDL中使用读取值计算奇偶校验 直到delta周期之后才更新信号。所以积累通过 只有在时钟进行评估的过程才能实现循环中的信号 边缘。

一种可能性是使par成为流程变量,并使用:= 分配给变量,因为VHDL变量会立即更新以供读取。 代码:

parity: process(reset, clk, start)
  variable par : std_logic;
begin
    ...
                par := '0';
                for I in 37 downto 31 loop
                    par := par xor data(I);
                end loop;
    ...

重置部分中的最后par := '0';不是必需的,因为par是。{1}} 在每次迭代之前初始化。

VHDL-2002中的另一种方法是使用代码创建一个简化XOR函数 像:

  function xor_reduct(slv : in std_logic_vector) return std_logic is
    variable res_v : std_logic;
  begin
    res_v := '0';
    for i in slv'range loop
      res_v := res_v xor slv(i);
    end loop;
    return res_v;
  end function;

begin

    parity: process(reset, clk, start)
      variable par : std_logic;
    begin
        ...
                    par := xor_reduct(data(37 downto 31));

在VHDL-2008中(如果支持),它是:

par := xor data(37 downto 31);