差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 | |||
代码风格 [2021/05/14 11:53] anran |
代码风格 [2021/05/14 17:17] (当前版本) anran |
||
---|---|---|---|
行 5: | 行 5: | ||
module beeper ( | module beeper ( | ||
input clk, | input clk, | ||
- | output reg speaker | + | input [3:0] key_n, |
+ | output speaker | ||
); | ); | ||
- | reg [13:0] cnt; | + | parameter cnt_Width = 15; |
+ | parameter ClkDividerDo = 12000000/262/2; | ||
+ | parameter ClkDividerRe = 12000000/294/2; | ||
+ | parameter ClkDividerMi = 12000000/330/2; | ||
+ | parameter ClkDividerFa = 12000000/349/2; | ||
+ | reg en, beep; | ||
+ | reg [cnt_Width-1:0] cnt, ClkDivider; | ||
+ | |||
+ | always @(*) | ||
+ | case(key_n) | ||
+ | 4'b1110: begin ClkDivider = ClkDividerDo; en = 1'b1; end | ||
+ | 4'b1101: begin ClkDivider = ClkDividerRe; en = 1'b1; end | ||
+ | 4'b1011: begin ClkDivider = ClkDividerMi; en = 1'b1; end | ||
+ | 4'b0111: begin ClkDivider = ClkDividerFa; en = 1'b1; end | ||
+ | default: begin ClkDivider = ClkDivider; en = 1'b0; end | ||
+ | endcase | ||
always @(posedge clk) | always @(posedge clk) | ||
- | if(cnt >= 15'd27271) cnt <= 15'd0; | + | if(cnt >= ClkDivider-1) cnt <= {cnt_Width{1'b0}}; |
- | else cnt <= cnt + 15'd1; | + | else cnt <= cnt + 1'b1; |
always @(posedge clk) | always @(posedge clk) | ||
- | if(cnt >= 15'd13136) speaker <= 1'b1; | + | if(cnt >= ClkDivider-1) beep <= ~beep; |
- | else speaker <= 1'b0; | + | else beep <= beep; |
+ | assign speaker = en? beep : 1'b0; | ||
+ | |||
endmodule | endmodule | ||
+ | |||
</code> | </code> | ||