不再赘述,直接上

mux

`timescale 1ns / 1ns
module mux(input [31:0] a,input [31:0] b,input choose,output reg [31:0] z);always @(*)begincase(choose)1'b1:z <= b;1'b0:z <= a;endcaseend
endmodule

mux5

`timescale 1ns / 1ns
module mux5(input [4:0] a,input [4:0] b,input [1:0] choose,output [4:0] z);reg [4:0] t_z;always @(*)begincase(choose)2'b01:t_z <= b;2'b00:t_z <= a;2'b10:t_z <= 5'b11111;2'b11:t_z <= 5'b11111;default:t_z <= 5'bz;endcaseendassign z = t_z;
endmodule

extend5

`timescale 1ns / 1ns
module extend5 #(parameter WIDTH = 5)(input [WIDTH - 1:0] a,output [31:0] b);assign b = {{(32 - WIDTH){1'b0}},a};
endmodule

extend16

`timescale 1ns / 1ns
module extend16 #(parameter WIDTH = 16)(input [WIDTH - 1:0] a,input sext,             //1表示有符号output [31:0] b);assign b = sext ? {{(32 - WIDTH){a[WIDTH - 1]}},a} : {{(32 - WIDTH){1'b0}},a};
endmodule

extend18

`timescale 1ns / 1ns
module extend18 (input [15:0] a,output [31:0] b);assign b = {{(32 - 18){a[15]}},a,2'b00};
endmodule

add

`timescale 1ns / 1ns
module add(input [31:0] a,input [31:0] b,output [31:0] r,output overflow);assign r=a+b;assign overflow=(a[31]==b[31]&&a[31]!=r[31])?1:0;
endmodule

add8(是+4没错

`timescale 1ns / 1ns
module add8(input [31:0] a,output [31:0] r);assign r=a+4;
endmodule

npc

`timescale 1ns / 1ns
module npc(input [31:0] a,input rst,output [31:0] r);assign r = rst ? a : a+4;
endmodule

pcreg(可以改进)

`timescale 1ns / 1ns
module pcreg(input clk,  //1 位输入,寄存器时钟信号,下降沿时为 PC 寄存器赋值input rst,  //1 位输入,异步重置信号,高电平时将 PC 寄存器清零//注:当 ena 信号无效时,rst 也可以重置寄存器input ena,  //1 位输入,有效信号高电平时 PC 寄存器读入 data_in的值,否则保持原有输出input [31:0] data_in,       //32 位输入,输入数据将被存入寄存器内部output [31:0] data_out  //32 位输出,工作时始终输出 PC寄存器内部存储的值);D_FF D0 (clk,data_in[0],ena,rst,data_out[0]);D_FF D1 (clk,data_in[1],ena,rst,data_out[1]);D_FF D2 (clk,data_in[2],ena,rst,data_out[2]);D_FF D3 (clk,data_in[3],ena,rst,data_out[3]);D_FF D4 (clk,data_in[4],ena,rst,data_out[4]);D_FF D5 (clk,data_in[5],ena,rst,data_out[5]);D_FF D6 (clk,data_in[6],ena,rst,data_out[6]);D_FF D7 (clk,data_in[7],ena,rst,data_out[7]);D_FF D8 (clk,data_in[8],ena,rst,data_out[8]);D_FF D9 (clk,data_in[9],ena,rst,data_out[9]);D_FF D10 (clk,data_in[10],ena,rst,data_out[10]);D_FF D11 (clk,data_in[11],ena,rst,data_out[11]);D_FF D12 (clk,data_in[12],ena,rst,data_out[12]);D_FF D13 (clk,data_in[13],ena,rst,data_out[13]);D_FF D14 (clk,data_in[14],ena,rst,data_out[14]);D_FF D15 (clk,data_in[15],ena,rst,data_out[15]);D_FF D16 (clk,data_in[16],ena,rst,data_out[16]);D_FF D17 (clk,data_in[17],ena,rst,data_out[17]);D_FF D18 (clk,data_in[18],ena,rst,data_out[18]);D_FF D19 (clk,data_in[19],ena,rst,data_out[19]);D_FF D20 (clk,data_in[20],ena,rst,data_out[20]);D_FF D21 (clk,data_in[21],ena,rst,data_out[21]);D_FF1 D22 (clk,data_in[22],ena,rst,data_out[22]);     //以00400000为基地址//D_FF D22 (clk,data_in[22],ena,rst,data_out[22]);        //以00000000为基地址D_FF D23 (clk,data_in[23],ena,rst,data_out[23]);D_FF D24 (clk,data_in[24],ena,rst,data_out[24]);D_FF D25 (clk,data_in[25],ena,rst,data_out[25]);D_FF D26 (clk,data_in[26],ena,rst,data_out[26]);D_FF D27 (clk,data_in[27],ena,rst,data_out[27]);D_FF D28 (clk,data_in[28],ena,rst,data_out[28]);D_FF D29 (clk,data_in[29],ena,rst,data_out[29]);D_FF D30 (clk,data_in[30],ena,rst,data_out[30]);D_FF D31 (clk,data_in[31],ena,rst,data_out[31]);
endmodulemodule D_FF1(input CLK,      //时钟信号,下降沿有效input D,        //输入信号 Dinput ENA,input RST_n,    //复位信号,高电平有效output reg Q1  //输出信号 Q);always @(posedge RST_n or posedge CLK) beginif(RST_n==1)Q1 <= 1;elsebeginif(ENA==1)Q1 <= D;endend
endmodule

alu

`timescale 1ns / 1ns
module alu(input [31:0] a,        //OP1input [31:0] b,        //OP2input [3:0] aluc,    //controlleroutput [31:0] r,    //resultoutput zero,output carry,output negative,output overflow);parameter Addu   =    4'b0000;    //r=a+b unsignedparameter Add    =    4'b0010;    //r=a+b signedparameter Subu   =    4'b0001;    //r=a-b unsignedparameter Sub    =    4'b0011;    //r=a-b signedparameter And    =    4'b0100;    //r=a&bparameter Or     =    4'b0101;    //r=a|bparameter Xor    =    4'b0110;    //r=a^bparameter Nor    =    4'b0111;    //r=~(a|b)parameter Lui1   =    4'b1000;    //r={b[15:0],16'b0}parameter Lui2   =    4'b1001;    //r={b[15:0],16'b0}parameter Slt    =    4'b1011;    //r=(a-b<0)?1:0 signedparameter Sltu   =    4'b1010;    //r=(a-b<0)?1:0 unsignedparameter Sra    =    4'b1100;    //r=b>>>a parameter Sll    =    4'b1110;    //r=b<<aparameter Srl    =    4'b1101;    //r=b>>aparameter Slr    =    4'b1111;    //r=b<<aparameter bits=31;parameter ENABLE=1,DISABLE=0;reg signed [32:0] result;reg [33:0] sresult;wire signed [31:0] sa=a,sb=b;always@(*)begincase(aluc)Addu: beginresult=a+b;sresult={sa[31],sa}+{sb[31],sb};endSubu: beginresult=a-b;sresult={sa[31],sa}-{sb[31],sb};endAdd: beginresult=sa+sb;endSub: beginresult=sa-sb;endSra: beginif(a==0) {result[31:0],result[32]}={b,1'b0};else {result[31:0],result[32]}=sb>>>(a-1);endSrl: beginif(a==0) {result[31:0],result[32]}={b,1'b0};else {result[31:0],result[32]}=b>>(a-1);endSll,Slr: beginresult=b<<a;endAnd: beginresult=a&b;endOr: beginresult=a|b;endXor: beginresult=a^b;endNor: beginresult=~(a|b);endSltu: beginresult=a<b?1:0;endSlt: beginresult=sa<sb?1:0;endLui1,Lui2: result = {b[15:0], 16'b0};default:result=a+b;endcaseendassign r=result[31:0];assign carry = (aluc==Addu|aluc==Subu|aluc==Sltu|aluc==Sra|aluc==Srl|aluc==Sll)?result[32]:1'bz; assign zero=(r==32'b0)?1:0;assign negative=result[31];assign overflow=(aluc==Add|aluc==Sub)?(sresult[32]^sresult[33]):1'bz;
endmodule

regfile(可以改进)

`timescale 1ns / 1ns
module regfile(input clk, //寄存器组时钟信号,下降沿写入数据input rst, //reset 信号,异步复位,高电平时全部寄存器置零input we, //寄存器读写有效信号,高电平时允许寄存器写入数据,低电平时允许寄存器读出数据input ov,input [4:0] raddr1, //所需读取的寄存器的地址input [4:0] raddr2, //所需读取的寄存器的地址input [4:0] waddr, //写寄存器的地址input [31:0] wdata, //写寄存器数据,数据在 clk 下降沿时被写入output [31:0] rdata1, //raddr1 所对应寄存器的输出数据output [31:0] rdata2 //raddr2 所对应寄存器的输出数据);wire [31:0] switch;wire [31:0] array_reg [31:0];reg c_o;always@(ov)begincase(ov)1'bz:c_o = 1;1'b1:c_o = 0;1'b0:c_o = 1;default:c_o=1;endcaseendDecoder dec (waddr,we&c_o,switch);assign array_reg[0] = 0;Pcreg Reg2 (clk,rst,switch[1],wdata,array_reg[1]);Pcreg Reg3 (clk,rst,switch[2],wdata,array_reg[2]);Pcreg Reg4 (clk,rst,switch[3],wdata,array_reg[3]);Pcreg Reg5 (clk,rst,switch[4],wdata,array_reg[4]);Pcreg Reg6 (clk,rst,switch[5],wdata,array_reg[5]);Pcreg Reg7 (clk,rst,switch[6],wdata,array_reg[6]);Pcreg Reg8 (clk,rst,switch[7],wdata,array_reg[7]);Pcreg Reg9 (clk,rst,switch[8],wdata,array_reg[8]);Pcreg Reg10 (clk,rst,switch[9],wdata,array_reg[9]);Pcreg Reg11 (clk,rst,switch[10],wdata,array_reg[10]);Pcreg Reg12 (clk,rst,switch[11],wdata,array_reg[11]);Pcreg Reg13 (clk,rst,switch[12],wdata,array_reg[12]);Pcreg Reg14 (clk,rst,switch[13],wdata,array_reg[13]);Pcreg Reg15 (clk,rst,switch[14],wdata,array_reg[14]);Pcreg Reg16 (clk,rst,switch[15],wdata,array_reg[15]);Pcreg Reg17 (clk,rst,switch[16],wdata,array_reg[16]);Pcreg Reg18 (clk,rst,switch[17],wdata,array_reg[17]);Pcreg Reg19 (clk,rst,switch[18],wdata,array_reg[18]);Pcreg Reg20 (clk,rst,switch[19],wdata,array_reg[19]);Pcreg Reg21 (clk,rst,switch[20],wdata,array_reg[20]);Pcreg Reg22 (clk,rst,switch[21],wdata,array_reg[21]);Pcreg Reg23 (clk,rst,switch[22],wdata,array_reg[22]);Pcreg Reg24 (clk,rst,switch[23],wdata,array_reg[23]);Pcreg Reg25 (clk,rst,switch[24],wdata,array_reg[24]);Pcreg Reg26 (clk,rst,switch[25],wdata,array_reg[25]);Pcreg Reg27 (clk,rst,switch[26],wdata,array_reg[26]);Pcreg Reg28 (clk,rst,switch[27],wdata,array_reg[27]);Pcreg Reg29 (clk,rst,switch[28],wdata,array_reg[28]);Pcreg Reg30 (clk,rst,switch[29],wdata,array_reg[29]);Pcreg Reg31 (clk,rst,switch[30],wdata,array_reg[30]);Pcreg Reg32 (clk,rst,switch[31],wdata,array_reg[31]);assign rdata1 = array_reg[raddr1];assign rdata2 = array_reg[raddr2];
endmodulemodule Decoder(input [4:0] iData,      input  iEna,            output [31:0] oData      );        assign oData=(iEna==1)?(32'b00000000000000000000000000000001<<iData):32'bx;
endmodulemodule Pcreg(input clk,  //1 位输入,寄存器时钟信号,下降沿时为 PC 寄存器赋值input rst,  //1 位输入,异步重置信号,高电平时将 PC 寄存器清零//注:当 ena 信号无效时,rst 也可以重置寄存器input ena,  //1 位输入,有效信号高电平时 PC 寄存器读入 data_in的值,否则保持原有输出input [31:0] data_in,       //32 位输入,输入数据将被存入寄存器内部output [31:0] data_out  //32 位输出,工作时始终输出 PC寄存器内部存储的值);D_FF d0 (clk,data_in[0],ena,rst,data_out[0]);D_FF d1 (clk,data_in[1],ena,rst,data_out[1]);D_FF d2 (clk,data_in[2],ena,rst,data_out[2]);D_FF d3 (clk,data_in[3],ena,rst,data_out[3]);D_FF d4 (clk,data_in[4],ena,rst,data_out[4]);D_FF d5 (clk,data_in[5],ena,rst,data_out[5]);D_FF d6 (clk,data_in[6],ena,rst,data_out[6]);D_FF d7 (clk,data_in[7],ena,rst,data_out[7]);D_FF d8 (clk,data_in[8],ena,rst,data_out[8]);D_FF d9 (clk,data_in[9],ena,rst,data_out[9]);D_FF d10 (clk,data_in[10],ena,rst,data_out[10]);D_FF d11 (clk,data_in[11],ena,rst,data_out[11]);D_FF d12 (clk,data_in[12],ena,rst,data_out[12]);D_FF d13 (clk,data_in[13],ena,rst,data_out[13]);D_FF d14 (clk,data_in[14],ena,rst,data_out[14]);D_FF d15 (clk,data_in[15],ena,rst,data_out[15]);D_FF d16 (clk,data_in[16],ena,rst,data_out[16]);D_FF d17 (clk,data_in[17],ena,rst,data_out[17]);D_FF d18 (clk,data_in[18],ena,rst,data_out[18]);D_FF d19 (clk,data_in[19],ena,rst,data_out[19]);D_FF d20 (clk,data_in[20],ena,rst,data_out[20]);D_FF d21 (clk,data_in[21],ena,rst,data_out[21]);D_FF d22 (clk,data_in[22],ena,rst,data_out[22]);D_FF d23 (clk,data_in[23],ena,rst,data_out[23]);D_FF d24 (clk,data_in[24],ena,rst,data_out[24]);D_FF d25 (clk,data_in[25],ena,rst,data_out[25]);D_FF d26 (clk,data_in[26],ena,rst,data_out[26]);D_FF d27 (clk,data_in[27],ena,rst,data_out[27]);D_FF d28 (clk,data_in[28],ena,rst,data_out[28]);D_FF d29 (clk,data_in[29],ena,rst,data_out[29]);D_FF d30 (clk,data_in[30],ena,rst,data_out[30]);D_FF d31 (clk,data_in[31],ena,rst,data_out[31]);
endmodulemodule D_FF(input CLK,      //时钟信号,下降沿有效input D,        //输入信号 Dinput ENA,input RST_n,    //复位信号,高电平有效output reg Q1  //输出信号 Q1);// 2020/03/29 有小伙伴指出这里可能有问题, negedge CLK, 请以仿真结果为准(博主无法进行仿真了)always @(posedge RST_n or posedge CLK)beginif(RST_n==1)Q1 = 0;elsebeginif(ENA==1)Q1 = D;endend
endmodule

II

`timescale 1ns / 1ns
module II(input [3:0] a,input [25:0] b,output [31:0] r);assign r = {a, b<<2};
endmodule

31条指令单周期cpu设计(Verilog)-(九)上代码→基本模块相关推荐

  1. 31条指令单周期cpu设计(Verilog)-(十)上代码→顶层模块设计总结

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 设计思路 按照预先设计好的数据通路图将各个模块连接起来 `timescale 1ns / 1ps mod ...

  2. 31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 指令译码器 我们需要根据一条32位的指令的结构确定是哪一条指令 可以根据操作码(op)以及功能码(fun ...

  3. 31条指令单周期cpu设计(Verilog)-(二)总体设计

    目录 31条指令单周期cpu设计(Verilog)-(一)相关软件 31条指令单周期cpu设计(Verilog)-(二)总体设计 31条指令单周期cpu设计(Verilog)-(三)指令分析      ...

  4. 31条指令单周期cpu设计(Verilog)-(七)整体代码结构

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 结构 sccpu:顶层模块 cpu_ins:指令译码器 cpu_opcode:控制器 其他均是基本模块( ...

  5. 31条指令单周期cpu设计(Verilog)-(三)指令分析

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 鸽鸽鸽... 指令分析流程 确定一条指令所需要的具体操作 分析该条指令涉及的部件 确定各个部件的输入输出 ...

  6. 31条指令单周期cpu设计(Verilog)-(四)数据输入输出关系表

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 表格作用 这张表用于设计整体的数据通路图 (在第二篇中已经给出来了),而这张总图是用于设计Verilog ...

  7. 31条指令单周期cpu设计(Verilog)-(六)指令操作时间表设计

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 这张表格又是干啥的呢(+_+)? 废话少说,用来设计控制器的 (红色方框) 设计流程  1.  表头为3 ...

  8. 31条指令单周期cpu设计(Verilog)-(一)相关软件

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 计算机组成原理课程终于结束了,由于以下均为课程学习过程中的内容,所以难免存在各种错误,各位大佬轻喷 相关软件 vivado ...

  9. 31条指令单周期cpu设计(Verilog)-(五)整体数据通路图设计

    说在前面 开发环境:Vivado 语言:Verilog cpu框架:Mips 控制器:组合逻辑 这张图是用来干啥的? 我们在用verilog实现这个cpu的时候,一般是先把各个部件单独写一个modul ...

最新文章

  1. python excel 操作
  2. java开发架构设计_跪了!阿里技术官出品:Java架构设计之完美,看完秒进大厂。...
  3. 重启服务器之home下文件全没,小白宝典——树莓派实用工具分享(大神绕路)
  4. 在线rss阅读聚合器lilina-0.7安装笔记
  5. 前端工程构建工具——Yeoman
  6. 计算机网络(二十四)-路由算法及路由协议
  7. Unity3d开发跳一跳-郑洪智-专题视频课程
  8. 小希的迷宫(请永远相信c语言的强大)
  9. 根据年度判断是否是闰年
  10. 动态生成实物文件思路
  11. C#一个方法返回多个值
  12. android 的User-Agen
  13. 鸿蒙大陆v2.8正式版,鸿蒙大陆2.2正式版附隐藏密码
  14. python处理word文档中的某页_Python快速设置Word文件中指定段落为目录标题
  15. Spark SQL PERCENTILE分析调研
  16. python绘制指数函数图像及性质_python实现画出e指数函数的图像
  17. 这四款超级实用的PC软件,你还没用过吗?
  18. 关于推特社交机器人数据集(来自上一篇论文)
  19. 年后跳槽全过程总结(上)——从面试准备到拿到offer
  20. Python 条件判断 If

热门文章

  1. box2d系列之 加冲力(impulse)
  2. 解除隐藏文件cmd命令_借用cmd命令法完美隐藏“私人文件”
  3. STM32系统时钟超详解
  4. 获取秒级股票详细数据——Ajax-hook
  5. 猿创征文|大数据开发必备的数据采集工具汇总
  6. matlab图片序列生成视频(亲测可用)
  7. offer来啦(签约解约 公司待遇)---转自应届生,大家注意看看哈!忽忽
  8. 猎头辅助企业招聘能给企业带来什么?
  9. HDU 2389(二分最大匹配优化算法,Hopcroft-Carp)
  10. 八字起大运php代码,八字排盘示例代码