根据输入改变计数器目标

时间:2015-11-24 08:29:17

标签: verilog fpga spartan

我正在开设一个数字设计课程,我必须在项目中使用频率播放音符。我必须说我在verilog中相当缺乏经验(必须在项目中使用verilog)。我对该主题进行了一些研究,并找到了(here)以下代码片段:

    module music(clk, speaker);
    input clk;
    output speaker;
    parameter clkdivider = 25000000/440/2;

    reg [14:0] counter;
    always @(posedge clk) if(counter==0) counter <= clkdivider-1; else counter <= counter-1;

    reg speaker;
    always @(posedge clk) if(counter==0) speaker <= ~speaker;
    endmodule

在这段代码中,时钟是25MHz,输出频率是440,我想要做的是根据用户输入改变输出频率,所以我假设我只需要改变计数器计数的值。如何巧妙地将其添加到代码中以便它可以工作?

1 个答案:

答案 0 :(得分:2)

为了帮助您入门,我为您设置了一个环境。 您必须添加逻辑才能生成正确的功能(作业) 特别是在柜台登记处,你必须计算 要求的频率。

music

由于您想根据用户输入更改输出频率, 您应该将输入端口添加到module music(clk, reset, userinput, valid, speaker); input clk, valid, reset; input [7:0] userinput; output speaker; 模块。

userinput

valid是8位,但您可以根据您的要求更改此位。 请注意,与另一个握手握手时也需要music信号 模块。

还会添加重置以清除module testmusic; reg clk; reg [7:0] userinput; wire speaker; reg valid; reg reset; initial begin forever begin #1 clk = !clk; end end initial begin clk = 0; userinput = 0; valid = 0; @(posedge clk); $monitor("userinput: %0h valid: %0h speaker: %0h\n", userinput, valid, speaker); end task resetdut; reset = 0; repeat (3) begin @(posedge clk); end reset <= 1; repeat (3) begin @(posedge clk); end reset <= 0; endtask music dut(clk, reset, userinput, valid, speaker); initial begin #10000; $finish; end // perform our testing here initial begin // perform reset to initialize our dut resetdut; testuserinput; end task testuserinput; @(posedge clk); userinput <= 8'hF; // insert user input here valid <= 1; @(posedge clk); userinput <= 0; valid <= 0; @(posedge clk); endtask endmodule 模块。

这是您的测试平台

module music(clk, reset, userinput, valid, speaker);
    input clk, valid, reset;
    input [7:0] userinput;
    output speaker;
    parameter clkdivider = 25000000/440/2;

    reg [14:0] counter;

  reg [7:0] reginput;

    always @(posedge clk) begin
      if (reset) begin
        counter <= 0;
      end
      else begin
        if(counter==0) begin
          // change logic here (to add userinput)
            counter <= clkdivider-1; 
        end
        else begin
            counter <= counter-1;
        end
      end
    end

    reg speaker;
    always @(posedge clk) begin
      if (reset) begin
        speaker <= 0;
      end
      else begin
        if(counter==0) begin
            speaker <= ~speaker;
        end
      end
    end

    // handshake
  always @(posedge clk) begin
    if (reset) begin
      reginput <= 0;
    end
    else begin
        if (valid) begin
          reginput <= userinput;
        end
    end
  end

endmodule

以下是您需要修复的RTL代码。

<script>
var stuff="{'webnair':'1'}";
var move = 0;
$('body').on('click',function(){
    if(move){
     $.post('add.php',{stuff: stuff},function(data,status){
         if(status=='success'){alert('Done');}
     });
    }
});

您可能需要在此处编译代码 http://www.edaplayground.com/x/PR2