Чтобы начать работу, я настроил для вас среду. Вы должны добавить, что вам нужна логика для правильной работы (домашняя работа) особенно в счетчике, где вам нужно рассчитать требуемую частоту.
// 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
Вы хотите, чтобы иметь возможность играть одну ноту в то время, или несколько нот в то время? –
Только по одному –