- module music_ctrl
- (
- input SysClk ,
- input Rst ,
- input Rx ,
- output Tx ,
- input MusicCtrlValid ,
- input [7:0] MusicCtrlData
- );
- wire RxClk;
- wire ByteRxDone;
- wire [7:0] ByteRx;
- reg ByteRxRdDone;
- wire TxClk;
- reg TxTriger;
- wire ByteTxDone;
- wire [7:0] ByteTx;
-
-
-
-
- uart_top #
- (
- .sys_clk_freq ( 50000000 ),
- .baud_rate ( 9600 )
- )
- uart_top
- (
- .Rs232SetRst ( Rst ),
- .Rs232RxRst ( Rst ),
- .Rs232TxRst ( Rst ),
- //
- .SysClk ( SysClk ),
- //
- .rx ( Rx ),
- .tx ( Tx ),
- //
- .RxClk ( RxClk ),
- .ByteRxDone ( ByteRxDone),
- .ByteRx ( ByteRx),
- .ByteRxRdDone ( ByteRxRdDone),
- //
- .TxClk ( TxClk),
- .TxTriger ( TxTriger),
- .ByteTxDone ( ByteTxDone),
- .ByteTx ( ByteTx)
- );
-
-
-
-
-
- localparam TX_IDLE = 4'd0 ;
- localparam SEND_1ST_BYTE = 4'd1 ;
- localparam SEND_1ST_BYTE_WAIT = 4'd2 ;
- localparam SEND_2ST_BYTE = 4'd3 ;
- localparam SEND_2ST_BYTE_WAIT = 4'd4 ;
- localparam SEND_3ST_BYTE = 4'd5 ;
- localparam SEND_3ST_BYTE_WAIT = 4'd6 ;
- localparam SEND_4ST_BYTE = 4'd7 ;
- localparam SEND_4ST_BYTE_WAIT = 4'd8 ;
-
- reg [3:0] SendSm;
- reg [31:0] SendData;
-
-
-
- //MusicCtrlData[7] : 1 music operation, button up
- //MusicCtrlData[6] : falling edge, play current music; rising edge, stop current music;
- //MusicCtrlData[5] : select music or vol, up is music.
- //MusicCtrlData[4] : falling edge, next music;music vol+;
- //MusicCtrlData[3] : falling edge, last music;music vol-;
-
-
- reg MusicCtrlDatabit6D1;
- reg MusicCtrlDatabit4D1;
- reg MusicCtrlDatabit3D1;
-
-
- always [url=home.php?mod=space&uid=72445]@[/url] ( posedge TxClk )
- begin
- MusicCtrlDatabit6D1 <= MusicCtrlData[6] ;
- MusicCtrlDatabit4D1 <= MusicCtrlData[4];
- MusicCtrlDatabit3D1 <= MusicCtrlData[3];
- end
-
- always @ ( posedge TxClk )
- begin
- if( Rst ) SendSm <= TX_IDLE;
- else
- case( SendSm )
- TX_IDLE : if( MusicCtrlData[7] )
- begin
- if( MusicCtrlDatabit6D1 != MusicCtrlData[6] ) SendSm <= SEND_1ST_BYTE;
- else if( ~MusicCtrlData[4] & MusicCtrlDatabit4D1 ) SendSm <= SEND_1ST_BYTE;
- else if( ~MusicCtrlData[3] & MusicCtrlDatabit3D1 ) SendSm <= SEND_1ST_BYTE;
- end
-
-
-
- SEND_1ST_BYTE : SendSm <= SEND_1ST_BYTE_WAIT;
- SEND_1ST_BYTE_WAIT : if( ByteTxDone ) SendSm <= SEND_2ST_BYTE;
- SEND_2ST_BYTE : SendSm <= SEND_2ST_BYTE_WAIT;
- SEND_2ST_BYTE_WAIT : if( ByteTxDone ) SendSm <= SEND_3ST_BYTE;
- SEND_3ST_BYTE : SendSm <= SEND_3ST_BYTE_WAIT;
- SEND_3ST_BYTE_WAIT : if( ByteTxDone ) SendSm <= SEND_4ST_BYTE;
- SEND_4ST_BYTE : SendSm <= SEND_4ST_BYTE_WAIT;
- SEND_4ST_BYTE_WAIT : if( ByteTxDone ) SendSm <= TX_IDLE;
- default : ;
- endcase
- end
-
-
- //localparam CHECK_PLAY_CMD = 32'haa0100ab;
- localparam PLAY_CMD = 32'haa0200ac;
- localparam STOP_CMD = 32'haa0400ae;
- localparam LAST_CMD = 32'haa0500af;
- localparam NEXT_CMD = 32'haa0600b0;
- localparam VOLU_CMD = 32'haa1400be;
- localparam VOLD_CMD = 32'haa1500bf;
- //localparam CHECK_DISK_CMD = 32'haa0900b3;
- //localparam CHECK_DISK_PLAY_CMD = 32'haa0a00b4;
- //localparam CHECK_MUSIC_TOTAL_CMD = 32'haa0c00b6;
- //localparam CHECK_MUSIC_CUR_CMD = 32'haa0d00b7;
-
-
- assign ByteTx = SendData[31:24];
-
- always @ ( posedge TxClk )
- begin
- case( SendSm )
- TX_IDLE : begin TxTriger <= 1'b0; SendData <= 32'b0; end
- SEND_1ST_BYTE : begin
- TxTriger <= 1'b1;
- if( MusicCtrlData[6] ) SendData <= STOP_CMD;
-
- else if( ~MusicCtrlData[4] )
- begin
- if( MusicCtrlData[5] ) SendData <= LAST_CMD;
- else SendData <= VOLU_CMD;
- end
-
- else if( ~MusicCtrlData[3] )
- begin
- if( MusicCtrlData[5] ) SendData <= NEXT_CMD;
- else SendData <= VOLD_CMD;
- end
-
- else SendData <= PLAY_CMD;
-
- end
- SEND_2ST_BYTE : begin TxTriger <= 1'b1; SendData <= {SendData[23:0],8'b0}; end
- SEND_3ST_BYTE : begin TxTriger <= 1'b1; SendData <= {SendData[23:0],8'b0}; end
- SEND_4ST_BYTE : begin TxTriger <= 1'b1; SendData <= {SendData[23:0],8'b0}; end
- default : TxTriger <= 1'b0;
- endcase
- end
- endmodule
- //------------------------------------------------------------------------------------------------
- //------------------------------------------------------------------------------------------------
- module uart_top #
- (
- parameter sys_clk_freq = 50000000,
- parameter baud_rate = 115200
- )
- (
- //system signal
- input Rs232SetRst,
- input Rs232RxRst,
- input Rs232TxRst,
- //
- input SysClk ,
- //
- input rx,
- output tx,
- output RxClk,
- output TxClk,
- output ByteRxDone,
- output [7:0] ByteRx,
- input ByteRxRdDone,
- input TxTriger,
- output ByteTxDone,
- input [7:0] ByteTx
- );
-
-
- /*
- wire [7:0] ByteRx;
- reg [4:0] cnt1;
- wire TxTrigerAux;
- always @ (posedge RxClk)
- begin
- if(Rs232RxRst) cnt1 <= 5'd0;
- else if(cnt1 == 5'd25) cnt1 <= 5'd0;
- else if(cnt1 != 5'd0) cnt1 <= cnt1 + 1;
- else if(ByteRxDone) cnt1 <= cnt1 + 1;
- end
-
-
- assign TxTrigerAux = (cnt1 != 5'd0) ? 1'b1 :1'b0;
-
- reg TxTrigerAuxD1,TxTrigerAuxD2,TxTrigerAuxD3;
- reg [7:0] ByteRxD1,ByteRxD2;
-
-
- always @ (posedge TxClk)
- begin
- TxTrigerAuxD1 <= TxTrigerAux;
- TxTrigerAuxD2 <= TxTrigerAuxD1;
- TxTrigerAuxD3 <= TxTrigerAuxD2;
- ByteRxD1 <= ByteRx;
- ByteRxD2 <= ByteRxD1;
- end
-
- wire TxTriger = ~TxTrigerAuxD3 & TxTrigerAuxD2;
- wire [7:0] ByteTx = ByteRxD2;
-
-
- reg TxTrigerD1, TxTrigerD2 , TxTrigerD3;
- always @ (posedge RxClk)
- begin
- TxTrigerD1 <= TxTriger;
- TxTrigerD2 <= TxTrigerD1;
- TxTrigerD3 <= TxTrigerD2;
- end
-
- wire ByteRxRdDone = TxTrigerD3 & ~TxTrigerD2;
-
- */
-
-
-
-
- //------------------------------------------------------------------------------------------------
- uart_sets #
- (
- .sys_clk_freq ( sys_clk_freq ),
- .baud_rate ( baud_rate )
- )
- uart_system_setting
- (
- .sys_clk ( SysClk ),
- .rst ( Rs232SetRst ),
- .rx_clk ( RxClk ),
- .tx_clk ( TxClk )
- );
- //------------------------------------------------------------------------------------------------
-
-
- //------------------------------------------------------------------------------------------------
- uart_rx uart_rx_logic
- (
- .clk16x ( RxClk ),
- .rst ( Rs232RxRst ),
- .rx_data ( rx ),
- .ByteRxDone ( ByteRxDone ),
- .ByteRx ( ByteRx ),
- .ByteRxRdDone ( ByteRxRdDone )
- );
- //------------------------------------------------------------------------------------------------
-
-
- //------------------------------------------------------------------------------------------------
- uart_tx uart_tx_logic
- (
- .clk1x ( TxClk ),
- .rst ( Rs232TxRst ),
- .mcu_data ( ByteTx ),
- .TxTriger ( TxTriger ),
- .tx_data ( tx ),
- .ByteTxDone ( ByteTxDone )
- );
- //------------------------------------------------------------------------------------------------
-
-
- endmodule
-
-
-
- module uart_sets
- #
- (
- parameter sys_clk_freq = 50000000,
- parameter baud_rate = 115200
- )
- (
- input sys_clk ,
- input rst,
-
- output rx_clk,
- output tx_clk
- );
- //
-
- //
- reg [15:0] tx_clk_div = 0;
- reg [15:0] rx_clk_div = 0;
- reg tx_clk_r = 0;
- reg rx_clk_r = 0;
- wire [15:0] div_tx;
- wire [15:0] div_rx;
- //the frequecy of sending clock must be the same as baud_rate,
- //"sys_clk_freq/baud_rate" is a divider,
- //"2" means two jump to guarantee the frequecy of tx_clk,
- //"16" is about the protocol of receiving clock in rs232.
- assign div_tx = sys_clk_freq/(baud_rate*2);
- assign div_rx = sys_clk_freq/(baud_rate*2*16);
- assign tx_clk = tx_clk_r;
- assign rx_clk = rx_clk_r;
- //data sending clock
- always @ ( posedge sys_clk )
- begin
- if( rst ) tx_clk_div <= 0;
- else
- begin
- if(tx_clk_div < (div_tx - 1))
- begin
- tx_clk_div <= tx_clk_div + 1'b1;
- tx_clk_r <= tx_clk_r;
- end
- else
- begin
- tx_clk_div <= 0;
- tx_clk_r <= ~tx_clk_r;
- end
- end
- end
- //data receiving clock
- always @ ( posedge sys_clk )
- begin
- if( rst ) rx_clk_div <= 0;
- else
- begin
- if(rx_clk_div < (div_rx - 1))
- begin
- rx_clk_div <= rx_clk_div + 1'b1;
- rx_clk_r <= rx_clk_r;
- end
- else
- begin
- rx_clk_div <= 0;
- rx_clk_r <= ~rx_clk_r;
- end
- end
- end
- endmodule
-
-
-
-
- `timescale 1ns / 1ps
- /////////////////////////////////////////////
- module uart_rx
- (
- input clk16x,
- input rst,
- input rx_data,
- output ByteRxDone,
- output [7:0] ByteRx,
- input ByteRxRdDone
- );
- //
- reg [3 : 0] rx_shift = 0;
- reg frame_valid = 0;
- reg [3 : 0] rx_cnt1 = 0;
- reg sampling7 = 1;
- reg sampling8 = 1;
- reg sampling9 = 1;
- reg [3 : 0] data_cnt = 0;
- reg [7 : 0] rx_buf = 0;
- //
- wire res;
-
- reg ByteRxDoneReg = 0;
- reg [7:0] ByteRxReg;
- //------------------------------------------------------------------------------------------------
- //res shifter
- always @ (posedge clk16x)
- begin
- if(rst) rx_shift <= 4'b0;
- else if(frame_valid ) rx_shift <= 4'b0;
- else rx_shift <= {rx_shift[2:0],rx_data};
- end
-
-
-
- //frame valid
- always @ (posedge clk16x)
- begin
- if(rst) frame_valid <= 1'b0;
- else if(rx_shift == 4'b1100) frame_valid <= 1'b1;
- else if(data_cnt == 4'd9) frame_valid <= 1'b0;
- end
- //------------------------------------------------------------------------------------------------
-
-
-
- //------------------------------------------------------------------------------------------------
- //---------------------------------------data sampling--------------------------------------------
-
- //bit sampling counter
- always @ (posedge clk16x)
- begin
- if(rst) rx_cnt1 <= 4'd0;
- else if( frame_valid ) rx_cnt1 <= rx_cnt1 + 1'b1;
- else rx_cnt1 <= 4'd0;
- end
-
-
- always @ (posedge clk16x)
- begin
- if(rst) begin
- sampling7 <= 1;
- sampling8 <= 1;
- sampling9 <= 1;
- end
- else if(rx_cnt1 == 4'd6) sampling7 <= rx_data;
- else if(rx_cnt1 == 4'd7) sampling8 <= rx_data;
- else if(rx_cnt1 == 4'd8) sampling9 <= rx_data;
- end
- //caculate the sampling result
- assign res = (sampling7&&sampling8)^(sampling8&&sampling9)
- ^(sampling7&&sampling9);
- //------------------------------------------------------------------------------------------------
-
- //------------------------------------------------------------------------------------------------
- //--------------------------------------data receive----------------------------------------------
- always @ (posedge clk16x)
- begin
- if(rst) data_cnt <= 4'd0;
- else if(frame_valid)
- begin
- if(&rx_cnt1) data_cnt <= data_cnt + 1'b1;
- end
- else data_cnt <= 4'd0;
- end
-
-
- //read interrupt
- assign ByteRxDone = ByteRxDoneReg;
- always @ (posedge clk16x)
- begin
- if(rst) ByteRxDoneReg <= 0;
- else if( (data_cnt == 4'd8) && (rx_cnt1 == 4'd11) ) ByteRxDoneReg <= 1;
- else ByteRxDoneReg <= 0;
- end
-
-
- //rx_buf
- //when frame_valid is high, and data_cnt count as "0",
- //it is the frame start bit "0"
- assign ByteRx = ByteRxReg;
- always @ (posedge clk16x)
- begin
- if(rst) rx_buf <= 8'd0;
- else if( frame_valid )
- begin
- if( data_cnt != 4'b0 )
- begin
- if(rx_cnt1 == 4'd10) rx_buf <= {res, rx_buf[7:1]};
- end
- end
- end
-
-
-
- always @ (posedge clk16x)
- begin
- if(rst) ByteRxReg <= 8'd0;
- else if(ByteRxRdDone) ByteRxReg <= 8'd0;
- else if( frame_valid )
- begin
- if( data_cnt == 4'd8 )
- begin
- if(rx_cnt1 == 4'd11) ByteRxReg <= rx_buf;
- end
- end
- end
-
- //assign chipscope_bus = { 213'b0 ,res , rx_buf,rx_cnt1,data_cnt,frame_valid};
-
-
- endmodule