b¡¢ CLK£ºÊ±ÖÓÉäÈ룬ƵÂÊΪ22.1184MHz£»
c¡¢ CLK_S£º¶ÔÓ¦²¨ÌØÂÊ·ÖƵÊä³ö£¬¸ù¾ÝFreSelÊäÈë¿ØÖÆÊý¾Ý½øÐжÔÓ¦·ÖƵ£¬¶ÔӦģʽ
ÓÐ300¡¢600¡¢1200¡¢1800¡¢2400¡¢4800¡¢9600¡¢14.4K¡¢19.2K¡¢28.8Kbps d¡¢ CLK_S16£º¶ÔÓ¦²¨ÌØÂÊ16±¶·ÖƵÊä³ö£» ? ¹ý³Ì˵Ã÷£º
a¡¢ ½¨Á¢VerilogÄ£¿é£» b¡¢ ½¨Á¢Verilog·ÂÕ棻 c¡¢ Ñé֤ģ¿éÕýÈ·ÐÔ£»
d¡¢ ½¨Á¢µç·ͼ·½Ê½¶¥²ãÄ£¿éSerial
e¡¢ Á¬½Ó²¨ÌØÂÊ·¢ÉúÆ÷Ä£¿éºÍģʽ¿ØÖÆÄ£¿é½øÐÐÁªºÏÑéÖ¤£»
Ô´´úÂëÈçÏ£º
module FreqMod(FreSel, CLK, CLK_S16, CLK_S); input [3:0] FreSel; input CLK;
output CLK_S16; output CLK_S; reg CLK_S=0; reg CLK_S16=0; reg [16:0]count=0; reg [16:0]count_16=0; reg [16:0]num=0; reg [16:0]num16=0; always @(posedge CLK) begin if(FreSel==0) num<=36864;//300 else if(FreSel==1) num<=18432;//600 else if(FreSel==2) num<=9216;//1200 else if(FreSel==3) num<=6144;//1800 else if(FreSel==4) num<=4608;//2400 else if(FreSel==5) num<=2304;//4800 else if(FreSel==6) num<=1152;//9600 else if(FreSel==7) num<=768;//14.4k else if(FreSel==8) num<=576;//19.2k else if(FreSel==9) num<=384;//28.8k
end always @(posedge CLK) begin count<=count+1; num16<=num/(16); count_16=count_16+1; if(count>=num) begin CLK_S<=~CLK_S; count<=0; end if(count_16>=num16) begin CLK_S16<=~CLK_S16; count_16<=0; end end endmodule
²âÊÔ´úÂëÈçÏ£º
module FreqModTest_v; // Inputs reg [3:0] FreSel; reg CLK; // Outputs wire CLK_S16; wire CLK_S;
parameter PERIOD = 100; //value=ʱÖÓÖÜÆÚ(µ¥Î»ns) always begin CLK= 1'b0;
#(PERIOD/2) CLK = 1'b1; #(PERIOD/2); end // Instantiate the Unit Under Test (UUT) BitProducer uut ( .FreSel(FreSel), .CLK(CLK), .CLK_S16(CLK_S16), .CLK_S(CLK_S) ); initial begin
// Initialize Inputs // Wait 100 ns for global reset to finish #100;
FreSel=1001; // Add stimulus here end endmodule
4¡¢ ½¨Á¢·¢ËÍÊý¾ÝÄ£¿é£¨verilog£©
81DataInTXWR·¢ËÍÊý¾ÝÄ£¿éCLKModBUSY1111
ͼ5-3 ·¢ËÍÊý¾ÝÄ£¿é
? ¹¦ÄÜ˵Ã÷£º
a¡¢ DataIn£º·¢ËÍÊý¾ÝÊäÈë¡¢8bits£»
b¡¢ WR£º¿ØÖÆÊý¾ÝдÈ룬1bit£»ÉÏÉýÑØËø´æÊäÈëÊý¾Ý£»Ð´ÈëºóÏÂÒ»¸öCLKÉÏÉýÑØ¿ªÊ¼
Á¢¼´·¢ËÍÊý¾Ý
c¡¢ CLK£ºÊ±ÖÓÉäÈ룬¶ÔÓ¦²¨ÌØÂÊʱÖÓ£»
d¡¢ Mod£ºÄ£Ê½ÊäÈ룬0¶ÔÓ¦ÎÞÆæżУÑ飻1¶ÔÓ¦ÓÐÆæżУÑ飻
e¡¢ TX£º´®ÐÐÊý¾ÝÊä³ö£¬Æ½Ê±¸ßµçƽ£¬µ±ÓÐÊý¾ÝÊäÈëºó£¬ÏÂÒ»¸öCLKÉÏÉýÑØ¿ªÊ¼Á¢¼´
·¢ËÍÊý¾Ý£»
f¡¢ BUSY£º¿ÕÏÐָʾ£¬µ±TXÊä³öʱΪ¸ß£¬ÆäËüʱ¼äΪµÍ£» ? ¹ý³Ì˵Ã÷£º
a¡¢ ½¨Á¢VerilogÄ£¿é£» b¡¢ ½¨Á¢Verilog·ÂÕ棻 c¡¢ Ñé֤ģ¿éÕýÈ·ÐÔ£» d¡¢ ¼ÓÈ붥²ãÄ£¿éSerial e¡¢ ½øÐÐÁªºÏÑéÖ¤£»
Ô´´úÂëÈçÏ£º
module TxMod(DataIn, WR, CLK, Mod, TX, BUSY); input [7:0] DataIn; input WR; input CLK; input Mod; output TX; output BUSY; reg Tx=1;
reg Busy=0; reg [7:0]data=0; reg flag=0; reg [3:0]count=1; reg num=0; always @(posedge WR) begin
data<=DataIn; num<=data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+data[7]; flag<=1; end always @(posedge CLK) begin if(flag==1) begin Busy<=1; if(count==1) Tx<=0; else if(count==2) Tx<=data[0]; else if(count==3) Tx<=data[1]; else if(count==4) Tx<=data[2]; else if(count==5) Tx<=data[3]; else if(count==6) Tx<=data[4]; else if(count==7) Tx<=data[5]; else if(count==8) Tx<=data[6]; else if(count==9) Tx<=data[7]; else if(count==10) begin if(Mod==0) Tx<=1; else if(Mod==1) Tx<=num; count<=0; flag<=0; end count<=count+1;