OpenCores
URL https://opencores.org/ocsvn/mips789/mips789/trunk

Subversion Repositories mips789

[/] [mips789/] [branches/] [avendor/] [rtl/] [verilog/] [mips_dvc.v] - Blame information for rev 55

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 mcupro
/******************************************************************
2
 *                                                                *
3
 *    Author: Liwei                                               *
4
 *                                                                *
5
 *    This file is part of the "mips789" project.                 *
6
 *    Downloaded from:                                            *
7
 *    http://www.opencores.org/pdownloads.cgi/list/mips789        *
8
 *                                                                *
9
 *    If you encountered any problem, please contact me via       *
10
 *    Email:mcupro@opencores.org  or mcupro@163.com               *
11
 *                                                                *
12
 ******************************************************************/
13 10 mcupro
 
14 35 mcupro
`include "mips789_defs.v"
15
 
16 10 mcupro
module mips_dvc (
17
 
18
        input [31:0]din,
19
        input clk,
20
        input rst,
21
        input [31:0]addr ,
22
        input [3:0]mem_ctl,
23
 
24
        output reg [31:0]dout ,
25
 
26
        output reg[7:0] lcd_data,
27
        output lcd_rs,
28
        output lcd_rw,
29
        output lcd_en,
30
 
31
        input  ser_rxd,
32
        output ser_txd,
33
 
34
        output [6:0]seg7led1,
35
        output [6:0]seg7led2     ,
36
        output led1,
37
        output led2               ,
38
        input key1,
39
        input key2 ,
40
 
41
        output reg[31:0]irq_addr_o,  //not registed
42 35 mcupro
        output reg irq_req_o
43 10 mcupro
    );
44
 
45
    reg r_key1;
46
    reg r_key2;
47
 
48
    reg rr_key1;
49
    reg rr_key2;
50
 
51
    always @(posedge clk)
52
    begin
53
        r_key1<=key1;
54
        r_key2<=key2;
55
    end
56
 
57
    always @(posedge clk)
58
    begin
59
        rr_key1<=r_key1;
60
        rr_key2<=r_key2;
61
    end
62
 
63 35 mcupro
    initial
64
    begin
65
        lcd_data<=0;
66
    end
67 10 mcupro
    wire sv_byte = (mem_ctl==`DMEM_SB);
68
    wire ld_byte = mem_ctl==`DMEM_LBS||mem_ctl==`DMEM_LBU;
69
 
70
    wire sv_wd = (mem_ctl==`DMEM_SW);
71
    wire ld_wd = (mem_ctl==`DMEM_LW);
72
 
73
 
74
    wire wr_uartdata   =          addr==`UART_DATA_ADDR         &&              sv_byte;
75
    wire wr_lcddata    =          addr==`LCD_DATA_ADDR          &&              sv_byte;
76
    wire rd_uartdata   =          addr==`UART_DATA_ADDR         &&              ld_byte;
77
    wire rd_status         =      addr==`STATUS_ADDR            &&              ld_wd;
78
    wire wr_cmd        =          addr==`CMD_ADDR                       &&              sv_wd;
79
    wire rd_cmd        =          addr==`CMD_ADDR                       &&              ld_wd;
80
    wire wr_seg7       =          addr==`SEG7LED_ADDR           &&              sv_byte  ;
81
 
82
    wire set_tmr_addr  = addr==`TMR_IRQ_ADDR    &&     sv_wd;
83
    wire set_key1_addr = addr==`KEY1_IRQ_ADDR   &&     sv_wd;
84
    wire set_key2_addr = addr==`KEY2_IRQ_ADDR   &&     sv_wd;
85
    wire wr_tmr_data   = addr==`TMR_DATA_ADDR   &&     sv_wd;
86
    wire rd_tmr_data   = addr==`TMR_DATA_ADDR   &&     ld_wd;
87
 
88
    wire w_tmr_req;
89
    wire [31:0]w_tmr_data;
90
 
91
    reg [31:0] tmr_addr;
92
    reg [31:0] key1_addr;
93
    reg [31:0] key2_addr;
94
 
95
    reg [31:0] cmd ;
96
 
97 35 mcupro
    wire global_mask    =               cmd[0]   ;
98 10 mcupro
    wire w_rxd_ft               =               cmd[1]  ;
99
 
100
    assign lcd_rs               =               cmd[2]  ;
101
    assign lcd_rw               =               cmd[3]  ;
102
    assign lcd_en               =               cmd[4]  ;
103
 
104
    assign led1                 =               cmd[5]  ;
105
    assign led2                 =               cmd[6]  ;
106
 
107
    wire  tmr_clr               =       cmd[7]  ;
108
    wire  tmr_en                =               cmd[8]  ;
109
 
110
    reg [7:0] seg7data;
111
    wire [7:0] uart_dout;
112
    wire w_txd_busy;
113
    wire w_rx_rdy;
114
 
115
    always@(posedge clk )
116 15 mcupro
        if (~rst)
117 10 mcupro
        begin
118
            dout<=0;
119
        end
120
        else
121
        begin
122
            if (rd_status) dout<={28'b0,/*added here*/w_rx_rdy,w_txd_busy,rr_key1,rr_key2};else
123
            if (rd_cmd)dout<=cmd;else
124
            if (rd_uartdata)dout<={24'b0,uart_dout};else
125
            if ( rd_tmr_data )dout<=w_tmr_data; else
126
            dout<=0;
127
        end
128
 
129
    always @(posedge clk)
130 15 mcupro
        if (~rst)
131 10 mcupro
        begin
132
            cmd<=0;
133
            seg7data<=0;
134 35 mcupro
            tmr_addr<=32'bX;
135 10 mcupro
            key1_addr<=32'BX;
136
            key2_addr<=32'BX;
137
        end
138
        else
139
        begin
140 35 mcupro
 
141 10 mcupro
            if (wr_cmd)   cmd<=din;
142
            if (wr_seg7) seg7data<=din[7:0];
143
            if (wr_lcddata)        lcd_data<=din[7:0];
144
 
145
            if (set_tmr_addr)tmr_addr<=din;
146
            if (set_key1_addr)key1_addr<=din;
147
            if (set_key2_addr)key2_addr<=din;
148
 
149
        end
150
 
151
    uart0 iuart0(
152
 
153
              .clk(clk),
154
              .rst(rst),
155
              .ser_rxd(ser_rxd),
156
              .ser_txd(ser_txd),
157
 
158
              .rxd_ft(w_rxd_ft),
159
              .txd_ld(wr_uartdata),
160
 
161
              .din(din[7:0]),
162
 
163
              .rxd_rdy(w_rx_rdy),
164
              .txd_busy(w_txd_busy),
165
 
166
              .dout(uart_dout)
167
          ) ;
168
 
169
    seg7led_cv iseg7_cv (
170
                   .data(seg7data),
171
                   .seg7led1(seg7led1),
172
                   .seg7led2(seg7led2)
173
               );
174
 
175
    tmr0 mips_tmr0(
176
             .clk(clk),
177 35 mcupro
             .clr(tmr_clr),
178 10 mcupro
             .din(din) ,
179
             .ld(wr_tmr_data),
180
             .tmr_en(tmr_en),
181
             .tmr_req(w_tmr_req),
182
             .cntr_o(w_tmr_data)
183
         );
184
 
185
 
186
    //interrupt control
187
    wire tmr_irq_bit  =       cmd[31] ;
188
    wire key1_irq_bit =       cmd[30] ;
189
    wire key2_irq_bit =       cmd[29] ;
190
 
191
    wire tmr_req_do =   w_tmr_req & tmr_irq_bit;
192
    wire key1_req_do = rr_key1 & key1_irq_bit;
193
    wire key2_req_do = rr_key2 & key2_irq_bit;
194
 
195 35 mcupro
    wire irq_req = tmr_req_do | key1_req_do | key2_req_do ;
196 10 mcupro
 
197 35 mcupro
    always @(posedge clk)
198
        irq_req_o = global_mask & irq_req;
199
 
200
    always @(posedge clk)
201
        if (tmr_req_do)         irq_addr_o = tmr_addr;else
202 10 mcupro
    if (key1_req_do)     irq_addr_o = key1_addr;else
203
    if (key2_req_do)      irq_addr_o = key2_addr ;
204 35 mcupro
    else                      irq_addr_o =32'bx;
205 10 mcupro
 
206
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.