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

📄 pcic_m.tdf

📁 Altera AHDL语言设计的PCI总线
💻 TDF
📖 第 1 页 / 共 5 页
字号:
							ELSIF  (trdy and direct_xfr and last_xfr) THEN
									mw_sm		= MW_LAST;
									MW_LAST_d	= VCC;
							ELSE
								mw_sm		= MW_WAIT;
								MW_WAIT_d	= VCC;
							END IF;
							
				
		-- Master Write Last XFR.  Final Data Phase.  Only AD_OR Has VLD Data
		-- frame is deasserted, irdy is asserted, lm_ackn is deasserted

		WHEN MW_LAST	=>	IF (trdy) THEN
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF (devsel_toR) THEN				-- Master Abort
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF(not trdy and stop) THEN
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSE
								mw_sm		= MW_LAST;
								MW_LAST_d	= VCC;
							END IF;

		-- Master Write Hold.  Wait for devsel.  Only AD_OR Has VLD Data
		-- frame is asserted, irdy is deasserted, lm_ackn is deasserted

		WHEN MW_HOLD		=>	IF (stop) THEN
								mw_sm		= MW_END;
								MW_END_d		= VCC;
						ELSIF (devsel_toR) THEN
								mw_sm		= MW_END;
								MW_END_d	= VCC;
						ELSIF (devselR and ack64R) THEN
									mw_sm		= MW_DXFR;
									MW_DXFR_d	= VCC;
						ELSIF (devselR and not ack64R) THEN
									mw_sm		= MW_DXFR_32;
									MW_DXFR_32_d= VCC;
						ELSE
								mw_sm		= MW_HOLD;
								MW_HOLD_d	= VCC;
						END IF;
						
						
		-- Master Write 32 bit Data Transfer.  Transfer lower bits.  AD_OR High and Low Has VLD Data
		-- frame is asserted, irdy is asserted, lm_ackn is asserted

		WHEN MW_DXFR_32  	=> 	IF (stop) THEN						-- Disconnect
								mw_sm			= MW_END;
								MW_END_d		= VCC;
						ELSIF (!trdy and !lm_rdynR) THEN			-- PCI wait, Local ready
								mw_sm			= MW_WAIT;
								MW_WAIT_d		= VCC;
						ELSIF (!trdy and lm_rdynR) THEN				-- PCI wait, Local wait
								mw_sm			= MW_DXFR_32;
								MW_DXFR_32_d	= VCC;
						-- This transition has a problem.  It requires lm_last to be valid only for one clock
						-- This transition needs to be taken on the 2nd xfr after lm_last is asserted.
--						ELSIF (trdy and lm_rdynR and (last_xfr and not lm_last)) THEN	-- pci ready, local wait, last xfr
--								mw_sm			= MW_LAST;
--								MW_LAST_d		= VCC;
						ELSIF (trdy  and (last_xfr and not lm_last)) THEN	-- pci ready, local wait, last xfr
								mw_sm			= MW_LAST;		-- mmbw64_pwpd_1a.scf
								MW_LAST_d		= VCC;
								
						ELSIF (trdy and !lm_rdynR) THEN				-- PCI ready, local ready
								mw_sm			= MW_WAIT_32;
								MW_WAIT_32_d  	= VCC;
						ELSE --trdy and lm_rdynR and (!last_xfr or lm_last)
								mw_sm			= MW_DXFR;
								MW_DXFR_d		= VCC;
						END IF;

		-- Master Write Wait 32 bit Data Transfer.  Transfer high bits from previous word.
		-- AD_OR High and Low Has VLD Data and AD_HR Low has Data
		-- frame is asserted, irdy is asserted, lm_ackn is deasserted

		WHEN MW_WAIT_32	=> 	IF (stop) THEN
								mw_sm			= MW_END;
								MW_END_d		= VCC;
						ELSIF (trdy and not latcntr_toR) THEN
								mw_sm			= MW_DXFR_32;
								MW_DXFR_32_d	= VCC;
						ELSIF  (trdy and latcntr_toR) THEN
								mw_sm		= MW_LAST;
								MW_LAST_d	= VCC;
						ELSE
								mw_sm			= MW_WAIT_32;
								MW_WAIT_32_d 	= VCC;
						END IF;
						
						
		-- Master Write End.  All data has been transferred
		WHEN MW_END		=>	mw_sm		= MW_IDLE;
							MW_IDLE_d	= VCC;
							
	END CASE;

ELSE GENERATE

		CASE mw_sm IS

		-- Master Write Idle
		WHEN MW_IDLE	=> 	IF (MS_ENA and (low_lm_beni[0] and not dac_decode_d) )THEN	-- ZA changed the transition because cmmand is only available in MS_ENA not before
							--IF (MS_ADR_d and write) THEN
								mw_sm		= MW_LXFR;
								MW_LXFR_d	= VCC;
							ELSIF (MS_ENA and (high_lm_beni[0] and dac_decode_d )) THEN
								mw_sm		= MW_LXFR;
								MW_LXFR_d	= VCC;
							ELSE
								mw_sm		= MW_IDLE;
								MW_IDLE_d	= VCC;
							END IF;
		--
		-- Master Write Local XFR.  Pipe is Empty
		-- Waiting for the first word to be recieved from the local side
		-- frame is asserted, irdy is deasserted, lm_ack is asserted.
		--

		WHEN MW_LXFR	=>	IF (stop) THEN						-- Disconnect
								mw_sm		= MW_END;
								MW_END_d	= VCC;
						ELSIF (devsel_toR) THEN				-- Master Abort
								mw_sm		= MW_END;
								MW_END_d	= VCC;
						ELSIF (!lm_rdynR and !direct_xfr and devselR) THEN				-- Local side is ready, data is transferred
								mw_sm			= MW_DXFR_32;
								MW_DXFR_32_d	= VCC;
						ELSIF (!lm_rdynR and !direct_xfr and not devselR) THEN		
								mw_sm			= MW_HOLD;
								MW_HOLD_d		= VCC;
						ELSIF (!lm_rdynR and direct_xfr and !last_xfr) THEN			-- It is a direct transfer adn it is not the last transfer
									mw_sm		= MW_DXFR;
									MW_DXFR_d	= VCC;
						ELSIF (!lm_rdynR and direct_xfr and last_xfr) THEN							-- It is a direct transfer and it is a last transfer
									mw_sm		= MW_LAST;
									MW_LAST_d	= VCC;
						ELSE								-- Local Side needs to transfer the data
								mw_sm		= MW_LXFR;
								MW_LXFR_d	= VCC;
						END IF;
						
						
		-- Master Write Data Xfr. ( Only AD_OR Has valid Data)
		-- frame is asserted, irdy is asserted, lm_ackn is asserted			

		WHEN MW_DXFR	=>	IF (stop) THEN						-- Disconnect
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF (devsel_toR) THEN				-- Master Abort
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF (lm_rdynR and trdy) THEN
										mw_sm		= MW_LXFR;
										MW_LXFR_d	= VCC;
							ELSIF (lm_rdynR and not trdy and not last_xfr) THEN
										mw_sm		= MW_DXFR;
										MW_DXFR_d	= VCC;
							ELSIF (!direct_xfr and trdy) THEN
										mw_sm			= MW_DXFR_32;
										MW_DXFR_32_d	= VCC;
							ELSIF (!direct_xfr and not trdy) THEN
										mw_sm			= MW_WAIT_32;
										MW_WAIT_32_d	= VCC;
							ELSIF (!last_xfr and trdy) THEN
										mw_sm		= MW_DXFR;
										MW_DXFR_d	= VCC;
--							ELSIF (!last_xfr and not trdy) THEN
--										mw_sm		= MW_WAIT;
--										MW_WAIT_d	= VCC;
							ELSIF (not trdy) THEN
										mw_sm		= MW_WAIT;
										MW_WAIT_d	= VCC;
										
							ELSIF (last_xfr and trdy) THEN
										mw_sm		= MW_LAST;
										MW_LAST_d	= VCC;
							ELSE
										mw_sm		= MW_DXFR;
										MW_DXFR_d	= VCC;
							END IF;
							
							

		-- Master Write Wait.  PCI Asserted wait Both AD_OR and AD_HR have vld Data
		-- frame is asserted, irdy is asserted, lm_ackn is deasserted

		WHEN MW_WAIT	=>	IF (stop) THEN						-- Disconnect
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF (devsel_toR) THEN
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF (trdy and !direct_xfr) THEN
									mw_sm			= MW_WAIT_32;
									MW_WAIT_32_d	= VCC;
							ELSIF (trdy and direct_xfr and !last_xfr) THEN
									mw_sm		= MW_DXFR;
									MW_DXFR_d	= VCC;
							ELSIF  (trdy and direct_xfr and last_xfr) THEN
									mw_sm		= MW_LAST;
									MW_LAST_d	= VCC;
							ELSE
								mw_sm		= MW_WAIT;
								MW_WAIT_d	= VCC;
							END IF;
							
				
		-- Master Write Last XFR.  Final Data Phase.  Only AD_OR Has VLD Data
		-- frame is deasserted, irdy is asserted, lm_ackn is deasserted

		WHEN MW_LAST	=>	IF (trdy) THEN
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF (devsel_toR) THEN				-- Master Abort
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSIF(not trdy and stop) THEN
								mw_sm		= MW_END;
								MW_END_d	= VCC;
							ELSE
								mw_sm		= MW_LAST;
								MW_LAST_d	= VCC;
							END IF;

		-- Master Write Hold.  Wait for devsel.  Only AD_OR Has VLD Data
		-- frame is asserted, irdy is deasserted, lm_ackn is deasserted

		WHEN MW_HOLD		=>	IF (stop) THEN
								mw_sm		= MW_END;
								MW_END_d		= VCC;
						ELSIF (devsel_toR) THEN
								mw_sm		= MW_END;
								MW_END_d	= VCC;
						ELSIF (devselR and ack64R) THEN
									mw_sm		= MW_DXFR;
									MW_DXFR_d	= VCC;
						ELSIF (devselR and not ack64R) THEN
									mw_sm		= MW_DXFR_32;
									MW_DXFR_32_d= VCC;
						ELSE
								mw_sm		= MW_HOLD;
								MW_HOLD_d	= VCC;
						END IF;
						
						
		-- Master Write 32 bit Data Transfer.  Transfer lower bits.  AD_OR High and Low Has VLD Data
		-- frame is asserted, irdy is asserted, lm_ackn is asserted

		WHEN MW_DXFR_32  	=> 	IF (stop) THEN						-- Disconnect
								mw_sm			= MW_END;
								MW_END_d		= VCC;
						ELSIF (!trdy and !lm_rdynR) THEN			-- PCI wait, Local ready
								mw_sm			= MW_WAIT;
								MW_WAIT_d		= VCC;
						ELSIF (!trdy and lm_rdynR) THEN				-- PCI wait, Local wait
								mw_sm			= MW_DXFR_32;
								MW_DXFR_32_d	= VCC;
						-- This transition has a problem.  It requires lm_last to be valid only for one clock
						-- This transition needs to be taken on the 2nd xfr after lm_last is asserted.
--						ELSIF (trdy and lm_rdynR and (last_xfr and not lm_last)) THEN	-- pci ready, local wait, last xfr
--								mw_sm			= MW_LAST;
--								MW_LAST_d		= VCC;
						ELSIF (trdy  and (last_xfr and not lm_last)) THEN	-- pci ready, local wait, last xfr
								mw_sm			= MW_LAST;		-- mmbw64_pwpd_1a.scf
								MW_LAST_d		= VCC;
								
						ELSIF (trdy and !lm_rdynR) THEN				-- PCI ready, local ready
								mw_sm			= MW_WAIT_32;
								MW_WAIT_32_d  	= VCC;
						ELSE --trdy and lm_rdynR and (!last_xfr or lm_last)
								mw_sm			= MW_DXFR;
								MW_DXFR_d		= VCC;
						END IF;

		-- Master Write Wait 32 bit Data Transfer.  Transfer high bits from previous word.
		-- AD_OR High and Low Has VLD Data and AD_HR Low has Data
		-- frame is asserted, irdy is asserted, lm_ackn is deasserted

		WHEN MW_WAIT_32	=> 	IF (stop) THEN
								mw_sm			= MW_END;
								MW_END_d		= VCC;
						ELSIF (trdy and not latcntr_toR) THEN
								mw_sm			= MW_DXFR_32;
								MW_DXFR_32_d	= VCC;
						ELSIF  (trdy and latcntr_toR) THEN
								mw_sm		= MW_LAST;
								MW_LAST_d	= VCC;
						ELSE
								mw_sm			= MW_WAIT_32;
								MW_WAIT_32_d 	= VCC;
						END IF;
						
						
		-- Master Write End.  All data has been transferred
		WHEN MW_END		=>	mw_sm		= MW_IDLE;
							MW_IDLE_d	= VCC;
							
	END CASE;
END GENERATE;
	
	%
	MW_IDLE_d = (MW_IDLE and not ((MS_ENA and lm_cmd[0])))
				OR (MW_END);
				
	MW_LXFR_d = (MW_IDLE and (MS_ENA and lm_cmd[0]))					
				OR (MW_LXFR and (not (stop) or not (devsel_toR)) and not (!lm_rdynR and !direct_xfr and devselR) and not (!lm_rdynR and !direct_xfr and not devselR)
							and not (!lm_rdynR and direct_xfr and !last_xfr) and not (!lm_rdynR and direct_xfr and last_xfr))  
				OR (MW_DXFR and (not (stop) or not (devsel_toR)) and (lm_rdynR and trdy));
				
	MW_DXFR_d = (MW_LXFR and (not (stop) or not (devsel_toR)) and not (!lm_rdynR and !direct_xfr and devselR) and not (!lm_rdynR and !direct_xfr and not devselR)
						and (!lm_rdynR and direct_xfr and !last_xfr))   				
				OR (MW_DXFR and (not (stop) or not (devsel_toR)) and not (lm_rdynR and trdy) and not (lm_rdynR and not trdy) and not (!direct_xfr and trdy)
						and not (!direct_xfr and not trdy) and not (!last_xfr and trdy) and not (!last_xfr and not trdy) and not (last_xfr and trdy)) 
				OR (MW_WAIT and not (stop) and not (trdy and !direct_xfr) and (trdy and direct_xfr and !last_xfr)) 
				OR (MW_HOLD and (not (stop) or not (devsel_toR)) and (devselR and ack64R))
				OR (MW_DXFR_32 and not (stop) and not (!trdy and !lm_rdynR) and not (!trdy and lm_rdynR) and not (trdy and lm_rdynR and (last_xfr and not lm_last))
						and not (trdy and !lm_rdynR));
						
	MW_WAIT_d = (MW_DXFR and (not (stop) or not (devsel_toR)) and not (lm_rdynR and trdy) and not (lm_rdynR and not trdy) and not (!direct_xfr and trdy)
						and not (!direct_xfr and not trdy) and not (!last_xfr and trdy) and (!last_xfr and not trdy))   
				OR (MW_WAIT and not (stop) and not (trdy and !direct_xfr) and not (trdy and direct_xfr and !last_xfr) and not (trdy and direct_xfr and last_xfr)) 
				OR (MW_DXFR_32 and not (stop) and (!trdy and !lm_rdynR)); 

	MW_LAST_d = (MW_LXFR and (not (stop) or not (devsel_toR)) and not (!lm_rdynR and !direct_xfr and devselR) and not (!lm_rdynR and !direct_xfr and not devselR)
							and not (!lm_rdynR and direct_xfr and !last_xfr) and (!lm_rdynR and direct_xfr and last_xfr))
				OR (MW_DXFR and (not (stop) or not (devsel_toR)) and not (lm_rdynR and trdy) and not (lm_rdynR and not trdy) and not (!direct_xfr and trdy)
						and not (!direct_xfr and not trdy) and not (!last_xfr and trdy) and not (!last_xfr and not trdy) and  (last_xfr and trdy)) 
				OR (MW_WAIT and not (stop) and not (trdy and !direct_xfr) and not (trdy and direct_xfr and !last_xfr) and (trdy and direct_xfr and last_xfr)) 
				OR (MW_LAST and (not (trdy) or not (devsel_toR) or not (not trdy and stop))) 
				OR (MW_DXFR_32 and not (stop) and not (!trdy and !lm_rdynR) and not (!trdy and lm_rdynR) and (trdy and lm_rdynR and (last_xfr and not lm_last)));
				
	MW_HOLD_d = (MW_LXFR and (not (stop) or (devsel_toR)) and not (!lm_rdynR and !direct_xfr and devselR) and  (!lm_rdynR and !direct_xfr and not devselR))
				OR (MW_HOLD and (not (stop) or not (devsel_toR)) and not (devselR and ack64R) and not (devselR and not ack64R));
				
	MW_DXFR_32_d = (MW_LXFR and (not (stop) or not (devsel_toR)) and (!lm_rdynR and !direct_xfr and devselR))
				OR (MW_DXFR and (not (stop) or not (devsel_toR)) and not (lm_rdynR and trdy) and not (lm_rdynR and not trdy) and (!direct_xfr and trdy))
				OR (MW_HOLD and (not (stop) or not (devsel_toR)) and not (devselR and ack64R) and (devselR and not ack64R))  
				OR (MW_DXFR_32 and not (stop) and not (!trdy and !lm_rdynR) and (!trdy and lm_rdynR))  
				OR (MW_WAIT_32 and not (stop) and trdy);

 	MW_WAIT_32_d = (MW_DXFR and (not (stop) or not (devsel_toR)) and not (lm_rdynR and trdy) and not (lm_rdynR and not trdy) and not (!direct_xfr and trdy) and (!direct_xfr and not trdy)) 
				OR (MW_WAIT and not (stop) and (trdy and !direct_xfr))
				OR (MW_DXFR_32 and not (stop) and not (!trdy and !lm_rdynR) and not (!trdy and lm_rdynR) and not (trdy and lm_rdynR and (last_xfr and not lm_last)) and (trdy and !lm_rdynR))   
				OR (MW_WAIT_32 and not (stop) and not (trdy));
				
	MW_END_d = (MW_LXFR and ((stop) or (devsel_toR)))
				OR (MW_DXFR and ((stop) or (devsel_toR)))								
				OR (MW_WAIT and (stop))			
				OR (MW_LAST and ((trdy) or (devsel_toR) or (not trdy and stop)))							
				OR (MW_HOLD and ((stop) or (devsel_toR)))
				OR (MW_DXFR_32 and (stop))
				OR (MW_WAIT_32 and (stop)) ;
%

 


-- Master Read state machine

	mr_sm.clk		= clk;
	mr_sm.reset		= not rstn;
	
	case mr_sm IS
	
		WHEN MR_IDLE	=> 	IF (MS_ADR and NOT write and not last_xfr and not dac_decode) THEN
								mr_sm		= MR_PXFR;
								MR_PXFR_d	= VCC;
							ELSIF (MS_ADR and not write and last_xfr and not dac_decode) THEN
								mr_sm		= MR_LPXFR;
								MR_LPXFR_d	= VCC;
							ELSIF (MS_ADR2 and NOT write and not last_xfr and dac_decode%dac_decodeR_R_q%) THEN
								mr_sm		= MR_PXFR;
								MR_PXFR_d	= VCC;
							ELSIF (MS_ADR2 and not write and last_xfr and dac_decode%dac_decodeR_R_q%) THEN
								mr_sm		= MR_LPXFR;
								MR_LPXFR_d	= VCC;
							ELSE
								mr_sm		= MR_IDLE;
								MR_IDLE_d	= VCC;
							END IF;


--MR_IDLE and (MS_ADR2 and NOT write and not last_xfr and dac_decode)
--		and (not MS_ADR or write or last_xfr or dac_decode)
--		and (not MS_ADR or write or not last_xfr or dac_decode)
		

							
		-- Wait to recieve First PCI WORD
		-- irdy is asserted, Frame is asserted, and lm_ack is deasserted
		WHEN MR_PXFR	=>	IF (devsel_toR) THEN
								mr_sm		= MR_END;			-- End State Machine
								MR_END_d	= 

⌨️ 快捷键说明

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