choose_freq分析

本文详细解析了CPU频率调节过程中的关键步骤,包括选择频率、调整负载和目标频率的确定,以及循环迭代的过程。通过具体例子展示了如何在不同负载条件下进行频率调整。
choose_freq分析
1 800000:85 998400:90 1094400:80 1190400:80 1248000:80 1305600:80
例子1:  loadadjfreq=cpu_load*pcpu->policy->cur=92*998400
循环1:
   prevfreq = freq=998400;
   tl=90(998400:90) 通过当前频率找到下一级load
   loadadjfreq / tl=1020500
cpufreq_frequency_table_target: start
    target_freq=1020500
    CPUFREQ_RELATION_L
    freq=800,suboptimal.frequency = 800 suboptimal.driver_data=0;
    freq=998.4,suboptimal.frequency = 998.4 suboptimal.driver_data=1;
    freq=1094400,optimal.frequency = 1094400 optimal.driver_data=2
    freq=1190400  1248000  1305600(不起作用)  optimal.frequency = 1094400 i=5
    *index = optimal.driver_data=2;
cpufreq_frequency_table_target: end
    freq=1094400
    freqmin = prevfreq=998400;
    freqmax = UINT_MAX;

while (freq != prevfreq)进入循环2:
   prevfreq = freq=1094400;
   tl=80(1094400:80) 通过当前频率找到下一级load
   loadadjfreq / tl=92*998400/80=1148160
cpufreq_frequency_table_target: start
    target_freq=1148160
    CPUFREQ_RELATION_L
    freq=800,suboptimal.frequency = 800 suboptimal.driver_data=0;
    freq=998.4,suboptimal.frequency = 998.4 suboptimal.driver_data=1;
    freq=1094400,optimal.frequency = 1094400 optimal.driver_data=2
    freq=1190400  1248000  1305600(不起作用)  optimal.frequency = 1094400 i=5
    *index = optimal.driver_data=2;
cpufreq_frequency_table_target: end
    freq=1094400
    freqmin = prevfreq=1094400;
    freqmax = UINT_MAX;
while (freq != prevfreq)跳出循环


例子2:  loadadjfreq=cpu_load*pcpu->policy->cur=60*1190400

1 800000:85 998400:90 1094400:80 1190400:80 1248000:80 1305600:80

循环1:
   prevfreq = freq=1190400;
   tl=80(1190400:80) 通过当前频率找到下一级load
   loadadjfreq / tl=892800
cpufreq_frequency_table_target: start
    target_freq=892800
    CPUFREQ_RELATION_L
    freq=800,suboptimal.frequency = 800 suboptimal.driver_data=0;
    freq=998.4,optimal.frequency = 998.4 suboptimal.driver_data=1;
    freq=1094400 1190400  1248000  1305600(不起作用)  optimal.frequency = 1094400 i=5
    *index = optimal.driver_data=1;
cpufreq_frequency_table_target: end
    freq=998.400
    freqmax = prevfreq=1190400;    freqmin = 0;
    freqmax = UINT_MAX;

while (freq != prevfreq)进入循环2:


   prevfreq = freq=998.400;
   tl=90(998400:90) 通过当前频率找到下一级load
   loadadjfreq / tl=60*1190400/90=793600
cpufreq_frequency_table_target: start
    target_freq=793600
    CPUFREQ_RELATION_L
    freq=800000,optimal.frequency = 800 optimal.driver_data=0;
    freq=***1190400  1248000  1305600(不起作用)  optimal.frequency = 1094400 i=5
    *index = optimal.driver_data=0;
cpufreq_frequency_table_target: end
    freq=800000
    freqmin = 0;
    freqmax = 998400;

while (freq != prevfreq)进入循环3:


   prevfreq = freq=800000;
   tl=85(800000:85) 通过当前频率找到下一级load
   loadadjfreq / tl=60*1190400/85=840.282
cpufreq_frequency_table_target: start
    target_freq=840.282
    CPUFREQ_RELATION_L
    freq=800,suboptimal.frequency = 800 suboptimal.driver_data=0;
    freq=998.400,optimal.frequency = 998.400 suboptimal.driver_data=1;
    freq=1094400 1190400  1248000  1305600(不起作用)  optimal.frequency = 1094400 i=5
    *index = optimal.driver_data=1;
cpufreq_frequency_table_target: end
    freq=998.400
    freqmin = prevfreq = 800000;
    freqmax = 998400;
    进入if (freq >= freqmax)
cpufreq_frequency_table_target: start
    target_freq=freqmax-1=998339
    CPUFREQ_RELATION_H
    freq=800.000,optimal.frequency = 800.000 optimal.driver_data =0;
    freq=998.4,suboptimal.frequency = 998.4 suboptimal.driver_data=1;
    freq=1094400 1190400  1248000  1305600(不起作用)  suboptimal.frequency = 1094400 i=5
    *index = optimal.driver_data=0;
cpufreq_frequency_table_target: end
    freq=800000
    freqmin = 800000;
    freq=freqmax = 998400;
跳出循环
module kz( input clk , input key_stop , input key_choose , input key_vga , input rs232_signal, input uart_set_choose_en, // 串口设置使能 input [2:0] uart_choose_set, // 串口设置值 output reg [1:0] mode , output reg stop , output reg [2:0] choose ); always@(posedge clk) begin if(key_stop)begin stop <= 0; end else begin stop <= 1; end end always@(posedge clk or posedge rs232_signal ) begin // 优先级1: 串口直接设置 if (uart_set_choose_en) begin choose <= uart_choose_set; end // 优先级2: 物理按键切换 else if (stop && key_choose) begin if (choose == 3'd5) choose <= 0; else choose <= choose + 1; end end always @(posedge clk) begin if (key_vga) begin if (mode == 2'd2) mode <= 0; else mode <= mode + 1; end end endmodule module vga_colorbar ( input wire sys_clk, // 输入系统时钟,50MHz input wire sys_rst_n, // 系统复位信号,低电平有效 input wire key, //按键输入信号 input wire shift, //按键输入信号 output wire hsync, // 行同步信号 output wire vsync, // 场同步信号 output wire [2:0] rgb, // 输出RGB像素数据 input key_stop , input key_choose , input key_add , input rx, output beep , output [3:0] data0 , output [3:0] data1 , output [3:0] data2 , output [3:0] data3 , output [3:0] data4 , output [3:0] data5 , output led0, output led1, output tx ); wire vga_clk; // VGA工作时钟,25MHz wire locked; // PLL锁定信号 wire rst_n; // 复位信号 wire [9:0] pix_x; // 像素X轴坐标 wire [9:0] pix_y; // 像素Y轴坐标 wire [2:0] pix_data; // 像素数据 wire [1:0]mode; // 显示模式选择信号 //wire [5:0] seconds; // 秒 //wire [5:0] minutes; // 分钟 //wire [4:0] hours; // 小时 wire clk_8hz; wire stop ; wire [2:0] choose ; wire flag_1s; wire [5:0] second; wire [5:0] minute; wire [4:0] hour ; wire [5:0] alarm_second; wire [5:0] alarm_minute; wire [4:0] alarm_hour ; wire beeps; wire [3:0] da0; wire [3:0] da1; wire [3:0] da2; wire [3:0] da3; wire [3:0] da4; wire [3:0] da5; wire [7:0] po_data; wire po_flag; parameter UART_BPS = 14'd9600; //比特率 parameter CLK_FREQ = 26'd50_000_000; //时钟频率 // 新增串口控制信号 wire [2:0] uart_choose_set; wire uart_set_choose_en, uart_key_add_pulse, uart_shift_pulse; wire key_add_combined, shift_combined; // 125ms脉冲展宽器 reg [24:0] stretch_cnt = 0; // 50MHz下125ms计数(6_250_000) reg stretch_en = 0; reg [2:0] cmd_choose_buf; reg cmd_add_buf = 0; reg cmd_shift_buf = 0; assign rst_n = sys_rst_n & locked; // 串口指令解析 always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin stretch_en <= 0; cmd_choose_buf <= 0; cmd_add_buf <= 0; cmd_shift_buf <= 0; end else begin // 检测串口数据有效且处于设置模式 if (po_flag && !key_stop) begin case (po_data) 8'd0, 8'd1, 8'd2, 8'd3, 8'd4, 8'd5: begin cmd_choose_buf <= po_data[2:0]; cmd_add_buf <= 0; cmd_shift_buf <= 0; stretch_en <= 1; stretch_cnt <= 0; end 8'd6: begin cmd_choose_buf <= 0; cmd_add_buf <= 1; cmd_shift_buf <= 0; stretch_en <= 1; stretch_cnt <= 0; end 8'd7: begin cmd_choose_buf <= 0; cmd_add_buf <= 0; cmd_shift_buf <= 1; stretch_en <= 1; stretch_cnt <= 0; end default: ; // 忽略无效指令 endcase end // 脉冲展宽控制 else if (stretch_en) begin if (stretch_cnt == 25'd6_249_999) begin // 125ms stretch_en <= 0; end else begin stretch_cnt <= stretch_cnt + 1; end end end end // 生成展宽后的控制信号 assign uart_choose_set = cmd_choose_buf; assign uart_set_choose_en = stretch_en && (|cmd_choose_buf); assign uart_key_add_pulse = stretch_en && cmd_add_buf; assign uart_shift_pulse = stretch_en && cmd_shift_buf; // 合并物理按键和串口信号 assign key_add_combined = key_add || uart_key_add_pulse; assign shift_combined = shift || uart_shift_pulse; // PLL时钟生成模块 clk_gen clk_gen_inst ( .areset(~sys_rst_n), .inclk0(sys_clk), .c0(vga_clk), .locked(locked) ); // VGA控制模块 vga_ctrl vga_ctrl_inst ( .vga_clk(vga_clk), .sys_rst_n(rst_n), .pix_data(pix_data), .pix_x(pix_x), .pix_y(pix_y), .hsync(hsync), .vsync(vsync), .rgb(rgb) ); // 按键控制模块 //key_control key_control_inst ( // .clk(clk_8hz), // .key(key), // .mode(mode) //); // 实例化时钟生成模块 //clock_gen u_clock_gen ( // .clk(sys_clk), // .reset(rst_n), // .seconds(seconds), // .minutes(minutes), // .hours(hours) //); // 生成模块 vga_pic vga_pic_inst ( .vga_clk(vga_clk), .sys_rst_n(rst_n), .pix_x(pix_x), .pix_y(pix_y), .mode(mode), .pix_data_out(pix_data), .hr_units(data1), .hr_tens(data0), .min_tens(data2), .min_units(data3), .sec_tens(data4), .sec_units(data5) ); clk_8hz clk_8hz_0 ( .clk(sys_clk), .clk_8hz(clk_8hz) ); // 按键控制模块 kz kz_0( .clk (clk_8hz), .key_stop (key_stop), .key_choose (key_choose), .key_vga (key), .uart_set_choose_en (uart_set_choose_en), // 新增 .uart_choose_set (uart_choose_set), // 新增 .mode (mode), .stop (stop), .choose (choose) ); clk_1s clk_1s_0( .clk (clk_8hz ), //input clk , .stop (stop ), //input stop , .flag_1s (flag_1s) //output flag_1s ); clock clock_0( .clk (clk_8hz ), //input clk , .stop (stop ), //input stop , .choose (choose ), //input [2:0] choose , .flag_add (key_add ), //input flag_add , .flag_1s (flag_1s ), //input flag_1s , .second (second ), //output reg [5:0] second , .minute (minute ), //output reg [5:0] minute , .hour (hour ) //output reg [4:0] hour ); alarm_clock alarm_clock_0( .clk (clk_8hz ), //input clk , .stop (stop ), //input stop , .choose (choose ), //input [2:0] choose , .flag_add (key_add_combined), // 使用合并信号 //input flag_add , .second (second ), //input [5:0] second , .minute (minute ), //input [5:0] minute , .hour (hour ), //input [4:0] hour , .alarm_second (alarm_second ), //output reg [5:0] alarm_second , .alarm_minute (alarm_minute ), //output reg [5:0] alarm_minute , .alarm_hour (alarm_hour ), //output reg [4:0] alarm_hour , .beep (beeps ) //output beep ); digital_display digital_display_0( .clk (sys_clk ), //input clk , .stop (stop ), //input stop , .choose (choose ), //input [2:0] choose , .shift (shift_combined), // 使用合并信号 .second (second ), //input [5:0] second , .minute (minute ), //input [5:0] minute , .hour (hour ), //input [4:0] hour , .alarm_second (alarm_second), //input [5:0] alarm_second , .alarm_minute (alarm_minute), //input [5:0] alarm_minute , .alarm_hour (alarm_hour ), //input [4:0] alarm_hour , .data0 (data0 ), //output reg [3:0] data0 , .data1 (data1 ), //output reg [3:0] data1 , .data2 (data2 ), //output reg [3:0] data2 , .data3 (data3 ), //output reg [3:0] data3 , .data4 (data4 ), //output reg [3:0] data4 , .data5 (data5 ), //output reg [3:0] data5 .led0 (led0), .led1 (led1) ); digital_display digital_display_1( .clk (sys_clk ), //input clk , .stop (stop ), //input stop , .choose (choose ), //input [2:0] choose , .shift (shift ), .second (second ), //input [5:0] second , .minute (minute ), //input [5:0] minute , .hour (hour ), //input [4:0] hour , .alarm_second (alarm_second), //input [5:0] alarm_second , .alarm_minute (alarm_minute), //input [5:0] alarm_minute , .alarm_hour (alarm_hour ), //input [4:0] alarm_hour , .data0 (da0 ), //output reg [3:0] data0 , .data1 (da1 ), //output reg [3:0] data1 , .data2 (da2 ), //output reg [3:0] data2 , .data3 (da3 ), //output reg [3:0] data3 , .data4 (da4 ), //output reg [3:0] data4 , .data5 (da5 ) //output reg [3:0] data5 ); beep beep_0( .sys_clk (sys_clk ), //input clk , .sys_rst_n (key ), //input key_rt , .stop (stop ), //input stop , .beep (beeps ), //input beep , .second (second ), //input [5:0] second , .minute (minute ), //input [5:0] minute , .hour (hour ), //input [4:0] hour , .ring (beep ), //output ring , .flag_1s (flag_1s ) //output flag_1s , ); uart_rx #( .UART_BPS (UART_BPS), //串口波特率 .CLK_FREQ (CLK_FREQ) //时钟频率 ) uart_rx_inst ( .sys_clk (sys_clk ), //input sys_clk .sys_rst (!key_stop ), //input sys_rst_n .rx (rx ), //input rx .po_data (po_data ), //output [7:0] po_data .po_flag (po_flag ) //output po_flag ); uart_tx #( .UART_BPS (UART_BPS), //串口波特率 .CLK_FREQ (CLK_FREQ) //时钟频率 ) uart_tx_inst ( .sys_clk (sys_clk ), //input sys_clk .sys_rst (!key_stop ), //input sys_rst_n .pi_data (po_data ), //input [7:0] pi_data .pi_flag (po_flag ), //input pi_flag .tx (tx ) //output tx ); endmodule Error (10200): Verilog HDL Conditional Statement error at kz.v(28): cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct Error: Can't elaborate user hierarchy "kz:kz_0"上面的功能不做任何改变,新增功能也不改变修复这个错误
最新发布
09-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值