您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > 简易CPU模型设计 verilog
简易CPU模型设计1设计一个简易CPU模型,该模型具备5条指令:将内存中某一单元的内容送到累加器的指令将累加器的内容和内存中某一单元相加,结果送回累加器的指令将累加器的内容和内存中某一单元相减,结果送回累加器的指令将累加器的内容输出至“输出寄存器”的指令结束CPU运行的指令2使用ModelSim对设计的程序进行仿真。//定义指令助记符`defineMEM_to_A4'b0001`defineA_add_MEM4'b0010`defineA_sub_MEM4'b0100`defineA_to_OUTREG4'b1000`defineHLT4'b0000//定义状态机状态`defines06'b00_0001`defines16'b00_0010`defines26'b00_0100`defines36'b00_1000`defines46'b01_0000`defines56'b10_0000moduleCPU(clk,rst,out_reg);inputclk;//系统时钟信号inputrst;//系统复位信号output[7:0]out_reg;//寄存器输出reg[7:0]alu_out;//ALU输出reg[7:0]ir;//指令寄存器reg[3:0]pc;//PCreg[3:0]data_addr;//内存数据地址wire[3:0]pc_or_data;//读取ROM的指针reg[7:0]out_reg;reg[7:0]rom_out;//ROM输出regp_d_en;//p_d_en=0,pc_bus;p_d_en=1,data_bus;PC和data地址的选择输出regpc_en;//一些使能信号(全是高电平有效)regir_en;regalu_en;regdata_en;regout_en;regload_a;//加载累加器的使能信号reg[7:0]a;//累加器reg[5:0]state;//状态机状态寄存器//判断是PC地址有效还是数据地址有效(用于选择ROM中的程序和数据)assignpc_or_data=(rst)?(p_d_en?data_addr:pc):4'b0;//取数据地址,用于ALU计算always@(posedgeclkornegedgerst)beginif(rst==1'b0)data_addr=4'b0;elseif(data_en==1'b1)data_addr=ir[3:0];end//PC加一,用于取下一条指令always@(posedgeclkornegedgerst)beginif(rst==1'b0)pc=3'b0;elseif(pc_en==1'b1)pc=pc+3'b001;end//取指令always@(posedgeclkornegedgerst)beginif(rst==1'b0)ir=8'b0;elseif(ir_en==1'b1)ir=rom_out;end//寄存器输出always@(posedgeclkornegedgerst)beginif(rst==1'b0)out_reg=8'b0;elseif(out_en==1'b1)out_reg=alu_out;end//ALU数据处理结果输出到累加器always@(posedgeclkornegedgerst)beginif(rst==1'b0)a=8'b0;elseif(load_a==1'b1)a=alu_out;end//ALU根据指令进行运算always@(*)beginif(rst==1'b0)alu_out=8'b0;elseif(alu_en==1'b1)begincase(ir[7:4])`MEM_to_A:alu_out=rom_out;`A_add_MEM:alu_out=a+rom_out;`A_sub_MEM:alu_out=a-rom_out;`A_to_OUTREG:alu_out=a;`HLT:alu_out=alu_out;default:alu_out=8'b0;endcaseendend//状态机,用于控制整个程序的控制,是核心控制模块always@(posedgeclkornegedgerst)beginif(rst==1'b0)//复位时全停beginpc_en=1'b0;ir_en=1'b0;alu_en=1'b0;data_en=1'b0;p_d_en=1'b0;//p_d_en=0,pc_bus;p_d_en=1,data_bus;out_en=1'b0;load_a=1'b0;state=`s0;endelsebegincase(state)//取指令`s0:beginpc_en=1'b0;ir_en=1'b1;alu_en=1'b0;data_en=1'b0;p_d_en=1'b0;out_en=1'b0;load_a=1'b0;state=`s1;end//PC加一`s1:beginpc_en=1'b1;ir_en=1'b0;alu_en=1'b0;data_en=1'b0;p_d_en=1'b0;out_en=1'b0;load_a=1'b0;state=`s2;end//取内存中的数据,同时判断是不是停止CPU的工作`s2:beginpc_en=1'b0;ir_en=1'b0;alu_en=1'b0;data_en=1'b1;p_d_en=1'b1;out_en=1'b0;load_a=1'b0;if(ir[7:4]==`HLT)beginstate=`s5;endelsebeginstate=`s3;endend//ALU处理数据`s3:beginpc_en=1'b0;ir_en=1'b0;alu_en=1'b1;data_en=1'b0;p_d_en=1'b1;out_en=1'b0;load_a=1'b0;state=`s4;end//ALU的结果输出到累加器,//并且如果`A_to_OUTREG有效,则同时把累加器输出到寄存器`s4:beginpc_en=1'b0;ir_en=1'b0;alu_en=1'b0;data_en=1'b0;p_d_en=1'b1;load_a=1'b1;state=`s0;if(ir[7:4]==`A_to_OUTREG)beginout_en=1'b1;endelsebeginout_en=1'b0;endend//通过状态锁存和使能信号清零来实现停止CPU工作`s5:beginpc_en=1'b0;ir_en=1'b0;alu_en=1'b0;data_en=1'b0;p_d_en=1'b0;out_en=1'b0;load_a=1'b0;state=`s5;endendcaseendend//ROM,存储数据和指令,输入地址可以直接得到相应的内存输出always@(*)begincase(pc_or_data)//指令(共8位:高四位为指令,低四位为数据地址)//内存to累加器4'b0000:rom_out=8'b0001_1100;//加4'b0001:rom_out=8'b0010_1101;//累加器输出到寄存器4'b0010:rom_out=8'b1000_1101;//内存to累加器4'b0011:rom_out=8'b0001_1110;//减4'b0100:rom_out=8'b0100_1111;//累加器输出到寄存器4'b0101:rom_out=8'b1000_1111;//停止CPU工作4'b0110:rom_out=8'b0000_1100;//无用指令,不会执行4'b0111:rom_out=8'b0000_1100;4'b1000:rom_out=8'b0000_1100;4'b1001:rom_out=8'b0000_1100;4'b1010:rom_out=8'b0000_1100;4'b1011:rom_out=8'b0000_1100;//数据4'b1100:rom_out=8'b0111_1010;4'b1101:rom_out=8'b1000_0101;4'b1110:rom_out=8'b0111_1111;4'b1111:rom_out=8'b0000_1111;default:rom_out=8'b0001_1100;endcaseendendmodule
本文标题:简易CPU模型设计 verilog
链接地址:https://www.777doc.com/doc-3847865 .html