武汉科技大学中南分校2008届毕业设计(论文)
end //以上的用来生成数据,下边的用于控制格式输出 number=[0:4195]; for i=1:4196 comer(i)=':'; end for i=1:4196 semi(i)=';'; end
data=[number; comer; sin_value; semi]; fid=fopen('d:\\mif_data_matlabsky2.txt','w'); fprintf(fid, '%d%c%d%c\\n', data); fclose(fid);
§3.5 波形翻转
从波形ROM中输出的是正弦波的的半波,所以需要将其转换成全波。模块图如图3.5所示。这个模块是通过判断来之累加器的相位来实现波形的翻转。
hsout[7..0]clkph[13..0]q[7..0]
inst5 图3.5
模块程序如下:
module hs(clk,ph,q,out); input clk; input[13:0] ph; input [7:0] q; output[7:0] out; reg [7:0] out;
第11页 共20页
xx:<数字频率合成器>
always @(posedge clk) begin
if(ph<8191) out=q;
else if(ph>8190) out=255-q; end endmodule
§3.6 键盘扫描
本系统中使用的键盘是3*6的矩阵键盘,使用的矩阵键盘的最大优势在于它占用的I/O资源少,本系统中18各按键使用了9个I/O节省了9个I/O口。但是矩阵键盘的识别程序比较复杂,其中包括了键盘的扫描,去抖功能。在该系统中键盘的扫描是在FPGA中实现的。键盘扫描模块如图3.6所示:
ScanKeyCSRDCLKKP[5..0]Dout[7..0]KC[2..0]KR[5..0]INTINT1inst3BIDIRVCCkeyDout[7..0]INTk[9..0]inst8KC[2..0]KR[5..0]INTOUTPUTBIDIRVCC图3.6 键盘控制
该模块通过对键盘的行和列高低电平的判断(即读取图3.6中的KC[2.0]和KR[5.0]的数值)来识别是键盘中的那个键按下实现数值的输入。通过Sankey模块识别是矩阵键盘中的键按下并将按下的键值作为输出送入key模块和51单片机,key模块在识别Enter键按下后将键盘键入的值换算成频率控制字送入累加器实现对输出频率的控制。 Scankey模块程序:
module ScanKey(CS,RD,CLK,Dout,KC,KR,KP,INT,INT1); input CLK; //Clock signal of the module
第12页 共20页
武汉科技大学中南分校2008届毕业设计(论文)
input CS; input RD;
inout [2:0] KC; //Columns of 4X4 KeyBoard inout [5:0] KR; //Rows of 4X4 KeyBoard input [5:0] KP; //6 Gpro key
output [7:0] Dout; //Output the numeber of the key output INT,INT1; //Interrupt signal reg[2:0] KC_temp; reg[5:0] KR_temp; reg[2:0] KC_out; reg[5:0] KR_out; reg[7:0] Key_temp;
reg[2:0] Count; //Couter for scanning keyboard assign KC=(Count==0)? 3'bzzz:KC_out; assign KR=(Count==3)? 6'bzzzzzz:KR_out; assign INT=(Key_temp[4:0]==31)? 0:1;
assign INT1=(Key_temp[4:0]==31)? 1:0; assign Dout=((!CS)&(!RD))? Key_temp : 8'hzz; always @(KP) begin case(KP)
6'b111110:Key_temp[7:5]<=1; 6'b111101:Key_temp[7:5]<=2; 6'b111011:Key_temp[7:5]<=3; 6'b110111:Key_temp[7:5]<=4; 6'b101111:Key_temp[7:5]<=5; 6'b011111:Key_temp[7:5]<=6; default:Key_temp[7:5]<=0; endcase end
//Generate Interrupt Signal 第13页 共20页
xx:<数字频率合成器>
always@(posedge CLK) begin
Count<=Count+1; end
always@(posedge CLK) begin
if(Count==6) begin
KC_out<=3'b111; KR_out<=6'b000000; end if(Count==0) KC_temp<=KC; if(Count==1) begin
KC_out<=3'b000; KR_out<=6'b111111; end if(Count==3) KR_temp<=KR; end
always@(posedge CLK) begin
case({KC_temp,KR_temp}) 9'b110111110:Key_temp[4:0]<=0; 9'b110111101:Key_temp[4:0]<=1; 9'b110111011:Key_temp[4:0]<=2; 9'b110110111:Key_temp[4:0]<=3; 9'b110101111:Key_temp[4:0]<=4; 9'b110011111:Key_temp[4:0]<=5;
第14页 共20页