?? song.v
字號:
/* 樂曲演奏電路子模塊,非阻塞賦值
幾乎完全同書 */
module song(clk_6M,clk_4,speaker,high,mid,low,carry);
input clk_6M,clk_4; //clk_6M: 用于產生各種音階頻率的基準頻率;clk_4: 用于控制音長(節拍)的時鐘頻率
output speaker,carry; //speaker:用于激勵揚聲器的輸出信號,為方波;carry:計數器divider的進位輸出
output [3:0]high,mid,low; //分別用于顯示高音、中音和低音音符,各用一個數碼管來顯示
reg[3:0]high,mid,low;
reg[13:0]divider,origin; //divider :對clk_6M進行分頻的計數器;origin:各種音階頻率對應的預置數
reg[7:0]counter; //用于控制每個音符的時長及演奏的循環進行
reg speaker;
wire carry;
/* (1)反饋預置計數器 */
assign carry=(divider==16383);
always @(posedge clk_6M )
begin
if(divider==16383)
divider<=origin;
else
divider<=divider+1;
end
/* (2)2分頻器 */
always @(posedge carry)
speaker<=~speaker; //half frequency division
/* (3)樂譜產生電路 */
always@(posedge clk_4) //同書上
case({high,mid,low}) //preset the origin value for cnt according the note
12'h003:origin<=7281;
12'h005:origin<=8730;
12'h006:origin<=9565;
12'h007:origin<=10310;
12'h010:origin<=10647;
12'h020:origin<=11272;
12'h030:origin<=11831;
12'h050:origin<=12556;
12'h060:origin<=12974;
12'h100:origin<=13516;
12'h000:origin<=16383;
default:origin<=16383;
endcase
/* (4)音名顯示 */
always@(posedge clk_4)
begin
if(counter==47)
counter<=0; //time for loop play
else
counter<=counter+1;
case(counter) // 記譜
0: {high,mid,low}<=12'h003;//low 3,并持續4個節拍
1: {high,mid,low}<=12'h003;
2: {high,mid,low}<=12'h003;
3: {high,mid,low}<=12'h003;
4: {high,mid,low}<=12'h005;//low 5
5: {high,mid,low}<=12'h005;
6: {high,mid,low}<=12'h005;
7: {high,mid,low}<=12'h006;//low6
8: {high,mid,low}<=12'h010;//mid 1
9: {high,mid,low}<=12'h010;
10:{high,mid,low}<=12'h010;
11:{high,mid,low}<=12'h020;//mid 2
12:{high,mid,low}<=12'h006;//low 6
13:{high,mid,low}<=12'h010;//mid 1
14:{high,mid,low}<=12'h005;//low 5
15:{high,mid,low}<=12'h005;
16:{high,mid,low}<=12'h050;//mid 5
17:{high,mid,low}<=12'h050;
18:{high,mid,low}<=12'h050;
19:{high,mid,low}<=12'h100;//hig 1
20:{high,mid,low}<=12'h060;//mid 6
21:{high,mid,low}<=12'h050;//mid 5
22:{high,mid,low}<=12'h030;//mid 3
23:{high,mid,low}<=12'h050;//mid 5
24:{high,mid,low}<=12'h020;//mid 2
25:{high,mid,low}<=12'h020;
26:{high,mid,low}<=12'h020;
27:{high,mid,low}<=12'h020;
28:{high,mid,low}<=12'h020;
29:{high,mid,low}<=12'h020;
30:{high,mid,low}<=12'h020;
31:{high,mid,low}<=12'h020;
32:{high,mid,low}<=12'h020;
33:{high,mid,low}<=12'h020;
34:{high,mid,low}<=12'h020;
35:{high,mid,low}<=12'h030;//mid 3
36:{high,mid,low}<=12'h007;//low 7
37:{high,mid,low}<=12'h007;
38:{high,mid,low}<=12'h006;//low 6
39:{high,mid,low}<=12'h006;
40:{high,mid,low}<=12'h005;//low 5
41:{high,mid,low}<=12'h005;
42:{high,mid,low}<=12'h005;
43:{high,mid,low}<=12'h006;//low 6
44:{high,mid,low}<=12'h010;//mid 1
45:{high,mid,low}<=12'h010;
46:{high,mid,low}<=12'h020;//mid 2
47:{high,mid,low}<=12'h020;
//…………………………
endcase
end
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -