为了让你开始,我已经为你设置了一个环境。您必须添加您的逻辑以实现正确的功能(作业),特别是在您必须计算所需频率的计数器寄存器中。
// change logic here (to add userinput)
counter <= clkdivider-1;
由于您想根据用户输入改变输出频率,您应该在music
模块中添加一个输入端口。
module music(clk, reset, userinput, valid, speaker);
input clk, valid, reset;
input [7:0] userinput;
output speaker;
userinput
是 8 位,但您可以根据自己的要求进行更改。请注意,valid
与其他模块握手也需要一个信号。
还添加了重置以清除您的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
这是您需要修复的 RTL 代码。
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
你可能想在这里编译代码
http://www.edaplayground.com/x/PR2