📄 atahost_wb_slave.v
字号:
store_pp_full <= #1 PIOpp_full; wire brty = (`ATA_DEV_ADR & w_acc) & (DMAtip | store_pp_full); // // generate registers // // generate register select signals wire sel_ctrl = CONsel & we_i & (`ATA_ADR == `ATA_CTRL_REG); wire sel_stat = CONsel & we_i & (`ATA_ADR == `ATA_STAT_REG); wire sel_PIO_cmdport = CONsel & we_i & (`ATA_ADR == `ATA_PIO_CMD); wire sel_PIO_dport0 = CONsel & we_i & (`ATA_ADR == `ATA_PIO_DP0); wire sel_PIO_dport1 = CONsel & we_i & (`ATA_ADR == `ATA_PIO_DP1); wire sel_DMA_dev0 = CONsel & we_i & (`ATA_ADR == `ATA_DMA_DEV0); wire sel_DMA_dev1 = CONsel & we_i & (`ATA_ADR == `ATA_DMA_DEV1); // reserved 0x1c-0x38 // reserved 0x3c : DMA-port // generate control register always@(posedge clk_i or negedge arst_i) if (~arst_i) begin CtrlReg[31:1] <= #1 0; CtrlReg[0] <= #1 1'b1; // set reset bit (ATA-RESETn line) end else if (rst_i) begin CtrlReg[31:1] <= #1 0; CtrlReg[0] <= #1 1'b1; // set reset bit (ATA-RESETn line) end else if (sel_ctrl) CtrlReg <= #1 dat_i; // assign bits assign DMActrl_DMAen = CtrlReg[15]; assign DMActrl_dir = CtrlReg[13]; assign DMActrl_BeLeC1 = CtrlReg[9]; assign DMActrl_BeLeC0 = CtrlReg[8]; assign IDEctrl_IDEen = CtrlReg[7]; assign IDEctrl_FATR1 = CtrlReg[6]; assign IDEctrl_FATR0 = CtrlReg[5]; assign IDEctrl_ppen = CtrlReg[4]; assign PIO_dport1_IORDYen = CtrlReg[3]; assign PIO_dport0_IORDYen = CtrlReg[2]; assign PIO_cmdport_IORDYen = CtrlReg[1]; assign IDEctrl_rst = CtrlReg[0]; // generate status register clearable bits reg dirq, int; always@(posedge clk_i or negedge arst_i) if (~arst_i) begin int <= #1 1'b0; dirq <= #1 1'b0; end else if (rst_i) begin int <= #1 1'b0; dirq <= #1 1'b0; end else begin int <= #1 (int | (irq & !dirq)) & !(sel_stat & !dat_i[0]); dirq <= #1 irq; end // assign status bits assign StatReg[31:28] = DeviceId; // set Device ID assign StatReg[27:24] = RevisionNo; // set revision number assign StatReg[23:16] = 0; // reserved assign StatReg[15] = DMAtip; assign StatReg[14:11] = 0; assign StatReg[10] = DMARxEmpty; assign StatReg[9] = DMATxFull; assign StatReg[8] = DMA_dmarq; assign StatReg[7] = PIOtip; assign StatReg[6] = PIOpp_full; assign StatReg[5:1] = 0; // reserved assign StatReg[0] = int; // generate PIO compatible / command-port timing register always@(posedge clk_i or negedge arst_i) if (~arst_i) begin PIO_cmdport_T1 <= #1 PIO_mode0_T1; PIO_cmdport_T2 <= #1 PIO_mode0_T2; PIO_cmdport_T4 <= #1 PIO_mode0_T4; PIO_cmdport_Teoc <= #1 PIO_mode0_Teoc; end else if (rst_i) begin PIO_cmdport_T1 <= #1 PIO_mode0_T1; PIO_cmdport_T2 <= #1 PIO_mode0_T2; PIO_cmdport_T4 <= #1 PIO_mode0_T4; PIO_cmdport_Teoc <= #1 PIO_mode0_Teoc; end else if(sel_PIO_cmdport) begin PIO_cmdport_T1 <= #1 dat_i[ 7: 0]; PIO_cmdport_T2 <= #1 dat_i[15: 8]; PIO_cmdport_T4 <= #1 dat_i[23:16]; PIO_cmdport_Teoc <= #1 dat_i[31:24]; end // generate PIO device0 timing register always@(posedge clk_i or negedge arst_i) if (~arst_i) begin PIO_dport0_T1 <= #1 PIO_mode0_T1; PIO_dport0_T2 <= #1 PIO_mode0_T2; PIO_dport0_T4 <= #1 PIO_mode0_T4; PIO_dport0_Teoc <= #1 PIO_mode0_Teoc; end else if (rst_i) begin PIO_dport0_T1 <= #1 PIO_mode0_T1; PIO_dport0_T2 <= #1 PIO_mode0_T2; PIO_dport0_T4 <= #1 PIO_mode0_T4; PIO_dport0_Teoc <= #1 PIO_mode0_Teoc; end else if(sel_PIO_dport0) begin PIO_dport0_T1 <= #1 dat_i[ 7: 0]; PIO_dport0_T2 <= #1 dat_i[15: 8]; PIO_dport0_T4 <= #1 dat_i[23:16]; PIO_dport0_Teoc <= #1 dat_i[31:24]; end // generate PIO device1 timing register always@(posedge clk_i or negedge arst_i) if (~arst_i) begin PIO_dport1_T1 <= #1 PIO_mode0_T1; PIO_dport1_T2 <= #1 PIO_mode0_T2; PIO_dport1_T4 <= #1 PIO_mode0_T4; PIO_dport1_Teoc <= #1 PIO_mode0_Teoc; end else if (rst_i) begin PIO_dport1_T1 <= #1 PIO_mode0_T1; PIO_dport1_T2 <= #1 PIO_mode0_T2; PIO_dport1_T4 <= #1 PIO_mode0_T4; PIO_dport1_Teoc <= #1 PIO_mode0_Teoc; end else if(sel_PIO_dport1) begin PIO_dport1_T1 <= #1 dat_i[ 7: 0]; PIO_dport1_T2 <= #1 dat_i[15: 8]; PIO_dport1_T4 <= #1 dat_i[23:16]; PIO_dport1_Teoc <= #1 dat_i[31:24]; end // generate DMA device0 timing register always@(posedge clk_i or negedge arst_i) if (~arst_i) begin DMA_dev0_Tm <= #1 DMA_mode0_Tm; DMA_dev0_Td <= #1 DMA_mode0_Td; DMA_dev0_Teoc <= #1 DMA_mode0_Teoc; end else if (rst_i) begin DMA_dev0_Tm <= #1 DMA_mode0_Tm; DMA_dev0_Td <= #1 DMA_mode0_Td; DMA_dev0_Teoc <= #1 DMA_mode0_Teoc; end else if(sel_DMA_dev0) begin DMA_dev0_Tm <= #1 dat_i[ 7: 0]; DMA_dev0_Td <= #1 dat_i[15: 8]; DMA_dev0_Teoc <= #1 dat_i[31:24]; end // generate DMA device1 timing register always@(posedge clk_i or negedge arst_i) if (~arst_i) begin DMA_dev1_Tm <= #1 DMA_mode0_Tm; DMA_dev1_Td <= #1 DMA_mode0_Td; DMA_dev1_Teoc <= #1 DMA_mode0_Teoc; end else if (rst_i) begin DMA_dev1_Tm <= #1 DMA_mode0_Tm; DMA_dev1_Td <= #1 DMA_mode0_Td; DMA_dev1_Teoc <= #1 DMA_mode0_Teoc; end else if(sel_DMA_dev1) begin DMA_dev1_Tm <= #1 dat_i[ 7: 0]; DMA_dev1_Td <= #1 dat_i[15: 8]; DMA_dev1_Teoc <= #1 dat_i[31:24]; end // // generate WISHBONE interconnect signals // reg [31:0] Q; // generate acknowledge signal assign ack_o = PIOack | CONsel; // | DMAack; // since DMAack is derived from CONsel this is OK // generate error signal assign err_o = cyc_i & stb_i & berr; // generate retry signal (for OCIDEC-3 and above only) assign rty_o = cyc_i & stb_i & brty; // generate interrupt signal assign inta_o = StatReg[0]; // generate output multiplexor always@(`ATA_ADR or CtrlReg or StatReg or PIO_cmdport_T1 or PIO_cmdport_T2 or PIO_cmdport_T4 or PIO_cmdport_Teoc or PIO_dport0_T1 or PIO_dport0_T2 or PIO_dport0_T4 or PIO_dport0_Teoc or PIO_dport1_T1 or PIO_dport1_T2 or PIO_dport1_T4 or PIO_dport1_Teoc or DMA_dev0_Tm or DMA_dev0_Td or DMA_dev0_Teoc or DMA_dev1_Tm or DMA_dev1_Td or DMA_dev1_Teoc or DMAq ) case (`ATA_ADR) // synopsis full_case parallel_case `ATA_CTRL_REG: Q = CtrlReg; `ATA_STAT_REG: Q = StatReg; `ATA_PIO_CMD : Q = {PIO_cmdport_Teoc, PIO_cmdport_T4, PIO_cmdport_T2, PIO_cmdport_T1}; `ATA_PIO_DP0 : Q = {PIO_dport0_Teoc, PIO_dport0_T4, PIO_dport0_T2, PIO_dport0_T1}; `ATA_PIO_DP1 : Q = {PIO_dport1_Teoc, PIO_dport1_T4, PIO_dport1_T2, PIO_dport1_T1}; `ATA_DMA_DEV0: Q = {DMA_dev0_Teoc, 8'h0, DMA_dev0_Td, DMA_dev0_Tm}; `ATA_DMA_DEV1: Q = {DMA_dev1_Teoc, 8'h0, DMA_dev1_Td, DMA_dev1_Tm}; `ATA_DMA_PORT: Q = DMAq; default: Q = 0; endcase // assign DAT_O output assign dat_o = `ATA_DEV_ADR ? {16'h0, PIOq} : Q;endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -