⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 send_test.v.bak

📁 串口通讯
💻 BAK
字号:
/*
2007-11-12 9:48
串口 发射模块

注意事项:晶振频率以及波特率选择
*/


// RS-232 TX module
// (c) fpga4fun.com KNJN LLC - 2003, 2004, 2005, 2006

//`define DEBUG   // in DEBUG mode, we output one bit per clock cycle (useful for faster simulations)

//module clk_test(clk, TxD_start, TxD_data, TxD, TxD_busy);

//`define	DEBUG_SIMULATION

module send_test(clk,  TxD_data, TxD, TxD_busy,TxD_start);
input clk, TxD_start;
//input clk;
input [7:0] TxD_data;
output TxD, TxD_busy;
//output	TxD_start; 

// 仿真使用  降低系统时钟
`ifdef  DEBUG_SIMULATION	
	parameter ClkFrequency = 50_000;	
`else
	parameter ClkFrequency = 50_000_000;	// 50MHz
`endif

parameter Baud = 1200;
parameter RegisterInputData = 1;	
// in RegisterInputData mode, 
//the input doesn't have to stay valid 
//while the character is been transmitted

integer		count_temp;
//reg	TxD_start;

/*parameter		TIME_SEND = 30_00;

always @(posedge clk)
begin
	if(count_temp == TIME_SEND)
	begin
		count_temp = 0;
		TxD_start = ~TxD_start;
	end
		 
	else
		count_temp = count_temp + 1;
		
end
*/

// Baud generator
parameter BaudGeneratorAccWidth = 16;
reg [BaudGeneratorAccWidth:0] BaudGeneratorAcc;
`ifdef DEBUG
wire [BaudGeneratorAccWidth:0] BaudGeneratorInc = 17'h10000;
`else
wire [BaudGeneratorAccWidth:0] BaudGeneratorInc = ((Baud<<(BaudGeneratorAccWidth-4))+(ClkFrequency>>5))/(ClkFrequency>>4);
`endif

wire BaudTick = BaudGeneratorAcc[BaudGeneratorAccWidth];
wire TxD_busy;
always @(posedge clk) if(TxD_busy) BaudGeneratorAcc <= BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + BaudGeneratorInc;

// Transmitter state machine
reg [3:0] state;
wire TxD_ready = (state==0);
assign TxD_busy = ~TxD_ready;

reg [7:0] TxD_dataReg;
always @(posedge clk) 
	if(TxD_ready & TxD_start) 
		TxD_dataReg <= TxD_data;
		
wire [7:0] TxD_dataD = RegisterInputData ? TxD_dataReg : TxD_data;

always @(posedge clk)
case(state)
	4'b0000: if(TxD_start) state <= 4'b0001;
	4'b0001: if(BaudTick) state <= 4'b0100;
	4'b0100: if(BaudTick) state <= 4'b1000;  // start
	4'b1000: if(BaudTick) state <= 4'b1001;  // bit 0
	4'b1001: if(BaudTick) state <= 4'b1010;  // bit 1
	4'b1010: if(BaudTick) state <= 4'b1011;  // bit 2
	4'b1011: if(BaudTick) state <= 4'b1100;  // bit 3
	4'b1100: if(BaudTick) state <= 4'b1101;  // bit 4
	4'b1101: if(BaudTick) state <= 4'b1110;  // bit 5
	4'b1110: if(BaudTick) state <= 4'b1111;  // bit 6
	4'b1111: if(BaudTick) state <= 4'b0010;  // bit 7
	4'b0010: if(BaudTick) state <= 4'b0011;  // stop1
	4'b0011: if(BaudTick) state <= 4'b0000;  // stop2
	default: if(BaudTick) state <= 4'b0000;
endcase

// Output mux
reg muxbit;
always @( state[2:0] )
case(state[2:0])
	/*3'd0: muxbit <= TxD_dataD[0];
	3'd1: muxbit <= TxD_dataD[1];
	3'd2: muxbit <= TxD_dataD[2];
	3'd3: muxbit <= TxD_dataD[3];
	3'd4: muxbit <= TxD_dataD[4];
	3'd5: muxbit <= TxD_dataD[5];
	3'd6: muxbit <= TxD_dataD[6];
	3'd7: muxbit <= TxD_dataD[7];
	*/
// 测试用 发送固定码 0
	3'd0: muxbit <= 1;
	3'd1: muxbit <= 1;
	3'd2: muxbit <= 0;
	3'd3: muxbit <= 0;
	3'd4: muxbit <= 1;
	3'd5: muxbit <= 1;
	3'd6: muxbit <= 0;
	3'd7: muxbit <= 0;
	
endcase

// Put together the start, data and stop bits
reg TxD;
always @(posedge clk) TxD <= (state<4) | (state[3] & muxbit);  
// register the output to make it glitch free

endmodule
//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -