指令译码器

module no2(input en,input[7:0] ins,output  reg mova, movb, movc,add , sub , and1,not1, rsr , rsl ,jmp , jz  , jc  ,inl , outl, nop ,halt
);
always@(en,ins)
begin
{mova, movb, movc, add, sub, and1, not1, rsr, rsl, jmp, jz, jc, inl, outl, nop, halt} = 0;
{mova,movb,movc,add,sub,and1,not1,rsr,rsl,jmp,jz,jc,inl,outl,nop,halt}=0;mova = (ins[7:4] == 4'b1100) && (ins[3:2]!=2'b11) && (ins[1:0]!=2'b11);movb = (ins[7:4] == 4'b1100) && (ins[3:2]==2'b11);movc = (ins[7:4] == 4'b1100) && (ins[1:0]==2'b11);add   = (ins[7:4] == 4'b1001);sub   = (ins[7:4] == 4'b0110);and1  = (ins[7:4] == 4'b1011);not1  = (ins[7:4] == 4'b0101);rsr = (ins[7:4] == 4'b1010) && (ins[1:0]==2'b00);rsl = (ins[7:4] == 4'b1010) && (ins[1:0]==2'b11);jmp = (ins == 8'b00110000);jz  = (ins == 8'b00110001);jc  = (ins == 8'b00110010);inl  = (ins[7:4] == 4'b0010);outl = (ins[7:4] == 4'b0100);nop  = (ins == 8'b01110000);halt = (ins == 8'b10000000);
end
endmodule 

控制信号产生逻辑

module con_signal(mova,movb,movc,add,sub,and1,not1,rsr,rsl,jmp,jz,z,jc,c,in1,out1,nop,halt,ir,sm,reg_ra,reg_rb,madd,alu_s,pc_ld,pc_inc,reg_we,ram_xl,ram_dl,alu_m,shi_fbus,shi_flbus,shi_frbus,ir_ld,cf_en,zf_en,sm_en,in_en,out_en);input mova,movb,movc,add,sub,and1,not1,rsr,rsl,jmp,jz,z,jc,c,in1,out1,nop,halt,sm;
input [7:0] ir;
output pc_ld,pc_inc,reg_we,ram_xl,ram_dl,alu_m,shi_fbus,shi_flbus,shi_frbus,ir_ld,cf_en,zf_en,sm_en,in_en,out_en;
output [1:0] reg_ra,reg_rb,madd;
output [3:0] alu_s;reg pc_ld,pc_inc,reg_we,ram_xl,ram_dl,alu_m,shi_fbus,shi_flbus,shi_frbus,ir_ld,cf_en,zf_en,sm_en,in_en,out_en;
reg [1:0] reg_ra,reg_rb,madd;
reg [3:0] alu_s;always @(mova,movb,movc,add,sub,and1,not1,rsr,rsl,jmp,jz,z,jc,c,in1,out1,nop,halt,ir,sm)
beginreg_ra = ir[1:0];reg_rb = ir[3:2];madd = 2'b00;alu_s = 4'b0000;pc_ld = 1'b0;pc_inc = 1'b0;reg_we = 1'b0;ram_xl = 1'b0;ram_dl = 1'b0;alu_m = 1'b0;shi_fbus = 1'b0;shi_flbus = 1'b0;shi_frbus = 1'b0;ir_ld = 1'b0;cf_en = 1'b0;zf_en = 1'b0;sm_en = 1'b0;in_en = 1'b0;out_en = 1'b0;if(sm == 1'b1)begin//DLram_dl = movc | jmp | (jz&z) | (jc&c);  //XLram_xl = movb;                            //MADDmadd = {movb,movc};  //LD_PCpc_ld = jmp | (jz&z) | (jc&c);            //IN_PCpc_inc = (jz == 1'b1&&z == 1'b0)|(jc == 1'b1&&c == 1'b0);    //LD_IR//ir_ld = sm;                            //F_BUSshi_fbus = add | sub | and1 | not1 | out1 | mova | movb ; //FL_BUS  shi_flbus = rsl;                        //FR_BUSshi_frbus = rsr;                        //Malu_m = add | sub | and1 | not1 | rsr | rsl | out1 ;    //alu_s=ir[7:4];//S        if(add == 1'b1) alu_s = 4'b1001;                            else if(sub == 1'b1) alu_s = 4'b0110;else if(and1 == 1'b1) alu_s = 4'b1011;else if(not1 == 1'b1) alu_s = 4'b0101;else if(rsr == 1'b1 ||rsl ==1'b1) alu_s = 4'b1010;else if(out1 == 1'b1) alu_s = 4'b0100;else if(mova == 1'b1||movb == 1'b1) alu_s = 4'b1100;// /WEreg_we = out1 | movb | jmp | jz | jc | halt|nop;                    //RAA//if(add == 1'b1||sub == 1'b1||and1 == 1'b1||mova == 1'b1||movb == 1'b1) reg_ra = ir[1:0];//RWBA//if(add == 1'b1||sub == 1'b1||and1 == 1'b1||not1 == 1'b1||rsr ==1'b1||rsl == 1'b1||in1 == 1'b1||out1 == 1'b1||mova == 1'b1||movc == 1'b1) reg_rb = ir[3:2];//CF_ENcf_en = add | sub | rsr | rsl;       //ZF_EN    zf_en = add | sub;                    //SM_EN    sm_en = ~halt;                        //IN_EN    in_en = in1;                        //OUT_EN    out_en = out1;                            endelse //quzhibegin  ram_dl = 1'b1;  //DLpc_inc = 1'b1;  //IN_PCir_ld = 1'b1;   //LD_IRreg_we = 1'b1;  // /WEsm_en = 1'b1;   //SM_ENend
end
endmodule

SM

module SM1(input clk,sm_en,output reg sm
);
always@(negedge clk)
beginif(sm_en==1)begin sm<=~sm;end
end
endmodule 

IR指令寄存器

module IR(
input clk,ir_id,
input [7:0] d,
output reg [7:0] ir
);
always@(negedge clk)
begin if(ir_id==1)beginir<=d;end
end
endmodule

八重3-1选择器 又名多路选择器

module select831(
input wire [7:0] a,b,c,
input wire [1:0] madd,
output reg [7:0] y
);
always@(a,b,c,madd)begin y=8'b00000000;case(madd)2'b00: y=a;2'b01: y=b;2'b10: y=c;default: y=a;endcaseend
endmodule

PC计数器

module PC(
input clk,pc_id,pc_inc,
input [7:0] a,
output  [7:0] add
);
reg [7:0] temp=8'b00000000;
always@(negedge clk)
beginif(pc_inc==1 && pc_id==0)begintemp<=temp+1'b1;endif(pc_inc==0 && pc_id==1)begintemp<=a;end
endassign add=temp;
endmodule

reg_group寄存器

module reg_group(input wire clk,we,input wire [1:0] raa,rwba,input wire [7:0] i,output reg [7:0] s,d,output reg [7:0] a,b,c);
initial c=8'b10000000;
always @(raa or a or b or c)
begincase(raa)2'b00: s=a;2'b01: s=b;2'b10: s=c;default: s=c;endcase
endalways @(rwba or a or b or c) begincase(rwba)2'b00: d=a;2'b01: d=b;2'b10: d=c;default: d=c;endcase
endalways @(negedge clk) beginif(~we) begincase(rwba)2'b00: a<=i;2'b01: b<=i;2'b10: c<=i;endcaseend
end
endmodule

ALU运算器

module alu1(input wire m,
input wire [3:0] s,
input wire[7:0] a,
input wire[7:0] b,
output reg [7:0] t,
output reg cf,zf);
always@(m,s,a,b)
beginif(m==1) begincase(s)4'b1001:begin{cf,t}=a+b;if(t==8'b00000000)zf=1;else zf=0;end4'b0110:begin{cf,t}=b-a;if(t==8'b00000000)zf=1;else zf=0;end4'b1011:begint=a&b;cf=0;zf=0;end4'b0101:begint=~b;cf=0;zf=0;end//4'b1100:// begin//     t=a;//     cf=0;//        zf=0;//    end4'b1010: begint=b;cf=0;zf=0;end4'b0100:begint=b;cf=0;zf=0;enddefault:begint=8'b00000000;cf=0;zf=0;endendcaseendelsebegint=a;cf=0;zf=0;end//else//begin//  t=8'b00000000;//  cf=0;//    zf=0;//endendendmodule

结果分析及结论:
ADD R1,R2 (R1)+(R2)→ R1 1001 R1 R2
SUB R1,R2 (R1)-(R2)→ R1 0110 R1 R2
OR R1,R2 (R1)∨(R2)→ R1 1011 R1 R2
NOT R1 /(R1)→ R1 0101 R1 XX
NOT R2 /(R2)→ R2 1100 XX R2
RSR R1 (R1)循环右移一位→ R1 1010 R1 00
RSL R1 (R1)循环左移一位→ R1 1010 R1 11
0~10ns
s=1001,执行相加操作,结果为 00000001+11111111,有进位,cf=1,和为零,zf=1
10~20ns 和 20`30ns
s=1001,执行相加操作,结果为 00000001+00000001,无进位,cf=0,和不为零,zf=0
30~40ns
s=1001,执行相加操作,结果为 00000000+00000000,无进位,cf=0,和为零,zf=1
40~50ns
s=0110,执行相减操作,结果为 00000000-00000001,有借位,cf=1,差不为零,zf=0
50~60ns
s=0110,执行相减操作,结果为 00000011-00000001,无借位,cf=0,差不为零,zf=0
60~70ns
s=0110,执行相减操作,结果为 00000011-00000011,无借位,cf=0,差为零,zf=1
70~90ns 同理为上述两种情况
90~110ns
S=1011,a&b 操作,结果正确,cf 和 zf 无影响,都为 0
120~130ns
s=0101,执行 NOT 操作,输入 b=00000000 的结果为 11111111
130~140ns
S=1100,执行 NOT 操作,输入 a=00001100 的结果为 11110011
s=1110,执行 OR 操作,结果为 11111111
s=1010,执行移位操作,结果为 10101011:移位有专门的部件,这里要求输出输入的原值
结论:各个模块正确,功能实现正常

移位逻辑

module logic_yi_wei(
input wire [7:0] a,
input wire fbus,flbus,frbus,
output reg cf,
output reg [7:0] w
);
always @(a or fbus or flbus or frbus) begincf=1'b0;w=8'b00000000;if(fbus==1 && flbus==0 &&frbus==0)w=a;else if(fbus==0 && flbus==1 &&frbus==0) beginw={a[6:0],a[7]};cf=a[7];endelse if(fbus==0 && flbus==0 &&frbus==1) beginw={a[0],a[7:1]};cf=a[0];endelse if(fbus==0 && flbus==0 && frbus==0)beginw=8'bZZZZZZZZ;endend
endmodule

PSW

module PSW(
input clk,cf_en,zf_en,cf,zf,
output reg c,z
);always@(negedge clk)
beginif(cf_en==1)beginc<=cf;endif(zf_en==1)beginz<=zf;end
end
endmodule 

引脚分配下板子

 

指令解析:
0 : JMP 04H (00110000 00000100) (30H 04H)
4: IN A (00100000) (20H)
A=10000011(83H) (注: A 中的 83H 是由外部输入的)
5: MOVC B (11000111)(C7H)
1 ) C 中存放 10000000(80H) ,在通用寄存器组对 C 初始化的值
2 )在 RAM 的 10000000 (
128 )单元存放 10000011 ( 83H )
6: SUB A,B (01100001)(61H)
A=00000000(00H), Z=1
7: JZ 10H (00110001 00010000) (31H 10H)
9: HALT(10000000)
16: NOT A (01010000)(50H)
A=11111111(FFH)
AND A,C (10110010)(B2H)
A=10000000(80H)
ADD A,B (10010001)(91H)
A=00000011(03H),C=1
JC 18H (00110010 00011000)(32H 18H)
24: NOP (01110000) (70H)
RSR A (10100000) (A0H)
A=10000001(81H)
MOV B,A (11000100) (C4H)
B=10000001(81H)
RSL B (10100111) (A7H)
B=00000011(03H)
OUT B (01000100) (44H)
输出为 00000011 ( 03H )
JMP 00000000 ( 00110000 00000000 ) (30H 00H)
操作过程:
C 初始化为 10000000 ,
RAM 的 10000000 单元存放 1000001 ( 1 83H )
, 如果外部输入 10000011 ,
那么 JZ 和 JC 都跳转成功,执行输出 OUT B ,输出为 00000011 ( 03H ),如果改变外部输入,使其不 为 10000011 ,那么 JZ 不成功,实现停机 HALT 。
有三组输出信号,分别是 bus_out , data_out , reg_out
两个输入信号,分别是 clk 时钟信号,还有 bus_in 总线输入

hnu数电实验(最终)Verilog各个模块代码(波形后续更新。。。)相关推荐

  1. 【杭电数电实验】verilog入门指北

    verilog入门指北 前言 指北内容 面向人群 基础实验 1-15 代码参考 正文 ISE 的安装 实验的基本操作流程 可能出现的问题 创建工程闪退 希望删除某一文件,实际上并没有删除 如何编写测试 ...

  2. 【数电实验7】Verilog—外星萤火虫

    [2022.05西南交大数电实验] [本代码及波形已通过老师验收.仅供参考.] [参考博客:[数电实验]外星萤火虫设计_难凉oh的博客-CSDN博客] [建议:有些口语化的注释看完删掉比较好哈,怕老师 ...

  3. 数电实验4:彩灯控制器设计

    数电实验4:彩灯控制器设计 一.实验目的 二.实验内容 三.预习要求 四.实验报告要求 五.Verilog代码.RTL视图及仿真波形 1.Verilog代码 2.RTL视图 3.仿真波形 西南交大数电 ...

  4. 数电实验报告实验一_大二下学期的两三事之数电实验amp;课设

    数电实验&课设 叮 写在前面 这学期的数电实验老师是陈W老师.上学期的模电,选过一次他的课,线下教学,老师讲课游刃自如,点到为止,但又醍醐灌顶:这学期线上教学,可能是软件运用不熟练,他多少有些 ...

  5. 北邮数电实验三接球小游戏

    文章目录 前言 一.实验要求 二.设计思路 三.设计系统框图 四.源代码 五.遇到的问题和解决办法 六.总结 前言 北邮数电实验三"接球小游戏" 数电实验验收已经结束了,实验报告也 ...

  6. 数电实验6:可控分频器设计

    数电实验6:可控分频器设计 一.实验目的 二.基本实验内容 三.提高性实验内容(选做) 四.预习实验 五.实验报告要求 六.内容讲解(基础实验内容) 七.testbench及仿真结果 1.testbe ...

  7. 数电实验三 数据选择器及其应用 任务一:用74151芯片采用降维的方法实现F=ABC+ABD+ACD+BCD; 任务二:用74151芯片采用降维方式实现F=BCD反+BC反+A反D;

    数电实验三 数据选择器及其应用 任务一:用74151芯片采用降维的方法实现F=ABC+ABD+ACD+BCD; 任务二:用74151芯片采用降维方式实现F=BCD反+BC反+A反D: 实验数据单

  8. 数电实验(一)利用与非门设计四舍五入判别电路

    数电实验(一)利用与非门设计四舍五入判别电路 要求: 1.输入为8421BCD码,接四个逻辑电平开关,同时接数码管. 2.输出和LED相连. 一.写出逻辑函数: F(A,B,C,D)=∑m(5,6,7 ...

  9. c语言离散卷积编程,数电实验一 离散卷积的C语言编程.ppt

    数电实验一 离散卷积的C语言编程.ppt 实验一 离散卷积的C语言编程实验,DSP实验室,实验性质,综合设计性实验,实验目的,1 了解和认识常用的各种信号: 2 掌握卷积的定义和计算方法: 3 掌握在 ...

最新文章

  1. bzoj1688[Usaco2005 Open]Disease Manangement 疾病管理*
  2. 解决Echarts窗口自适应失效问题
  3. hdu 1881 毕业bg
  4. 绿联网卡转接mac设置_物联网卡这样设置一下上网全程4G!建议收藏!
  5. 笔记·mybatis核心对象和全局配置文件
  6. 几何画板自定义工具_用好神奇的数学工具--几何画板,轻松作出复杂的几何图形...
  7. SDRAM控制器设计
  8. 无法将该对象添加到ldap服务器_LDAP 基础知识
  9. HDFView 3.1.2 在WIN10系统安装后打开出现黑框闪退的解决方法
  10. Keras-5 基于 ImageDataGenerator 的 Data Augmentation实现
  11. 大神干货:腾讯广告算法大赛亚军女极客生存图鉴
  12. HTML5 Notification
  13. 图像局部特征(十八)--BOW
  14. 为什么品质一直做不好?因为法方有问题
  15. 串口转以太网产品选型指南
  16. 使用Cloudflare给域名添加跳转/301重定向
  17. mysql wait for flush,Mysql线程大量Wating For table flush问题分析
  18. sinon.stub_JavaScript测试工具对决:Sinon.js vs testdouble.js
  19. 数学之美:维特比和维特比算法
  20. 昔日深圳打工妹周群飞或成中国新女首富

热门文章

  1. 旋转矩阵变换左右手系
  2. 微信公众平台之使用PPT制作图片
  3. 电影《悟空传》中的管理知识
  4. jedispool 为redis保驾护航
  5. linux学习——echo -n 和echo -e 参数意义
  6. 差分隐私(Differential Privacy)
  7. 邮件常见异常:javax.mail.MessagingException: Could not connect to SMTP host
  8. 214情人节,使用微信小程序【信鸽相知】写情书吧
  9. 【matlab】matlab中的大小写转换
  10. 路径追踪相关的一些内容