【发布时间】:2014-04-19 20:28:37
【问题描述】:
我正在尝试使用多个计数器从 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 微秒。任何关于他们为什么不重置的见解都值得赞赏。
【问题讨论】:
-
我认为我们将需要查看
output_counter_*声明...更好的是,如果您想让我们更容易地提供帮助,请简化并发布一个小的可编译/可模拟示例。 -
完整的代码可以在这里找到(虽然后面有一些提交)github.com/srohrer32/beamformer_hdl/tree/new_proc。这是一个 output_counter 声明。 信号 output_counter_l_0 : 整数范围 0 到 127 := 0;