在Verilog中用开关改变方波频率

在Verilog中用开关改变方波频率,verilog,fpga,frequency,wave,Verilog,Fpga,Frequency,Wave,我试图使用我的basys2板上的8个开关来控制方波的频率,但它的输入部分有问题,因为我不知道如何使用我收集开关状态的寄存器的二进制值来划分时钟 我知道我需要除以25000000/[输入值],以获得计数器的正确值。我的问题是: 我如何将25000000除以存储有开关状态的寄存器,例如input[7:0]SW?如果您可以假设输入总是二的幂,您可以使用向右移位。但是如果您想要完整的255个可能的分辨率,您需要实现一个除法器 一些合成工具只是在简单地写入25000000/inputValue时合成一个除

我试图使用我的
basys2
板上的8个开关来控制方波的频率,但它的输入部分有问题,因为我不知道如何使用我收集开关状态的寄存器的二进制值来划分时钟

我知道我需要除以
25000000/[输入值]
,以获得计数器的正确值。我的问题是:


我如何将
25000000
除以存储有开关状态的寄存器,例如
input[7:0]SW

如果您可以假设输入总是二的幂,您可以使用向右移位。但是如果您想要完整的255个可能的分辨率,您需要实现一个除法器

一些合成工具只是在简单地写入25000000/inputValue时合成一个除法器。对于其他一些人,你可能不得不自己做

或者,如果您不想浪费时间进行除法,可以预先计算值并使用计数器:

case (inputValue)
  8'b0000_00010: counterMax = 25000000/2 ; //Where 25000000/2 can be calculated at compile time or by you
  8'b0000_00011: counterMax = 25000000/3 ; //Where 25000000/3 can be calculated at compile time or by you
... 
endcase
然后数到计数器最大值:

always @(posedge clock)
begin
  counter <= counter + 1;
  if(counter == counterMax) begin
    out <= ~out;
    counter <= 0;
  end
end
始终@(posedge时钟)
开始

计数器而不是除以输入,您是否可以在每个时钟周期内将计数器增加
SW
?例如,如果SW为“15”,则周期减少15倍,但可以避免昂贵的除法电路。

一种简单的方法是计数器,即具有比较和重新加载或清除功能的迭代加法器。