差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 | |||
|
代码风格 [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> | ||