![]() |
RTL implementation of 32 GPIO pins:
// Programming model reg [31:0] ddr; // Data direction reg reg [31:0] dout; // output register reg [31:0] imask; // interrupt mask reg [31:0] ipol; // interrupt polarities reg [31:0] pins_r; // register'd pin data reg int_enable;// Master int enable (for all bits) always @(posedge clk) begin pins_r <= pins; if (hwen && addr==0) ddr <= wdata; if (hwen && addr==4) dout <= wdata; if (hwen && addr==8) imask <= wdata; if (hwen && addr==12) ipol <= wdata; if (hwen && addr==16) int_enable <= wdata[0]; end // Tri-state buffers. bufif b0 (pins[0], dout[0], ddr[0]); .. // thirty others here bufif b31 (pins[31], dout[31], ddr[31]); // Generally the programmer can read all the // programming model registers but here not. assign rdata = pins_r; // Interrupt masking wire int_pending = (|((din ^ ipol) & imask)); assign interrupt = int_pending && int_enable; |
Micro-controllers have a large number of GPIO pins (see earlier slide).
Exercise: Show how to wire up a push button and sketch out the code for a device driver that returns how many times it has so far been pressed. Sketch polled and interrupt driven code.