我正在尝试根据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;
请帮忙
答案 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);