VerilogʵÏÖFSK½âµ÷ ÁªÏµ¿Í·þ

·¢²¼Ê±¼ä : ÐÇÆÚÒ» ÎÄÕÂVerilogʵÏÖFSK½âµ÷¸üÐÂÍê±Ï¿ªÊ¼ÔĶÁf3b59a6cf5335a8102d220a1

VerilogʵÏÖFSK½âµ÷

FSK£¨Frequency-shift keying£©ÆµÒƼü¿ØÊÇÀûÓÃÔز¨µÄƵÂʱ仯À´´«µÝÊý×ÖÐÅÏ¢¡£ËüÊÇÀûÓûù´øÊý×ÖÐźÅÀëɢȡֵÌصãÈ¥¼ü¿ØÔز¨ÆµÂÊÒÔ´«µÝÐÅÏ¢µÄÒ»ÖÖÊý×Öµ÷ÖƼ¼Êõ¡£FSK½âµ÷¾ÍÊǽ«ÆµÂÊÐźÅת»»³ÉÊý×ÖÐźţ¬Íê³ÉƵÂÊ-·ù¶Èת»»µÄ¹ý³Ì¡£±¾ÎĽéÉÜÀûÓÃVerilogÓ²¼þÃèÊöÓïÑÔʵÏÖµ÷ÖƵç·¡£

Ò»¡¢Ô­Àí·ÖÎö

2FSKÐźÅÊÇÓÃÔز¨ÆµÂʵı仯À´±íÕ÷±»´«ÐÅÏ¢µÄ״̬µÄ£¬±»½âµ÷²¨µÄƵÂÊËæ¶þ½øÖÆÐòÁÐ0¡¢1״̬¶ø±ä»¯¡£Èçͼ1£¬µ±ÊäÈëÐźÅƵÂʸßʱ£¬Êä³öÐźÅΪ1£»µ±ÊäÈëÐźÅƵÂʵÍʱ£¬Êä³öÐźÅΪ0¡£

ͼ1 µ÷ÖÆÊäÈëÐźÅÓëÊä³öÐźÅ

¶þ¡¢ÐźÅÒªÇóÓëÖ¸±ê

ÔÚFSK½âµ÷ʱ£¬ÐèÒª¸øÊäÈëÐźŵÄƵÂÊ»®·Ö¸ßƵÂʶκ͵ÍƵÂʶΣ¬À´Çø·Ö½âµ÷ºó¶þ½øÖÆ״̬1»ò0¡£ÎªÁ˼ò±ãÆð¼û£¬±¾Îĸø³öµÄÊäÈëÐźÅΪ·½²¨Ðźţ¬ÕâÀïȡÿ12¸öclkʱÖÓÐźźóΪһ¸ö²ÉÑùµã£¬Ã¿´Î²ÉÑùʱÈç¹ûÊäÈëÐźŵÄÉÏÉýÑØÊý´óÓÚµÈÓÚ3£¬Êä³öÐźż´Îª1£»·´Ö®£¬Êä³öÐźż´Îª0¡£

Èý¡¢VerilogÉè¼Æ·½°¸

ͨ¹ý¶ÔclkÉÏÉýÑغÍcinÉÏÉýÑؼÆÊý£¬cntΪclk¼ÆÊýÆ÷£¬¶øcountΪcinµÄ¼ÆÊýÆ÷£¬µ±cnt==11ʱ£¬²é¿´countµÄÖµ£¬Èç¹û´óÓÚµÈÓÚ3£¬ÄÇô´Ëʱ¼ì²âµ½µÄ¾ÍÊǸßƵÂÊÊäÈëÐźţ¬ËùÒÔ´ËʱcoutÊä³ö¸ßµçƽ1£¬·ñÔòÊä³öµÍµçƽ0¡£ÕâÑù¾ÍÍê³ÉÁËƵÂÊ-·ù¶Èת»»£¬°Ñ¸ßƵÂʺ͵ÍƵÂÊÀûÓ÷ù¶ÈÉÏÇø·Ö¿ªÀ´£¬»Ö¸´ÁËÊý×ÖÐźš£

ËÄ¡¢Verilog´úÂë

ʵÏÖFSK½âµ÷µÄ´úÂëÈçÏ£¨ÓдúÂë×¢ÊÍ£©£º //½âµ÷Ä£¿é

module fsk(cin,clk,start,cout); input cin,clk,start;

output cout; reg cout;

reg[3:0]cnt; //¶Ôclk¼ÆÊý reg[2:0]count; //¶Ôcin¼ÆÊý reg ec; //ͬ²½¼ÆÊý initial ec=1'b0; initial cnt=4'b0; initial count=3'b0; initial cout<=0;

always@(posedge clk or posedge start) //¶Ôclk¼ÆÊý begin

if(start) //¿ªÆôÐźŠbegin

cnt<=0; ec<=1'b1; end else begin

if(cnt==11) //ÿ12¸öclkÖÜÆÚºóÓÐÒ»¸ö²ÉÑùµã begin cnt<=0;

ec<=1'b1; //²ÉÑùµã״̬ end else begin

cnt<=cnt+1; //clk¼ÆÊý ec<=1'b0; end end end

always@(posedge cin or posedge ec) //¶Ôcin¼ÆÊý begin

if(ec)

count<=0; //²ÉÑùºó¼ÆÊýÇåÁã else

count<=count+1; //cin¼ÆÊý end

always@(count or cnt) begin

if(cnt==11)

cout<=(count>=3)?1:0; //²ÉÑùµãʱƵÂʸßΪ1ƵÂʵÍΪ0 end

endmodule

Îå¡¢Âß¼­·ÂÕæ

ÀûÓÃModelsim¶Ô´úÂë½øÐзÂÕæ¡£²âÊÔÐźÅΪһ¸öµÍƵ¸ßƵ½»Ìæ±ä»¯µÄ·½²¨Ðźţ¬Ê×Ïȱàд²âÊÔ´úÂëÈçÏ£º //²âÊÔÄ£¿é

`timescale 1ns/1ns

`include \module fsktest; reg cin,clk,start; wire cout;

initial //²úÉúʱÖÓÐźŠbegin clk=1; forever

#10 clk=~clk; end

initial //²úÉú¿ªÆôÐźŠbegin start=1; #5 start=0; end

initial //²úÉúcin²âÊÔÐźŠbegin cin=0; repeat(8) begin repeat(12) #20 cin=~cin; repeat(4)

#60 cin=~cin; end end

fsk fsk1(.cin(cin),.clk(clk),.start(start),.cout(cout)); endmodule

ÀûÓù¤¾ßModelsim±àÒ룬½âµ÷Ä£¿éºÍ²âÊÔÄ£¿é¾ùûÓдíÎ󣬱àÒë³É¹¦¡£Èçͼ2¡£

ͼ2 ±àÒë

½ÓÏÂÀ´½øÐзÂÕ棬¸ø³östart¡¢cin¡¢coutÐźÅËæclkÐźű仯µÄ²¨ÐÎͼ£¬Èçͼ

3¡£

ͼ3 ·ÂÕ沨ÐÎͼ

´Ó²¨ÐÎͼÉÏ¿ÉÒÔ¿´³ö£¬µ±²âÊÔÐźÅƵÂʸßʱ£¬¾­½âµ÷ºóµÄÊä³öÐźÅΪ1£»µ±²âÊÔÐźÅƵÂʵÍʱ£¬¾­½âµ÷ºóµÄÊä³öÐźÅΪ0¡£µ«ÊÇ»áÓÐÒ»¸ö²ÉÑùÖÜÆÚµÄÑÓ³Ù£¬¾ÍÊÇ˵½âµ÷ºóÐźűÈÊäÈëÐźÅÂýÒ»¸ö²ÉÑùÖÜÆÚ¡£µ«×ܵÄÀ´Ëµ£¬±¾ÎĽéÉܵÄÀûÓÃVerilogÓ²¼þÃèÊöÓïÑÔ±àдµÄFSK½âµ÷µç·»ù±¾Íê³ÉµÄ¶ÔFSKµÄ½âµ÷¡£

Áù¡¢×ÛºÏ

¶Ô·ÂÕæÍêµÄ½âµ÷Ä£¿é½øÐÐ×ۺϣ¬ÀûÓù¤¾ßDesign Compiler¡£×ۺϺóµç·ͼÈçͼ4¡£

ͼ4 ×ۺϺóµç·ͼ

×ۺϺóÉú³ÉÂß¼­Íø±íÈçÏ£º module fsk ( cin, clk, start, cout ); input cin, clk, start; output cout;

wire N9, N10, N11, N15, N16, N18, N19, n7, n8, n11, n12, n13, n14, n15, n16, n17, n18, n19, n20, n21; wire [3:0] cnt; wire [2:0] count;

LD1 cout_reg ( .D(N15), .G(N16), .Q(cout) );

FD2 \\count_reg[0] ( .D(n13), .CP(cin), .CD(n8), .Q(count[0]), .QN(n13) ); FD2 \\count_reg[1] ( .D(N18), .CP(cin), .CD(n8), .Q(count[1]), .QN(n16) ); FD2 \\count_reg[2] ( .D(N19), .CP(cin), .CD(n8), .Q(count[2]) );

FD2 \\cnt_reg[0] ( .D(n11), .CP(clk), .CD(n7), .Q(cnt[0]), .QN(n11) );