我正在尝试根据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;
请帮忙
奇偶校验是使用的信号计算的par
,但在VHDL中,直到增量周期之后,才更新信号的读取值。因此,仅在时钟沿进行评估的过程就不可能通过环路中的信号进行累加。
一种可能性是制作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';
重置部分中的final是不必要的,因为par
它在每次迭代之前都会初始化。
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句