100: {high,med,low}<='b000000010000; //中音\ 101: {high,med,low}<='b000000010000; //中音\ 102: {high,med,low}<='b000000010000; //中音\ 103: {high,med,low}<='b000000010000; //中音\ 104: {high,med,low}<='b000000010000; //中音\ 105: {high,med,low}<='b000000000110; //低音\ 106: {high,med,low}<='b000000000110; //低音\ 107: {high,med,low}<='b000000010000; //中音\ 108: {high,med,low}<='b000000010000; //中音\ 109: {high,med,low}<='b000000100000; 110: {high,med,low}<='b000000100000; 111: {high,med,low}<='b000000100000; 112: {high,med,low}<='b000000100000; 113: {high,med,low}<='b000000100000; 114: {high,med,low}<='b000000100000; 115: {high,med,low}<='b000000110000; 116: {high,med,low}<='b000000110000; 117: {high,med,low}<='b000000100000; 118: {high,med,low}<='b000000100000;
119: {high,med,low}<='b000000010000; 120: {high,med,low}<='b000000010000;
121: {high,med,low}<='b000000000110; 122: {high,med,low}<='b000000000110;
123: {high,med,low}<='b000000010000; 124: {high,med,low}<='b000000010000;
125: {high,med,low}<='b000000100000; 126: {high,med,low}<='b000000100000; 127: {high,med,low}<='b000000100000; 128: {high,med,low}<='b000000100000; 129: {high,med,low}<='b000000100000; 130: {high,med,low}<='b000000100000; 131: {high,med,low}<='b000000100000; 132: {high,med,low}<='b000000100000; 133: {high,med,low}<='b000000100000; 134: {high,med,low}<='b000000100000; 135: {high,med,low}<='b000000100000; 136: {high,med,low}<='b000000100000; 137: {high,med,low}<='b000000100000; 138: {high,med,low}<='b000000100000; 139: {high,med,low}<='b000000100000; 140: {high,med,low}<='b000000100000; 141: {high,med,low}<='b000000110000; 142: {high,med,low}<='b000000110000; 143: {high,med,low}<='b000000100000;
//中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音3
//中音\ //中音\ //低音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\ //中音\
//持续2个时钟节拍 //中音2
16
144: {high,med,low}<='b000000100000; //持续2个时钟节拍 145: {high,med,low}<='b000000110000; //中音\
146: {high,med,low}<='b000000110000; //发10个时钟节拍 147: {high,med,low}<='b000000110000;
148: {high,med,low}<='b000000110000; 149: {high,med,low}<='b000000110000; endcase end
endmodule //模块结束
7)取码模块源代码和顶层模块如下:
//取码模块,从song模块取得数码管显示部分的位码和段码 module quma(high,med,low,clk_1mhz,dig,duan); input [3:0] high,med,low; input clk_1mhz; reg[7:0] dig;
output [7:0]dig;//定义输出八位位码 reg [7:0] duan;
output [7:0] duan; //定义用于输出的段码的代码
always @(posedge clk_1mhz)//扫描high,med,low三个寄存器的值,取出位码和段码的代码 begin
if (high!=0) //如果high的值不为0,则只输出high的值 begin dig<=8'b11111011; case (high)
1:duan<=8'b00000001; 2:duan<=8'b00000010; 3:duan<=8'b00000011; 4:duan<=8'b00000100; 5:duan<=8'b00000101; 6:duan<=8'b00000110; 7:duan<=8'b00000111; endcase end
else if (med!=0) // 如果med的值不为0,则只输出med的值 begin dig<=8'b11111101; case (med )
17
1:duan<=8'b00000001; 2:duan<=8'b00000010; 3:duan<=8'b00000011; 4:duan<=8'b00000100; 5:duan<=8'b00000101; 6:duan<=8'b00000110; 7:duan<=8'b00000111; endcase end
else if (low!=0) //如果low的值不为0,则只输出low的值 begin dig<=8'b11111110; case (low )
1:duan<=8'b00000001; 2:duan<=8'b00000010; 3:duan<=8'b00000011; 4:duan<=8'b00000100; 5:duan<=8'b00000101; 6:duan<=8'b00000110; 7:duan<=8'b00000111; endcase end end
endmodule
8)disp:显示模块,每位输出转换为七段数码管显示。源代码和顶层模块如下: //动态数码管显示模块
module disp(duan,clk_1khz,seg); input [7:0]duan; input clk_1khz; output [7:0]seg; reg [7:0]seg;
always @(posedge clk_1khz) begin case(duan)
1:seg=8'b11111001; 2:seg=8'b10100100; 3:seg=8'b10110000; 4:seg=8'b10011001;
18
5:seg=8'b10010010; 6:seg=8'b10000010; 7:seg=8'b11111000;
default: seg=8'b11111001; endcase end
endmodule
方案测试
顶层图形文件建立后,对系统进行仿真,由于仿真时对输入输出信号的频率有要求,所以先对每个模块进行仿真。
1) 48MHz分频成12MHz波形模块,仿真波形如下:
2) 12MHz分频成6MHz波形模块,仿真波形如下:
19
3)12MHz分频成1MHz波形模块,仿真波形如下:
4)12MHz分频成4Hz波形模块,仿真波形如下:
5)12MHz分频成1khz波形模块,仿真波形如下:
20