我正在开设一个数字设计课程,我必须在项目中使用频率播放音符。我必须说我在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,我想要做的是根据用户输入改变输出频率,所以我假设我只需要改变计数器计数的值。如何巧妙地将其添加到代码中以便它可以工作?
答案 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