![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 七嘴八舌異言堂
(https://www.pcdvd.com.tw/forumdisplay.php?f=12)
- - 求助除頻器程式解釋
(https://www.pcdvd.com.tw/showthread.php?t=827457)
|
---|
求助除頻器程式解釋
各位大大 小弟我有一個煩惱 請各方高手幫忙解決
我所使用的是verilog印體描述語言 我不知如何解釋除頻器的程式 (這是處理音樂的除頻器) 程式如下 parameter REF_CLK = 18432000; // 18.432 MHz parameter SAMPLE_RATE = 48000; // 48 KHz parameter DATA_WIDTH = 16; // 16 Bits parameter CHANNEL_NUM = 2; // Dual Channel parameter SIN_SAMPLE_DATA = 48; // Internal Registers and Wires reg [3:0] BCK_DIV; reg [8:0] LRCK_1X_DIV; reg [7:0] LRCK_2X_DIV; reg [6:0] LRCK_4X_DIV; reg [3:0] SEL_Cont; //////// DATA Counter //////// reg [5:0] SIN_Cont; //////////// Input Source Number ////////////// parameter SIN_SANPLE = 0; //////////// AUD_BCK Generator ////////////// always@(posedge iCLK_18_4 or negedge iRST_N) begin if(!iRST_N) begin BCK_DIV <= 0; oAUD_BCK <= 0; end else begin if(BCK_DIV >= REF_CLK/(SAMPLE_RATE*DATA_WIDTH*CHANNEL_NUM*2)-1 ) begin BCK_DIV <= 0; oAUD_BCK <= ~oAUD_BCK; end else BCK_DIV <= BCK_DIV+1; end end //////////// AUD_LRCK Generator ////////////// always@(posedge iCLK_18_4 or negedge iRST_N) begin if(!iRST_N) begin LRCK_1X_DIV <= 0; LRCK_2X_DIV <= 0; LRCK_4X_DIV <= 0; LRCK_1X <= 0; LRCK_2X <= 0; LRCK_4X <= 0; end else begin // LRCK 1X if(LRCK_1X_DIV >= REF_CLK/(SAMPLE_RATE*2)-1 ) begin LRCK_1X_DIV <= 0; LRCK_1X <= ~LRCK_1X; end else LRCK_1X_DIV <= LRCK_1X_DIV+1; // LRCK 2X if(LRCK_2X_DIV >= REF_CLK/(SAMPLE_RATE*4)-1 ) begin LRCK_2X_DIV <= 0; LRCK_2X <= ~LRCK_2X; end else LRCK_2X_DIV <= LRCK_2X_DIV+1; // LRCK 4X if(LRCK_4X_DIV >= REF_CLK/(SAMPLE_RATE*8)-1 ) begin LRCK_4X_DIV <= 0; LRCK_4X <= ~LRCK_4X; end else LRCK_4X_DIV <= LRCK_4X_DIV+1; end end assign oAUD_LRCK = LRCK_1X; ////////////////////////////////////////////////// ////////// Sin LUT ADDR Generator ////////////// always@(negedge LRCK_1X or negedge iRST_N) begin if(!iRST_N) SIN_Cont <= 0; else begin if(SIN_Cont < SIN_SAMPLE_DATA-1 ) SIN_Cont <= SIN_Cont+1; else SIN_Cont <= 0; end end 我看得懂每一行的計算在上面都有參數 但每一個參數的定義是??? 比如18.432 MHz好像是除出來的數 但是做啥用的我就不懂了 還有位啥要乘2 如何把程式連貫起來 是我現在的難題 希望有人能幫幫我 說一段程式也可以 或是替我解釋一下整個流程 小弟我感激不盡 謝謝 (大哭) |
參數REF_CLK = 18432000 ; / / 18.432兆赫
參數SAMPLE_RATE = 48000 ; / / 48千赫 參數DATA_WIDTH = 16 ; / / 16位 參數CHANNEL_NUM = 2 ; / /雙通道 參數SIN_SAMPLE_DATA = 48 ; / /內部寄存器和電線 64347 [三點00 ] BCK_DIV ; 64347 [ 8點] LRCK_1X_DIV ; 64347 [ 7點] LRCK_2X_DIV ; 64347 [ 6點] LRCK_4X_DIV ; 64347 [三點00 ] SEL_Cont ; ////////數據反//////// 64347 [ 5點00分] SIN_Cont ; ////////////輸入源數量////////////// 參數SIN_SANPLE = 0 ; //////////// AUD_BCK發電機////////////// 總是@ ( posedge iCLK_18_4或negedge iRST_N ) 開始 如果( ! iRST_N ) 開始 BCK_DIV “ = 0 ; oAUD_BCK “ = 0 ; 末端 其他的 開始 如果( BCK_DIV “ = REF_CLK / ( SAMPLE_RATE * DATA_WIDTH * CHANNEL_NUM * 2 ) -1 ) 開始 BCK_DIV “ = 0 ; oAUD_BCK “ = ∼ oAUD_BCK ; 末端 其他的 BCK_DIV “ = BCK_DIV 1 ; 末端 末端 //////////// AUD_LRCK發電機////////////// 總是@ ( posedge iCLK_18_4或negedge iRST_N ) 開始 如果( ! iRST_N ) 開始 LRCK_1X_DIV “ = 0 ; LRCK_2X_DIV “ = 0 ; LRCK_4X_DIV “ = 0 ; LRCK_1X “ = 0 ; LRCK_2X “ = 0 ; LRCK_4X “ = 0 ; 末端 其他的 開始 / / LRCK 1X網絡 如果( LRCK_1X_DIV “ = REF_CLK / ( SAMPLE_RATE * 2 ) -1 ) 開始 LRCK_1X_DIV “ = 0 ; LRCK_1X “ = ∼ LRCK_1X ; 末端 其他的 LRCK_1X_DIV “ = LRCK_1X_DIV 1 ; / / LRCK 2倍 如果( LRCK_2X_DIV “ = REF_CLK / ( SAMPLE_RATE * 4 ) -1 ) 開始 LRCK_2X_DIV “ = 0 ; LRCK_2X “ = ∼ LRCK_2X ; 末端 其他的 LRCK_2X_DIV “ = LRCK_2X_DIV 1 ; / / LRCK 8472 如果( LRCK_4X_DIV “ = REF_CLK / ( SAMPLE_RATE * 8 ) -1 ) 開始 LRCK_4X_DIV “ = 0 ; LRCK_4X “ = ∼ LRCK_4X ; 末端 其他的 LRCK_4X_DIV “ = LRCK_4X_DIV 1 ; 末端 末端 轉讓oAUD_LRCK = LRCK_1X ; ////////////////////////////////////////////////// //////////黃大仙LUT的地址發生器////////////// 總是@ ( negedge LRCK_1X或negedge iRST_N ) 開始 如果( ! iRST_N ) SIN_Cont “ = 0 ; 其他的 開始 如果( SIN_Cont “ SIN_SAMPLE_DATA - 1 ) SIN_Cont “ = SIN_Cont 1 ; 其他的 SIN_Cont “ = 0 ; 末端 末端 黃大仙 :shock: :eek: :laugh: :laugh: :laugh: |
很感謝"地海巫師"的翻譯 但我要的事如何把程式連貫起來
比如 (我是聽我老師說的) 1.18.432 MHz好像是除頻器除出來的數 要做啥用的我忘了 2.乘2 好像是為了對應 送進來的頻率 在計數器上好像有X1 X2 X4計數器 要詳細說明 對我有點困難 3.這3對程式 BCK_DIV >= REF_CLK/(SAMPLE_RATE*DATA_WIDTH*CHANNEL_NUM*2)-1 // LRCK 1X if(LRCK_1X_DIV >= REF_CLK/(SAMPLE_RATE*2)-1 ) // LRCK 2X if(LRCK_2X_DIV >= REF_CLK/(SAMPLE_RATE*4)-1 ) // LRCK 4X if(LRCK_4X_DIV >= REF_CLK/(SAMPLE_RATE*8)-1 ) if(SIN_Cont < SIN_SAMPLE_DATA-1 ) 這幾段程式是做啥用的阿 天殺 我只會把摻數加入然後計算 ?? 有人跟我說只要做出波形就可以知道是做啥的 但我不會用波形 我不知道他的輸入輸出 要設定多少?? 希望有高手能幫我解決 或是想要一起討論的 也可以留下您的MSN 大家一起進步ㄅ 謝謝 |
所有的時間均為GMT +8。 現在的時間是07:18 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。