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

📄 uart_regs.v

📁 uart16550 IP核 HDL源代码
💻 V
📖 第 1 页 / 共 2 页
字号:
begin	if (wb_rst_i)		msi_reset <= #1 0;	else	if (msi_reset)		msi_reset <= #1 0;	else	if (wb_re_i && wb_addr_i == `UART_REG_MS)		msi_reset <= #1 1; // reset bits in Modem Status Registerend// threi_clear signal handlingalways @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)		threi_clear <= #1 0;	else	if (threi_clear && !lsr[`UART_LS_TFE] && (tf_count==0)) // reset clear flag when tx fifo clears		threi_clear <= #1 0;	else	if (wb_re_i && wb_addr_i == `UART_REG_II)		threi_clear <= #1 1; // reset bits in Modem Status Registerend////   WRITES AND RESETS   ////// Line Control Registeralways @(posedge clk or posedge wb_rst_i)	if (wb_rst_i)		lcr <= #1 8'b00000011; // 8n1 setting	else	if (wb_we_i && wb_addr_i==`UART_REG_LC)		lcr <= #1 wb_dat_i;// Interrupt Enable Register or UART_DL2always @(posedge clk or posedge wb_rst_i)	if (wb_rst_i)	begin		ier <= #1 4'b0000; // no interrupts after reset		dl[`UART_DL2] <= #1 8'b0;	end	else	if (wb_we_i && wb_addr_i==`UART_REG_IE)		if (dlab)		begin			dl[`UART_DL2] <= #1 wb_dat_i;		end		else			ier <= #1 wb_dat_i[3:0]; // ier uses only 4 lsb// FIFO Control Register and rx_reset, tx_reset signalsalways @(posedge clk or posedge wb_rst_i)	if (wb_rst_i) begin		fcr <= #1 2'b11; 		rx_reset <= #1 0;		tx_reset <= #1 0;	end else	if (wb_we_i && wb_addr_i==`UART_REG_FC) begin		fcr <= #1 wb_dat_i[7:6];		rx_reset <= #1 wb_dat_i[1];		tx_reset <= #1 wb_dat_i[2];	end else begin // clear rx_reset, tx_reset signals when not written to		rx_reset <= #1 0;		tx_reset <= #1 0;	end// Modem Control Registeralways @(posedge clk or posedge wb_rst_i)	if (wb_rst_i)		mcr <= #1 5'b0; 	else	if (wb_we_i && wb_addr_i==`UART_REG_MC)			mcr <= #1 wb_dat_i[4:0];// TX_FIFO or UART_DL1always @(posedge clk or posedge wb_rst_i)	if (wb_rst_i)	begin		dl[`UART_DL1]  <= #1 8'b0;		tf_push   <= #1 1'b0;		start_dlc <= #1 1'b0;	end	else	if (wb_we_i && wb_addr_i==`UART_REG_TR)		if (dlab)		begin			dl[`UART_DL1] <= #1 wb_dat_i;			start_dlc <= #1 1'b1; // enable DL counter			tf_push <= #1 1'b0;		end		else		begin			tf_push   <= #1 1'b1;			start_dlc <= #1 1'b0;		end	else	begin		start_dlc <= #1 1'b0;		tf_push   <= #1 1'b0;	end// Receiver FIFO trigger level selection logic (asynchronous mux)always @(fcr[`UART_FC_TL])	case (fcr[`UART_FC_TL])		2'b00 : trigger_level = 1;		2'b01 : trigger_level = 4;		2'b10 : trigger_level = 8;		2'b11 : trigger_level = 14;	endcase	////  STATUS REGISTERS  ////// Modem Status Registeralways @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)		msr <= #1 0;	else begin		msr[`UART_MS_DDCD:`UART_MS_DCTS] <= #1 msi_reset ? 4'b0 :			msr[`UART_MS_DDCD:`UART_MS_DCTS] | ({dcd, ri, dsr, cts} ^ msr[`UART_MS_CDCD:`UART_MS_CCTS]);		msr[`UART_MS_CDCD:`UART_MS_CCTS] <= #1 {dcd, ri, dsr, cts};	endend// Line Status Registeralways @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)		lsr <= #1 8'b01100000;	else	if (lsr_mask)		lsr <= #1 lsr & 8'b00000001;	else	begin		lsr[0] <= #1 (rf_count!=4'b0);  // data in receiver fifo available		lsr[1] <= #1 rf_overrun;     // Receiver overrun error		lsr[2] <= #1 rf_data_out[1]; // parity error bit		lsr[3] <= #1 rf_data_out[0]; // framing error bit		lsr[4] <= #1 (counter_b==4'b0); // break counter reached 0		lsr[5] <= #1 (tf_count==5'b0);  // transmitter fifo is empty		lsr[6] <= #1 (tf_count==5'b0 && (state == /*`S_IDLE */ 0)); // transmitter empty		lsr[7] <= #1 rf_error_bit;	endend// Enable signal generation logicalways @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)	begin		dlc    <= #1 0;		enable <= #1 1'b0;	end	else	begin		if (start_dlc)		begin			enable <= #1 1'b0;			dlc    <= #1 dl;		end		else		begin			if (dl!=0)			begin				if ( (dlc-1)==0 )				begin					enable <= #1 1'b1;					dlc <= #1 dl;				end				else				begin					enable <= #1 1'b0;					dlc <= #1 dlc - 1;				end			end			else			begin				dlc <= #1 0;				enable <= #1 1'b0;			end		end	endend////	INTERRUPT LOGIC//always @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)	begin		rls_int  <= #1 1'b0;		rda_int  <= #1 1'b0;		ti_int   <= #1 1'b0;		thre_int <= #1 1'b0;		ms_int   <= #1 1'b0;	end	else	begin		rls_int  <= #1 ier[`UART_IE_RLS] && (lsr[`UART_LS_OE] || lsr[`UART_LS_PE] || lsr[`UART_LS_FE] || lsr[`UART_LS_BI]);		rda_int  <= #1 ier[`UART_IE_RDA] && (rf_count >= {1'b0,trigger_level});		thre_int <= #1 threi_clear ? 0 : ier[`UART_IE_THRE] && lsr[`UART_LS_TFE];		ms_int   <= #1 ier[`UART_IE_MS] && (| msr[3:0]);		ti_int   <= #1 ier[`UART_IE_RDA] && (counter_t == 6'b0);	endendalways @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)			int_o <= #1 1'b0;	else		if (| {rls_int,rda_int,thre_int,ms_int,ti_int})			int_o <= #1 1'b1;		else			int_o <= #1 1'b0;end// Interrupt Identification registeralways @(posedge clk or posedge wb_rst_i)begin	if (wb_rst_i)		iir <= #1 1;	else	if (rls_int)  // interrupt occured and is enabled  (not masked)	begin		iir[`UART_II_II] <= #1 `UART_II_RLS;	// set identification register to correct value		iir[`UART_II_IP] <= #1 1'b0;		// and clear the IIR bit 0 (interrupt pending)	end	else	if (rda_int)	begin		iir[`UART_II_II] <= #1 `UART_II_RDA;		iir[`UART_II_IP] <= #1 1'b0;	end	else	if (ti_int)	begin		iir[`UART_II_II] <= #1 `UART_II_TI;		iir[`UART_II_IP] <= #1 1'b0;	end	else	if (thre_int)	begin		iir[`UART_II_II] <= #1 `UART_II_THRE;		iir[`UART_II_IP] <= #1 1'b0;	end	else	if (ms_int)	begin		iir[`UART_II_II] <= #1 `UART_II_MS;		iir[`UART_II_IP] <= #1 1'b0;	end	else	// no interrupt is pending	begin		iir[`UART_II_IP] <= #1 1'b1;	endendendmodule

⌨️ 快捷键说明

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