根据java代码画状态图,来自8位处理器的verilog代码的状态转换图

这篇博客详细介绍了如何从给定的Verilog代码构建一个状态转换图。代码涉及一个ExecutionUnitControlLogic模块,该模块处理不同操作码如加法、减法、移位等,并通过状态机来控制内存访问、ALU操作和程序计数器更新。状态机有多个状态,根据操作码和条件来决定执行路径,例如,当遇到分支指令时,会检查标志并可能改变程序计数器的值。
摘要由CSDN通过智能技术生成

我正在尝试从下面的verilog代码制作状态转换图,但有一些困难 .

//Execution Unit Control Logic

模块eucl(时钟,op1,op2,op3,数据,操作码,数据输出,p_c,output_pc,en_ram,wram,str,load_ram);

输入[7:0] p_c; // PC的输入值

输入[2:0] op1,op2,op3; //操作数

输入[3:0]操作码;

output [7:0] output_pc; // PC的输出值

输入[7:0]数据;

电线[3:0]标志;

输出reg en_ram,wram,str,load_ram;

reg [7:0]分支;

reg p_c_val,check_branch;

输入时钟;

输出[7:0]数据输出;

reg ld,write,enable_alu,en_Memory;

reg [2:0] addr;

reg [2:0] control_bus;

reg [4:0] state = 5'b00000; //状态机

assign output_pc = check_branch? branch:p_c p_c_val;

初始

开始

分支= 0;

p_c_val = 0;

check_branch = 0;

load_ram = 0;

STR = 0;

LD = 0;

写= 0;

enable_alu = 0;

en_Memory = 0;

WRAM = 0;

en_ram = 0;

结束

execution_unit EU(.ld(ld),. clock(clock),. write(write),. enable_alu(enable_alu),. en_Memory(en_Memory), . addr(addr),. indata(data),. outdata(dataout) ,.fn_sel(control_bus),. flag_register(标志));

总是@(posedge clock)

开始

check_branch <= 0;

LD <= 0;

写<= 0;

enable_alu <= 0;

en_Memory <= 0;

p_c_val <= 0;

wram <= 0;

en_ram <= 0;

branch <= data;

load_ram <= 0;

str <= 0;

if(state == 5'b01111)//增加程序计数器的值

开始

状态<= 5'b00000; //重置为零状态

p_c_val <= 1;

结束

else if(state == 5'b11111)//分支

开始

check_branch <= 1;

州<= 5'b00000;

结束

否则if(opcode == 4'b0001)//从op1移动到op2

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1; //启用内存进行读取

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= op2;

en_Memory <= 1;

写<= 1;

州<= 5'b01111; //增加PC

结束

结束

否则if(opcode == 4'b0010)//加载到内存

开始

if(state == 5'b00000)

开始

addr <= op1;

ld <= 1; //加载内存

en_Memory <= 1;

写<= 1;

州<= 5'b01111;

结束

结束

否则如果(操作码== 4'b0011)//添加

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= 3'b000; //将op1写入R0

en_Memory <= 1;

写<= 1;

州<= 5'b00010;

结束

否则if(state == 5'b00010)

开始

addr <= op2;

en_Memory <= 1;

州<= 5'b00011;

结束

否则if(state == 5'b00011)

开始

addr <= 3'b001; //将op2写入R1

en_Memory <= 1;

写<= 1;

州<= 5'b00100;

结束

否则if(state == 5'b00100)

开始

control_bus <= 3'b000;

enable_alu <= 1;

州<= 5'b00101;

结束

否则if(state == 5'b00101)

开始

addr <= 3'b000; //读取存储在R0中的值(标准输出寄存器)

en_Memory <= 1;

州<= 5'b00110;

结束

否则如果(州== 5'b00110)

开始

addr <= op3; //将R0的值写入op3

en_Memory <= 1;

写<= 1;

州<= 5'b01111;

结束

结束

否则if(opcode == 4'b0100)//减去

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= 3'b000;

en_Memory <= 1;

写<= 1;

州<= 5'b00010;

结束

否则if(state == 5'b00010)

开始

addr <= op2;

en_Memory <= 1;

州<= 5'b00011;

结束

否则if(state == 5'b00011)

开始

addr <= 3'b001;

en_Memory <= 1;

写<= 1;

州<= 5'b00100;

结束

否则if(state == 5'b00100)

开始

control_bus <= 3'b001;

enable_alu <= 1;

州<= 5'b00101;

结束

否则if(state == 5'b00101)

开始

addr <= 3'b000;

en_Memory <= 1;

州<= 5'b00110;

结束

否则如果(州== 5'b00110)

开始

addr <= op3;

en_Memory <= 1;

写<= 1;

州<= 5'b01111;

结束

结束

否则如果(操作码== 4'b0101)//和

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= 3'b000;

en_Memory <= 1;

写<= 1;

州<= 5'b00010;

结束

否则if(state == 5'b00010)

开始

addr <= op2;

en_Memory <= 1;

州<= 5'b00011;

结束

否则if(state == 5'b00011)

开始

addr <= 3'b001;

en_Memory <= 1;

写<= 1;

州<= 5'b00100;

结束

否则if(state == 5'b00100)

开始

control_bus <= 3'b010;

enable_alu <= 1;

州<= 5'b00101;

结束

否则if(state == 5'b00101)

开始

addr <= 3'b000;

en_Memory <= 1;

州<= 5'b00110;

结束

否则如果(州== 5'b00110)

开始

addr <= op3;

en_Memory <= 1;

写<= 1;

州<= 5'b01111;

结束

结束

否则如果(操作码== 4'b0110)//或

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= 3'b000;

en_Memory <= 1;

写<= 1;

州<=5'b00010;

结束

否则if(state == 5'b00010)

开始

addr <= op2;

en_Memory <= 1;

州<= 5'b00011;

结束

否则if(state == 5'b00011)

开始

addr <= 3'b001;

en_Memory <= 1;

写<= 1;

州<= 5'b00100;

结束

否则if(state == 5'b00100)

开始

control_bus <= 3'b011;

enable_alu <= 1;

州<= 5'b00101;

结束

否则if(state == 5'b00101)

开始

addr <= 3'b000;

en_Memory <= 1;

州<= 5'b00110;

结束

否则如果(州== 5'b00110)

开始

addr <= op3;

en_Memory <= 1;

写<= 1;

州<= 5'b01111;

结束

结束

否则如果(操作码== 4'b0111)//左移

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= 3'b000;

en_Memory <= 1;

写<= 1;

州<= 5'b00010;

结束

否则if(state == 5'b00010)

开始

control_bus <= 3'b100;

enable_alu <= 1;

州<= 5'b00011;

结束

否则if(state == 5'b00011)

开始

addr <= 3'b000;

en_Memory <= 1;

州<= 5'b00100;

结束

否则if(state == 5'b00100)

开始

addr <= op1;

en_Memory <= 1;

写<= 1;

州<= 5'b01111;

结束

结束

否则如果(操作码== 4'b1000)//右移

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= 3'b000;

en_Memory <= 1;

写<= 1;

州<= 5'b00010;

结束

否则if(state == 5'b00010)

开始

control_bus <= 3'b101;

enable_alu <= 1;

州<= 5'b00011;

结束

否则if(state == 5'b00011)

开始

addr <= 3'b000;

en_Memory <= 1;

州<= 5'b00100;

结束

否则if(state == 5'b00100)

开始

addr <= op1;

en_Memory <= 1;

写<= 1;

州<= 5'b01111;

结束

结束

else if(opcode == 4'b1001)//从内存中存储到RAM中

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

en_ram <= 1;

wram <= 1;

str <= 1; // DATA_OUT

州<= 5'b01111;

结束

结束

否则if(opcode == 4'b1010)//比较标志如果op1> op2

开始

if(state == 5'b00000)

开始

addr <= op1;

en_Memory <= 1;

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

addr <= 3'b000;

en_Memory <= 1;

写<= 1;

州<= 5'b00010;

结束

否则if(state == 5'b00010)

开始

addr <= op2;

en_Memory <= 1;

州<= 5'b00011;

结束

否则if(state == 5'b00011)

开始

addr <= 3'b001;

en_Memory <= 1;

写<= 1;

州<= 5'b00100;

结束

否则if(state == 5'b00100)

开始

control_bus <= 3'b110;

enable_alu <= 1;

州<= 5'b01111;

结束

结束

else if(opcode == 4'b1011)//如果更大则分支

开始

if(state == 5'b00000)

开始

if(flag [1])

州<= 5'b11111; //科

其他

州<= 5'b01111; //不要分支

结束

结束

否则if(opcode == 4'b1100)//如果为零则分支

开始

if(state == 5'b00000)

开始

if(flag [0])

州<= 5'b11111;

其他

州<= 5'b01111;

结束

结束

否则if(操作码== 4'b1101)//分支如果移出位

开始

if(state == 5'b00000)

开始

if(flag [2])

州<= 5'b11111;

其他

州<= 5'b01111;

结束

结束

否则if(opcode == 4'b1110)//从RAM加载到内存

开始

if(state == 5'b00000)

开始

en_ram <= 1;

load_ram <= 1; //从RAM读取

州<= 5'b00001;

结束

否则if(state == 5'b00001)

开始

load_ram <= 1;

addr <= op1;

ld <= 1;

en_Memory <= 1;

写<= 1; //写入内存

州<= 5'b01111;

结束

结束

else if(opcode == 4'b1111)//立即加载到RAM

开始

en_ram <= 1;

wram <= 1;

州<= 5'b01111;

结束

结束

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值