|
发表于 2011-4-27 12:00:32
|
显示全部楼层
看一下IC专业设计人士(不是我)写的verilog代码
module VARTXBUS ( CLKIN, RESET_, PA, BE, PDO, PDI,
CS0, CS1, CS2, CS3,
UARTDI0, UARTDI1, UARTDI2, UARTDI3,
UARTDO0, UARTDO1, UARTDO2, UARTDO3,
PA0, PA1, PA2, PA3, BE0, BE1, BE2, BE3,
NRDI, NWEI, NRDO, NWEO);
input CLKIN; //66Mhz host controller clock
input RESET_;
input [7:0]PA; //Address from PCIS
input [3:0]BE; //BE from PCIS
input [31:0]PDO; //Data output from PCIS
input CS0; //Uart slot0 chip select
input CS1; //Uart slot1 chip select
input CS2; //Uart slot2 chip select
input CS3; //Uart slot3 chip select
input NRDI; //Read stobe from PCIS
input NWEI; //Write stobe from PCIS
output NRDO; //Read stobe to host controller
output NWEO; //Write stobe to host controller
output [31:0]PDI; //Data input of PCIS
output [7:0]PA0; //Uart slot0 Address input
output [7:0]PA1; //Uart slot1 Address input
output [7:0]PA2; //Uart slot2 Address input
output [7:0]PA3; //Uart slot3 Address input
output [3:0]BE0; //Uart slot0 BE input
output [3:0]BE1; //Uart slot1 BE input
output [3:0]BE2; //Uart slot2 BE input
output [3:0]BE3; //Uart slot3 BE input
input [31:0]UARTDO0; //Uart slot0 Data output to PCIS
input [31:0]UARTDO1; //Uart slot1 Data output to PCIS
input [31:0]UARTDO2; //Uart slot2 Data output to PCIS
input [31:0]UARTDO3; //Uart slot3 Data output to PCIS
output [31:0]UARTDI0; //Uart slot0 Data input from PCIS
output [31:0]UARTDI1; //Uart slot1 Data input from PCIS
output [31:0]UARTDI2; //Uart slot2 Data input from PCIS
output [31:0]UARTDI3; //Uart slot3 Data input from PCIS
reg [7:0]PA0;
reg [3:0]BE0;
reg [31:0]UARTDI0;
reg [7:0]PA1;
reg [3:0]BE1;
reg [31:0]UARTDI1;
reg [7:0]PA2;
reg [3:0]BE2;
reg [31:0]UARTDI2;
reg [7:0]PA3;
reg [3:0]BE3;
reg [31:0]UARTDI3;
reg [31:0]PDI;
always@(CS0 or CS1 or CS2 or CS3 or PA or BE or PDO or UARTDO0 or UARTDO1 or UARTDO2 or UARTDO3)
begin
if(CS0)
begin
PA0 = PA;
BE0 = ~BE;
UARTDI0 = PDO;
PDI = UARTDO0;
PA1 = 8'b0;
BE1 = 4'b0;
UARTDI1 = 32'b0;
PA2 = 8'b0;
BE2 = 4'b0;
UARTDI2 = 32'b0;
PA3 = 8'b0;
BE3 = 4'b0;
UARTDI3 = 32'b0;
end
else if(CS1)
begin
PA1 = PA;
BE1 = ~BE;
UARTDI1 = PDO;
PDI = UARTDO1;
PA0 = 8'b0;
BE0 = 4'b0;
UARTDI0 = 32'b0;
PA2 = 8'b0;
BE2 = 4'b0;
UARTDI2 = 32'b0;
PA3 = 8'b0;
BE3 = 4'b0;
UARTDI3 = 32'b0;
end
else if(CS2)
begin
PA2 = PA;
BE2 = ~BE;
UARTDI2 = PDO;
PDI = UARTDO2;
PA1 = 8'b0;
BE1 = 4'b0;
UARTDI1 = 32'b0;
PA0 = 8'b0;
BE0 = 4'b0;
UARTDI0 = 32'b0;
PA3 = 8'b0;
BE3 = 4'b0;
UARTDI3 = 32'b0;
end
else if(CS3)
begin
PA3 = PA;
BE3 = ~BE;
UARTDI3 = PDO;
PDI = UARTDO3;
PA1 = 8'b0;
BE1 = 4'b0;
UARTDI1 = 32'b0;
PA0 = 8'b0;
BE0 = 4'b0;
UARTDI0 = 32'b0;
PA2 = 8'b0;
BE2 = 4'b0;
UARTDI2 = 32'b0;
end
else
begin
PA0 = 8'b0;
BE0 = 4'b0;
UARTDI0 = 32'b0;
PA1 = 8'b0;
BE1 = 4'b0;
UARTDI1 = 32'b0;
PA2 = 8'b0;
BE2 = 4'b0;
UARTDI2 = 32'b0;
PA3 = 8'b0;
BE3 = 4'b0;
UARTDI3 = 32'b0;
PDI = 32'b0;
end
end
reg NRD_1T, NRD_2T, NRD_3T;
reg NWE_1T, NWE_2T, NWE_3T;
wire NRDO = ~(~NRD_2T && NRD_3T);
wire NWEO = ~(~NWE_2T && NWE_3T);
/************************************/
/* cdc part design */
/************************************/
always@(posedge CLKIN or negedge RESET_)
begin
if(~RESET_)
NRD_1T <= 1'b1;
else
NRD_1T <= NRDI;
end
always@(posedge CLKIN or negedge RESET_)
begin
if(~RESET_)
NRD_2T <= 1'b1;
else
NRD_2T <= NRD_1T;
end
always@(posedge CLKIN or negedge RESET_)
begin
if(~RESET_)
NRD_3T <= 1'b1;
else
NRD_3T <= NRD_2T;
end
always@(posedge CLKIN or negedge RESET_)
begin
if(~RESET_)
NWE_1T <= 1'b1;
else
NWE_1T <= NWEI;
end
always@(posedge CLKIN or negedge RESET_)
begin
if(~RESET_)
NWE_2T <= 1'b1;
else
NWE_2T <= NWE_1T;
end
always@(posedge CLKIN or negedge RESET_)
begin
if(~RESET_)
NWE_3T <= 1'b1;
else
NWE_3T <= NWE_2T;
end
endmodule |
|