我正在尝试使用从0到109循环的多个计数器进行设计。但是,当在FPGA上时,计数器不会重置为109,而是重置为127(它们的最大值)。他们确实在模拟中工作。以下是我的代码:
speaker_processing_r : process(us_clock)
begin
if(rising_edge(us_clock)) then
if(i_reset = '1') then
output_counter_r_0 <= 0;
output_counter_r_1 <= (sample_period);
output_counter_r_2 <= (sample_period*2);
output_counter_r_3 <= (sample_period*3);
output_counter_r_4 <= (sample_period*4);
data_r_0 <= X"00";
data_r_1 <= X"00";
data_r_2 <= X"00";
data_r_3 <= X"00";
data_r_4 <= X"00";
else
--Output Conditions based on delays calculated or inserted
if(output_counter_r_0 = 2) then
data_r_0 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_1) then
data_r_1 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_2) then
data_r_2 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_3) then
data_r_3 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_4) then
data_r_4 <= shift_register_r(0);
elsif(output_counter_r_0 = (sample_period*5-1)) then
output_counter_r_0 <= 0;
end if;
if(output_counter_r_1 = 2) then
data_r_0 <= shift_register_r(1);
elsif(output_counter_r_1 = delay_1) then
data_r_1 <= shift_register_r(1);
elsif(output_counter_r_1 = delay_2) then
data_r_2 <= shift_register_r(1);
elsif(output_counter_r_1 = delay_3) then
data_r_3 <= shift_register_r(1);
elsif(output_counter_r_1 = delay_4) then
data_r_4 <= shift_register_r(1);
elsif(output_counter_r_1 = (sample_period*5-1)) then
output_counter_r_1 <= 0;
end if;
if(output_counter_r_2 = 2) then
data_r_0 <= shift_register_r(2);
elsif(output_counter_r_2 = delay_1) then
data_r_1 <= shift_register_r(2);
elsif(output_counter_r_2 = delay_2) then
data_r_2 <= shift_register_r(2);
elsif(output_counter_r_2 = delay_3) then
data_r_3 <= shift_register_r(2);
elsif(output_counter_r_2 = delay_4) then
data_r_4 <= shift_register_r(2);
elsif(output_counter_r_2 = (sample_period*5-1)) then
output_counter_r_2 <= 0;
end if;
if(output_counter_r_3 = 2) then
data_r_0 <= shift_register_r(3);
elsif(output_counter_r_3 = delay_1) then
data_r_1 <= shift_register_r(3);
elsif(output_counter_r_3 = delay_2) then
data_r_2 <= shift_register_r(3);
elsif(output_counter_r_3 = delay_3) then
data_r_3 <= shift_register_r(3);
elsif(output_counter_r_3 = delay_4) then
data_r_4 <= shift_register_r(3);
elsif(output_counter_r_3 = (sample_period*5-1)) then
output_counter_r_3 <= 0;
end if;
if(output_counter_r_4 = 2) then
data_r_0 <= shift_register_r(4);
elsif(output_counter_r_4 = delay_1) then
data_r_1 <= shift_register_r(4);
elsif(output_counter_r_4 = delay_2) then
data_r_2 <= shift_register_r(4);
elsif(output_counter_r_4 = delay_3) then
data_r_3 <= shift_register_r(4);
elsif(output_counter_r_4 = delay_4) then
data_r_4 <= shift_register_r(4);
elsif(output_counter_r_4 = (sample_period*5-1)) then
output_counter_r_4 <= 0;
end if;
output_counter_r_0 <= output_counter_r_0 +1;
output_counter_r_1 <= output_counter_r_1 +1;
output_counter_r_2 <= output_counter_r_2 +1;
output_counter_r_3 <= output_counter_r_3 +1;
output_counter_r_4 <= output_counter_r_4 +1;
end if;
end if;
end process;
所有延迟(delay_1
,delay_2
,delay_3
,delay_4
)信号都是泛型和sample_period
。 us_clock
的周期为1微秒。任何关于他们为什么不重置的见解都表示赞赏。
答案 0 :(得分:2)
我看到一个明显的问题和一个潜在的问题。
首先,当您在流程结束时分配output_counter_r_* <= output_counter_r_* + 1
时,这些优先于if块中的赋值(请参阅How does signal assignment work in a process?)。计数器信号分配不会生效&#34;直到该过程在此处完成,因此将忽略这些增量语句之前的任何内容。实际上,我很惊讶它在sim中工作。你在用什么模拟器?
第二个潜在的问题是计数器的翻转条件取决于前面的if条件都不是真的。这是故意的吗?它不应该是一个问题,除非delay_*
恰好等于sample_period*5-1
,但您可能想尝试将其拆分为:
if(output_counter_r_0 = 2) then
data_r_0 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_1) then
data_r_1 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_2) then
data_r_2 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_3) then
data_r_3 <= shift_register_r(0);
elsif(output_counter_r_0 = delay_4) then
data_r_4 <= shift_register_r(0);
end if;
if(output_counter_r_0 = (sample_period*5-1)) then
output_counter_r_0 <= 0;
else
output_counter_r_0 <= output_counter_r_0 +1;
end if;
(除非那不是你想要的功能。)
编辑以获得进一步说明
基本上,在VHDL的过程中,仅在进程暂停/等待时(即,对于正常进程,在结束时)分配信号,这意味着仅使用对信号的最后分配。这很有用,因为我不会进入这里的几个原因,但结果是,因为你总是在流程结束时递增计数器,所以你早些时候对他们做了什么。在这个过程中将被忽略。您可以按照我上面显示的方式对其进行编码,除非故意您的翻转条件取决于其他计数器比较 - &#34;如果= 2,请执行此操作,否则如果= delay_1执行此操作,... 否则如果它处于极限,请将其翻转。&#34;有了这个逻辑,只有在其他条件都不成立的情况下,计数器才会翻转。
如果此 是故意的,最简单的解决方案就是将增量移动到流程的开头,这样它们就会被翻转检查覆盖。另一个(可能更安全?)解决方案是修改上面的第二个if块,以明确检查您想要的条件。由你决定。