GPIO寄存器:DIR(方向), OUT(输出), IN(输入), IRQ(中断)
每个引脚独立配置为输入(0)或输出(1)
PWM参数:频率=1/周期, 占空比=高电平/周期×100%
┌──┐ ┌──┐
│ │ │ │
──┘ └────────┘ └──
←3→←──7──→ 周期=10,占空比=30%
应用:LED亮度、电机转速、DAC
"keyword">module gpio_pwm (
"keyword">input clk, rst,
"keyword">input [31:0] addr, wdata,
"keyword">input wen,
"keyword">output
"keyword">reg [31:0] rdata,
"keyword">output
"keyword">reg [7:0] gpio_out,
"keyword">input [7:0] gpio_in,
"keyword">output
"keyword">reg pwm_out
);
"keyword">reg [7:0] gpio_dir, gpio_data;
"keyword">reg [15:0] pwm_period, pwm_duty, pwm_counter;
"keyword">reg pwm_enable;
"keyword">always @(
"keyword">posedge clk
"keyword">or
"keyword">posedge rst)
"keyword">begin
"keyword">if (rst)
"keyword">begin gpio_dir<=0;gpio_data<=0;rdata<=0;
pwm_period<=1000;pwm_duty<=500;pwm_counter<=0;pwm_enable<=0;pwm_out<=0;gpio_out<=0;
"keyword">end
"keyword">else
"keyword">begin
"keyword">if (wen)
"keyword">case (addr[3:0])
0:gpio_dir<=wdata[7:0]; 4:gpio_data<=wdata[7:0];
8:
"keyword">begin pwm_period<=wdata[15:0];pwm_duty<=wdata[31:16];
"keyword">end
12:pwm_enable<=wdata[0];
"keyword">endcase
"keyword">case (addr[3:0])
0:rdata<={
24'b0,gpio_dir}; 4:rdata<={
24'b0,gpio_data};
8:rdata<={pwm_duty,pwm_period}; 12:rdata<={
31'b0,pwm_enable};
"keyword">default:rdata<={
24'b0,gpio_in};
"keyword">endcase
gpio_out<=gpio_data & gpio_dir;
"keyword">if (pwm_enable)
"keyword">begin
"keyword">if (pwm_counter>=pwm_period-1) pwm_counter<=0;
"keyword">else pwm_counter<=pwm_counter+1;
pwm_out<=(pwm_counter
1'b1:1'b0;
"keyword">end "keyword">else "keyword">begin pwm_out<=0;pwm_counter<=0; "keyword">end
"keyword">end
"keyword">end
"keyword">endmodule