SystemC入门学习-第3章 数据类型

news2025/2/23 11:43:07

        本章将详细的描述SystemC的数据类型,并介绍这些类型的数据可以进行哪些操作。比如值保持器(value holder)就是一种特殊的类型。在所有的类型中,最重要的是bool和sc_uint两种类型

3.1 值保持器

值保持器有三种:

  • 变量:在函数中声明并使用。
  • 信号:被用于进程之间的通信以及模块实例之间的连接。用sc_signal声明
  • 端口:被用于指定与模块的接口。用sc_in, sc_out, sc_inout之一声明。
type variable_name1,variable_name2,...;
//for example
int mpy;

sc_signal <type> signal_name1, signal_name2,...;
//for example
sc_signal <bool> mask;

sc_in <type> input_name1,input_name2,...;
sc_out <type> output_name1,output_name2,...;
sc_inout <type> inout_name1,inout_name2,...;
//for example
sc_out<sc_uint<4> > addi[6];

        注意,和标准的C++一样,不能只用一条赋值语句完成对多维数组的赋值。必须逐个元素对数组赋值。

sc_signal[bool] mask[256][16];
for(i=0; i<256; i++)
    for(j=0; j<16; j++)
        mask[i][j]=false;

3.2 类型的总结

        如下是SystemC RTL 支持的SystemC 数据类型和C++数据类型。C++的数据类型具体位宽和计算机操作系统平台有关。这些数据类型可以用来声明变量、信号和端口。

3.3 位类型

        用sc_bit声明位类型。该类型的取值为‘0’或‘1’, ‘0’表示假,‘1’表示真。

        在任何布尔类型逻辑操作或者赋值中,位类型操作数与bool类型操作数可以自由混合。

下面是位类型的操作符:

3.4 任意位宽类型

        类型sc_bv定义了一个任意位宽的位向量,这是一个类型为sc_bit的向量,该向量的位宽在类型定义时被指定。该向量最右边的序号为0,即最小位。宽度W设置了向量的位宽,最高位为W-1位,一直到最低位0位。

        下面是几个例子,注意在表示位宽的WIDTH的记号与最后那个尖括号“>”之间必须添加一个空格字符。

sc_bv<8> ctrl_bus;//声明ctrl_bus是一个8位的向量,位序号从7到0,ctrl_bus[0]是最低位
sc_out<sc_bv<4> > mult_out; //声明了变量mult_out为位宽4的向量输出端口,位序号从3到0
sc_bv<4> mult;

ctrl_bus = "10110000";
ctrl_bus = "10011"; //不够8位,左边补0,即变成“00010011”
mult_out = "1011";

        下面列出了支持位向量操作数的操作符和方法。

        比较特别的操作是位选择操作符[], 拼接操作符(,),范围选择方法range()和六个缩减操作方法。

        range()被用来获得向量的位范围。range()方法中的范围索引可以是递增的,也可以使递减的。

        缩减“与”方法and_reduce()对向量的所有位进行逻辑“与”操作,然后返回1位的结果。其它几个缩减方法类似。

示例如下:

ctrl_bus[5] = '0';

ctrl_bus.range(0,3) = ctrl_bus.range(7,4);//ctrl_bus的第7位赋值给第0位,第6位赋值给第1位,第5位赋值给第2位,第4位赋值给第3位

mult = (ctrl_bus[0], ctrl_bus[0], ctrl_bus[0], ctrl_bus[1]);

ctrl_bus[0] = ctrl_bus.and_reduce();
ctrl_bus[1] = mult.or_reduce();

        位操作符和range()方法只适用于变量,不能用于端口或者信号。若必须对端口或者信号进行位选择或者范围选择,则必须使用一个临时变量。

使用示例如下:

sc_signal<sc_bv<4> > dval;
sc_in <sc_bv<8> > addr;
sc_bv<4> var_dval;
sc_bv<8> var_addr;
sc_bit ready;

//读输入地址addr的第2位
var_addr = addr.read();
ready = var_addr[2];

//把‘011’赋予信号dval的若干位
var_dval = dval;
var_dval.range(0,2) = "011";
dval = var_dval;

        对位向量类型不允许进行算术运算。为了支持这种运算,位向量类型的操作数可以先被赋予一个有符号的或者无符号的整型变量,进行必要的算术运算,然后将运算结果转回到原来的位向量。为了允许位向量和整型变量之间的转换,赋值可被重载。

sc_in <sc_bv<4> > pha1;
sc_signal<sc_bv<6> > pha2;

sc_uint<4> uint_pha1;
sc_uint<6> uint_pha2;

uint_pha1 = pha1;
uint_pha2 = pha2;

uint_pha2 = uint_pha2 - uint_pha1;
pha2 = uint_pha2;

        声明局部变量时候,可以将其所有位的值一起初始化为‘1’,或者其它任意值。

//将所有位初始化为‘1’
sc_bv<8> all_ones('1);
sc_bv<4> dtack(true); 

//将变量初始化为任意值
sc_bv<8> test_pattern ="01010101";
sc_bv<4> wbus = "0110"; 

3.5 逻辑类型

        逻辑类型用sc_logic声明。该类型共有四个值:

  • '0', SC_LOGIC_0 假;
  • '1', SC_LOGIC_1 真;
  • 'X', SC_LOGIC_X 不确定;
  • 'Z', SC_LOGIC_Z 高阻抗;

下面是这种类型操作数的操作符:

        在使用赋值、相等和不相等操作符时,sc_logic类型的操作符可以与sc_bit类型的操作符自由混用

sc_logic pulse, trig;
sc_bit select;
sc_signal <sc_logic> stack_end;
sc_inout <sc_logic> load_stack;

stack_end = SC_LOGIC_Z; //赋高阻抗值
pulse != select; //sc_bit类型与sc_logic类型可以进行比较
select = trig; //sc_logic类型可以赋值给sc_bit类型,若trig是“X”或者“Z”将发出警告

load_stack = SC_LOGIC_X ; //给双向端口赋‘X’值

        逻辑类型的操作数按位操作的行为可用下面的表格定义:

        在某些场合,可以明确地给sc_logic类型赋值。也可以用to_bool()方法将sc_logic型的逻辑值转换为bool型逻辑值。

sc_logic('Z');
static_case <sc_logic> ('Z');

trig = SC_LOGIC_Z; //和下面一句等价
trig = sc_logic('Z');

bool wrn;
sc_logic pena(SC_LOGIC_1);

wrn = pena.to_bool();

3.6 任意位宽的逻辑类型

        sc_lv类型可以定义任意位宽的逻辑向量(其中逻辑位为‘0’,‘1’,‘X’, 'Z')。sc_lv是一种类型为sc_logic的逻辑向量。该向量位宽由类型定义指定。最右边位序是0, 为最低位。W设置了向量的位宽,从第W-1位到底0位,第W-1位为最高位。

        sc_lv类型的值包含一系列逻辑值为“0”,“1”,“X”,“Z”的字符串指定。也可以加“0d”,"0x"指定为十进制或者十六进制字符串。如下示例。

sc_lv<4> data_bus; //位宽为4的逻辑向量
sc_signal<sc_lv<8> > counter_state; //8位的逻辑向量
sc_out<sc_lv<16> > sensor;


data_bus = "0011";
data_bus = "0d14"; //指定为十进制数值
sensor = "10110XX011000ZZZ";


sc_lv<8> dtack_read = "0XFE"; //指定为十六进制数值
sc_lv<4> coh_rd ="0XA";

        把数值赋予逻辑向量时候,若值的位宽与等号左边逻辑向量的位宽不符,根据数值的位宽大于或者小于逻辑向量的位宽,在数值的高位截断多余的高位或者添加“0”扩展数值。

        局部变量可以在其声明期间,将所有位初始化为“Z”值或者“X”值。

sc_lv<8> allzs(SC_LOGIC_Z);
sc_lv<4> allxs(SC_LOGIC_X);

sc_lv<4> mbpc('0');
sc_lv<8> prog_ctr(SC_LOGIC_1);
sc_lv<4> as_byte(true);

        支持逻辑向量操作数的操作符与支持位向量操作数的操作符完全一样。与位向量一样,逻辑向量的端口和信号也不能直接进行位选和部分位选,所以必须借助一个临时变量来完成所想要实现的赋值。

sc_out<sc_lv<8> > bmask;
sc_lv<8> temp;
sc_logic rx_ok, tx_ok;

temp = bmask;
temp[4] = rx_ok;
temp[7] = tx_ok;
bmask = temp;


sc_signal <sc_lv<4> > sabm;
sc_logic sel_bit;
sc_lv<4> q_temp;

q_temp = sabm;
sel_bit = q_temp[3];

        不允许对逻辑向量类型进行算术运算。若想进行算术运算,必须首先把逻辑向量类型的操作数赋予有符号或者无符号的整型数,然后进行算术运算,再把运算结果返回到逻辑向量。

sc_lv<4> index1;
sc_lv<8> index2;
sc_int<4> int_index1;
sc_int<8> int_index2;

int_index1 = index1;
int_index2 = index2;
int_index2 += int_index1;
index2 = int_index2;

        赋值被重载以允许逻辑向量与整型数之间互相转换。位向量和逻辑向量可以互相赋值。若在赋值期间,被赋予整型数或者位向量的值中包含“X”或“Z”,则结果是不确定的,会在运行时发出报警。

sc_uint<4> driver;
sc_int<8> q_array;

driver = data_bus;  //给无符号整型数赋逻辑向量

q_array = data_bus;  //若data_bus存在“X ”,"Z", 将在运行时发出报警,赋值结果不确定

sensor = q_array;   /因为右式是符号值(逻辑向量无符号),所以q_array左边多余的位都用“0”补上
 
data_bus = driver; //给逻辑向量赋无符号整数值


int srw; //用to_int()方法将逻辑向量转换为整型数
sc_lv<8> crd_value;

src = data_bus.to_int();
driver.range(2,0) = crd_value.range(7,5).to_int();
q_array.range(7,2) = crd_value.range(1,6).to_int();

3.7 有符号的整数类型

        sc_int用来定义有符号的整数类型。这是一个有固定精度的整数类型,其最高精度为64位。整数类型的位宽可以明确指定。本类型被解释为有符号的整数类型,其值用2的补码形式表示。位宽为W的sc_int整数类型,其第W-1位为符号位,最低位为第0位。

        所有按位操作符对整型量的操作都使用与该整型量等价的位向量实现。整型量的某一位可使用位选择操作符[]访问。整数类型的范围可使用range()方法访问。缩减操作符对整数类型对应的向量进行缩减运算产生1位的结果。concat()函数也能被用于进行拼接操作。

sc_int<4> sel_addr, inc_pc;
sc_int<8> opcode;
sc_int<12> sel_data;
#define N 7

sc_in<sc_int<N+1> > cpu_control[4]; 
sc_int<16> hr_reg_file[32];

opcode = sel_addr + inc_pc;

sel_data = -12; 
opcode = sel_data << 2;

sel_addr = 6; 
inc_pc = -5;
sel_addr = sel_addr ^ inc_pc;

sel_data = 100; 
inc_pc = sel_data.range(3,0);
opcode.range(1,0) = (sel_data[6], sel_data[7]);

hr_reg_file[2]  = concat(sel_data, sel_addr);

bool stop_clk;
bool start_clk;

stop_clk = inc_pc.and_reduce();
start_clk = hr_reg_file[15].xor_reduce();

        sc_int类型与C++整型是兼容的,并且能互相交换使用。使用to_int()方法可以将位向量或者逻辑向量转换成有符号的整型值。

sc_bv<8> tic;
sc_int<4> itf;
sc_int<8> int_tic;
sc_int<4> int_itf;

int_tic = tic.to_int();
int_itf = itf.to_int();

        若想以位的形式打印该有符号整型值,必须将该变量赋予位向量。如下:

cout << "Select address bus has "<< (sc_bv<4>)sel_addr <<endl;

        to_string()方法可被用来打印出不同格式的整型值。可供选择的打印格式种类如下:

  1. SC_BIN 打印出二进制的2的补码
  2. SC_BIN_US  打印出无符号数的二进制码
  3. SC_BIN_SM 打印出有符号值的二进制码
  4. SC_CSD  打印出规范的有符号数字码
  5. SC_OCT  打印出八进制码
  6. SC_HEX  打印出十六进制码
  7. SC_DEC  打印出十进制码

示例:

sc_int<8> rx_data =106;
sc_int<4> tx_buf = -11;

cout << "Default: rx_data = " << rx_data.to_string() <<endl;
cout << "Binary: rx_data = " << rx_data.to_string()(SC_BIN) << endl;
cout << "Binary unsigned: rx_data = " << rx_data.to_string()(SC_BIN_US) << endl;
cout << "Binary signed magnititude: rx_data = " << rx_data.to_string()(SC_BIN_SM) << endl;

cout << "Canonical signed: tx_buf = " << tx_buf.to_string()(SC_CSD) << endl;
cout << "Octal: rx_buf= " << tx_buf.to_string()(SC_OCT) << endl;
cout << "Hexadecimal: rx_buf= " << tx_buf.to_string()(SC_HEX) << endl;
cout << "Decimal: rx_buf= " << tx_buf.to_string()(SC_DEC) << endl;

3.8 无符号的整数类型

        无符号整数类型用sc_uint表示。这是一个固定精度的整数类型,其最大位宽为64位。整数类型的位宽可以明确指定。sc_uint类型被解释为无符号的整数类型。位宽为W, 类型sc_uint的整数其最低位为第0位。

        sc_uint类型的操作符集与sc_int一致。sc_uint类型的操作数可以通过赋值语句转换成sc_int类型的操作数,反之亦然。

        当把整型数赋值给无符号类型的操作数时,以2的补码形式表示的整数值被解释为无符号的数字。当把无符号的整型数赋给有符号的操作数时,无符号的数被扩展为64位的无符号数,然后截取多余高位得到有符号的值。

3.9 任意精度的整数类型

        sc_bigint, sc_biguint类型是一种可指定任意位宽、精度可达任意高的整数类型。若精度要求高于64位,则必须使用该类型;若精度要求等于或者低于64位,则可以使用sc_int整数类型(可使仿真运行较快)。

sc_bigint, sc_biguint类型可与其它C++类型兼容,可使用赋值操作符将其赋值给其它整数类型的目标。to_string()方法可用于以不同格式打印这种类型的值。

sc_bigint <100> comp, big_reg  //声明两个整数类型,变量,其精度位宽为100位

sc_bigint<70> con_sig; //一个70位的整数

sc_biguint<70> fef_rw; //一个70位的无符号整数

big_reg = 1000248;

cout<<" The value of big_reg is "<< big_reg.to_string(SC_HEX) <<endl;

3.10 判断类型

        判断类型(resolved types)可用于由多个源驱动的信号或者端口的建模。在这种建模过程中,必须对两个或者多个驱动器对信号或者端口的结果作出判断。SystemC为端口和信号提供了判断类型的逻辑标量和向量。例如:

sc_out_resolved  //逻辑标量端口的判断类型
sc_inout_resolved

sc_out_rc <WIDTH>  //逻辑向量端口的判断类型
sc_inout_rv <WIDTH>

sc_signal_resolved //逻辑标量信号的判断类型

sc_signal_rv<WIDTH> //逻辑向量信号的判断类型

        每个包含对信号或端口赋值的过程都会生成一个对信号或端口的驱动器。所以,若同一个信号或端口由多个过程驱动,则必须对信号或端口的值作出判断。判断的规则按照下面的表格进行。

        诸如sc_out_rv <WIDTH>的判断类型,除了其附加的语义,即当有多个驱动器对该端口进行驱动时,端口的最终值将根据以上表格作出判断外,其余都类似于sc_out<sc_lv<WIDTH>>类型。sc_lv类型的端口或信号不允许有多个驱动器,否则将会出现错误。例如:

sc_signal <sc_lv<4> > mem_word; //不允许有多个驱动器(即不能在多个进程中赋值)

sc_signal_rv <4> cycle_counter;  //允许在多个进程中赋值(即允许多个驱动源)

3.11 用户定义的数据类型

                可以用枚举(enum)类型和结构(struct)类型来创建新的数据类型。信号可以被声明为这样的类型。但是在这种场合,必须提供一下四个附加的、对新数据类型进行操作的重载(over-loaded)函数,才可将这些函数用于新创建数据类型的信号。

  • 操作符“=”  赋值
  • 操作符“==” (逻辑等于)
  • 操作符“<<” (流输出)
  • sc_trace()

        考虑以下由用户定义的类型micro_bus和四个该类型定义的函数。

//文件: micro_bus.h

#include "systemc.h"

const int ADDR_WIDTH = 16;
const int DATA_WIDTH = 8;

struct micro_bus{
    sc_uint<ADDR_WIDTH> address;
    sc_uint<DATA_WIDTH> data;
    bool read, write;
    
    micro_bus& operator = (const micro_bus&);
    bool operator == (const micro_bus&) const;
}

inline micro_bus&
micro_bus::operator = (const micro_bus& arg){
    address = arg.address;
    data = arg.data;
    read = arg.read;
    write = arg.write;
    return (*this);
}

inline bool micro_bus::operator == (const micro_bus& arg) const{
    return(
        (address == arg.address) &&
        (data == arg.data) &&
        (read == arg.read) &&
        (write == arg.write));
}

inline ostream& 
operator << (ostream& os, const micro_bus &arg){
    os <<"address= " << arg.address <<
         "data= " <<arg.data <<" read= " <<arg.read << 
         "write= "<<arg.write<< endl;
    return os;
}

inline void sc_trace(sc_trace_file *tf, const micro_bus& arg, const sc_string& name){
    sc_trace(tf, arg.address, name+".address");
    sc_trace(tf, arg.data, name+".data");
    sc_trace(tf, arg.read, name+".read");
    sc_trace(tf, arg.write, name+".write");

}

        下面是两个使用micro_bus类型声明的信号。可以对这两个信号进行已定义的操作。例如:

sc_signal <micro_bus> bus_a, bus_b;

3.12 推荐的数据类型

        到目前为止,对绝大多数设计而言,采用bool和sc_uint这两种类型就足够了。下面是一些场景的推荐选取规则,可以帮助指导大家在编写SystemC RTL 模型时类型的选用。

  1. 对1位,使用bool数据类型。
  2. 对向量和无符号的算术运算,使用sc_uint<n> 数据类型。
  3. 对有符号的算术运算,使用sc_int<n>数据类型。
  4. 若向量的维数大于64位,则使用sc_bigint或根据相应情况使用sc_biguint。
  5. 对于循环控制变量,使用int数据类型或者任何其它C++整数类型。但不要依赖于该整数类型的维数来为你的设计建模。
  6. 只在四值逻辑信号场合使用sc_logic和sc_lv<n>类型。
  7. 只在端口或信号存在多驱动器的场合,此时必须使用判断时才使用判断类型的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何管理销售团队?

本文将为大家讲解&#xff1a;如何管理销售团队&#xff1f; 销售团队的管理是企业成功的关键因素之一。一个高效、协同的销售团队可以推动企业的增长&#xff0c;增强市场竞争力。然而&#xff0c;销售团队的管理并不是一件容易的事情&#xff0c;它涉及多个方面的协调和优化…

Verilog开源项目——百兆以太网交换机(二)AES加解密模块设计

Verilog开源项目——百兆以太网交换机&#xff08;二&#xff09;AES加解密模块设计 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚焦整…

基于微信小程序的投票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信小程序的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,C…

Vue.js路由及Node.js的入门使用---超详细

一&#xff0c;Vue路由 1.1 路由是什么 路由是用来管理应用程序中不同页面之间导航的概念。Vue Router是Vue.js官方提供的路由管理器&#xff0c;它允许我们通过定义路由规则和视图组件来配置路由 1.2 路由给我们带来的好处有哪些&#xff1f; 单页应用&#xff08;Single Pag…

Springboot整合jdbc和Mybatis

目录 整合jdbc 1. 新建项目 2. 编写yaml配置文件连接数据库 3. 测试类 使用原生的jdbcTemplate进行访问测试 使用Druid连接池 1. 添加类型 2. 初始化连接池 3. 编写config类 配置Druid数据源监视 整合Mybatis 1. 导入依赖 2. 编写mapper接口 3. 编写实体类 4. 编…

GLTF编辑器的另一个作用

1、GLB模型介绍 GLB&#xff08;GLTF Binary&#xff09;是一种用于表示三维模型和场景的文件格式。GLTF是"GL Transmission Format"的缩写&#xff0c;是一种开放的、跨平台的标准&#xff0c;旨在在各种3D图形应用程序和引擎之间进行交换和共享。 GLB文件是GLTF文件…

MySQL数据库详解 二:数据库的高级语句(高级查询语句)

文章目录 1. 克隆表 ---- 将数据表的数据记录生成到新的表中1.1 方式一&#xff1a;先创建新表&#xff0c;再导入数据1.2 方式二&#xff1a;创建的时候同时导入 2. 清空表 ---- 删除表内的所有数据2.1 delete删除2.2 truncate删除&#xff08;重新记录&#xff09;2.3 创建临…

别着急,解决不了的问题,就请交给时间吧

转眼间我走出社会已过去四年之久&#xff0c;但很多事依旧历历在目&#xff0c;就好像昨天发生的一样。 我小时候&#xff0c;因为一场医学事故患有先天性白内障&#xff0c;真的是连黑板的看不清&#xff0c;当时自己也不太懂事&#xff0c;上课对我来说就是画画以及一切能够消…

保姆级 Keras 实现 Faster R-CNN 十三 (训练)

保姆级 Keras 实现 Faster R-CNN 十三 训练 一. 将 Faster R-CNN 包装成一个类二. 修改模型结构1. 修改 input_reader 函数2. 增加 RoiLabelLayer 层 三. 损失函数1. 自定义损失函数2. 自定义精度评价函数 四. 模型编译五. 模型训练六. 预训练模型七. 保存模型与参数八. 代码下…

更新、修改

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法: update 表名 列名该列新值, 列名该列新值, ... where 记录匹配条件; 说明&#xff1a;update 更新、修改 set 设置 …

通讯网关软件011——利用CommGate X2ODBC实现DDE数据转入ODBC

本文介绍利用CommGate X2ODBC实将DDE数据源中的数据转入到ODBC数据源。CommGate X2ODBC是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;将DDE数据源&#xff08;如Excel&#xff09;的数据写…

【软件设计师-从小白到大牛】下午题基础篇:第一章 数据流图(DFD)

文章目录 前言章节提要一、数据流图基本概念二、数据流图的分层&#xff08;DFD&#xff09;三、数据字典四、数据流图平衡原则五、答题技巧问题一问题二问题三问题四 六、案例分析1、案例12、案例2 前言 ​ 本系列文章为观看b站视频以及b站up主zst_2001系列视频所做的笔记&…

DAZ To UMA⭐一.DAZ简单使用教程

文章目录 &#x1f7e5; DAZ快捷键&#x1f7e7; DAZ界面介绍 &#x1f7e5; DAZ快捷键 移动物体:ctrlalt鼠标左键 旋转物体:ctrlalt鼠标右键 导入模型:双击左侧模型UI &#x1f7e7; DAZ界面介绍 Files:显示全部文件 Products:显示全部产品 Figures:安装的全部人物 Wardrobe…

Floyd算法基础

弗洛伊德算法(Floyd) 之前介绍了迪杰斯特拉算法(Dijkstra)。具体请看&#xff1a;最短路径算法——简单明了的迪杰斯特拉算法(Dijkstra)。Dijkstra适用于非负权图&#xff0c;并且一次只能从网络中找源点到任何一个节点的最短路径&#xff0c;而Floyd算法的应用更加广泛&#…

基于vue的黑马前端项目小兔鲜

目录 项目学习 初始化项目 建立项目 引入elementplus elementPlus主题设置 配置axios 路由 引入静态资源 自动导入scss变量 Layout页 组件结构快速搭建 字体图标渲染 一级导航渲染 吸顶导航交互实现 Pinia优化重复请求 Home页 分类实现 banner轮播图 …

vue变量赋值中文,但是输出为乱码,解决办法

很奇怪&#xff0c;展示出来为乱码 来看代码输出 控制台的输出也是乱码 这是因为文件编码问题&#xff0c;可以看到我使用的编码不对 更改一下编码 要选择UTF-8 保存之后重新运行&#xff0c;就可以看到正确显示啦&#xff01;

JavaScript学习笔记05

JavaScript笔记05 操作 BOM 对象&#xff08;重点&#xff09; 什么是 BOM BOM&#xff08;Browser Object Model&#xff09;是指浏览器对象模型&#xff0c;是用于描述这种对象与对象之间层次关系的模型。浏览器对象模型&#xff08;BOM&#xff09;提供了独立于内容的、可…

分享一个java+springboot+vue校园电动车租赁系统(源码、调试、开题、lw)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

UE5学习笔记(2)——打包第一个安卓demo(附碰到的问题)

这里是目录 0. 安装Android Studio我的解决方案 1. 调试安卓设备2. 创建游戏项目问题记录 3. 配置APK4. UE&#xff0c;启动&#xff01;很不辛&#xff0c;闪退了编译完&#xff0c;部署到设备&#xff1a;部署失败&#xff01;原因再试一次&#xff01; 5. 打包安卓包UE&…