always@(posedge clock or negedge reset)//process each status of each instruction begin if(reset==1'b0) begin IR=0; PC=0; R0= 8'b00000000;//reset operation,补充完整 R1= 8'b00000000; R2= 8'b00000000; R3= 8'b00000000; end else if (clock==1'b1) begin case (status) 3'b000: begin IR={M_data_in,8'b00000000}; PC=PC+12'b000000000001; OP = IR[15:12]; Rx = IR[11:10]; Ry = IR[9:8]; end // status 0, fetch instruction 3'b001: begin //status 1 case(OP) load: R0={4'b0000,IR[11:8]}; shl: case(Rx)//左移 2'b00:R0=R0<<1; 2'b01:R1=R1<<1; 2'b10:R2=R2<<1; 2'b11:R3=R3<<1; endcase shr: case(Rx)//右移 2'b00:R0=R0>>1; 2'b01:R1=R1>>1; 2'b10:R2=R2>>1; 2'b11:R3=R3>>1; endcase move:case(Rx)//赋值 2'b00:R0=A; 2'b01:R1=A; 2'b10:R2=A; 2'b11:R3=A; endcase add: case(Rx)//相加 2'b00: begin temp = {R0[7],R0[7:0]} + {A[7],A[7:0]}; R0 = temp[7:0]; end 2'b01: begin temp = {R1[7],R1[7:0]} + {A[7],A[7:0]}; R1 = temp[7:0]; end 2'b10: begin temp = {R2[7],R2[7:0]} + {A[7],A[7:0]}; R2 = temp[7:0]; end 2'b11: begin temp = {R3[7],R3[7:0]} + {A[7],A[7:0]}; R3 = temp[7:0]; end endcase sub: case(Rx)//相减 2'b00: begin temp = {R0[7],R0[7:0]} - {A[7],A[7:0]}; R0 = temp[7:0]; end 2'b01: begin temp = {R1[7],R1[7:0]} - {A[7],A[7:0]}; R1 = temp[7:0]; end 2'b10: begin temp = {R2[7],R2[7:0]} - {A[7],A[7:0]}; R2 = temp[7:0]; end 2'b11: begin temp = {R3[7],R3[7:0]} - {A[7],A[7:0]}; R3 = temp[7:0]; end endcase请帮我给这段代码加上完整注释
时间: 2024-03-30 09:37:04 浏览: 50
internal_reset.v.rar_fpga reset_reset
下面是对这段代码的完整注释:
```verilog
always@(posedge clock or negedge reset)
// 在时钟上升沿或复位下降沿时执行
begin
if(reset==1'b0)
// 如果复位信号为低电平
begin
IR=0;
// 指令寄存器清零
PC=0;
// 程序计数器清零
R0= 8'b00000000;
// 4个通用寄存器清零
R1= 8'b00000000;
R2= 8'b00000000;
R3= 8'b00000000;
end
else if (clock==1'b1)
// 如果时钟信号为高电平
begin
case (status)
// 根据状态机的状态进行相应操作
3'b000:
// 状态0,取指令
begin
IR={M_data_in,8'b00000000};
// 从存储器中取出指令到指令寄存器中
PC=PC+12'b000000000001;
// 程序计数器加1
OP = IR[15:12];
// 取出指令的操作码
Rx = IR[11:10];
// 取出指令的寄存器编号
Ry = IR[9:8];
// 取出指令的寄存器编号
end
3'b001:
// 状态1,执行指令
begin
case(OP)
// 根据指令的操作码进行相应操作
load: R0={4'b0000,IR[11:8]};
// 将指令的低4位存入R0寄存器
shl:
// 左移指令
case(Rx)
// 根据Rx指定的寄存器进行相应操作
2'b00:R0=R0<<1;
// R0左移1位
2'b01:R1=R1<<1;
// R1左移1位
2'b10:R2=R2<<1;
// R2左移1位
2'b11:R3=R3<<1;
// R3左移1位
endcase
shr:
// 右移指令
case(Rx)
// 根据Rx指定的寄存器进行相应操作
2'b00:R0=R0>>1;
// R0右移1位
2'b01:R1=R1>>1;
// R1右移1位
2'b10:R2=R2>>1;
// R2右移1位
2'b11:R3=R3>>1;
// R3右移1位
endcase
move:
// 赋值指令
case(Rx)
// 根据Rx指定的寄存器进行相应操作
2'b00:R0=A;
// 将A寄存器的值存入R0
2'b01:R1=A;
// 将A寄存器的值存入R1
2'b10:R2=A;
// 将A寄存器的值存入R2
2'b11:R3=A;
// 将A寄存器的值存入R3
endcase
add:
// 相加指令
case(Rx)
// 根据Rx指定的寄存器进行相应操作
2'b00:
begin
temp = {R0[7],R0[7:0]} + {A[7],A[7:0]};
// 将R0和A的低8位相加,结果存入temp中
R0 = temp[7:0];
// 将temp的低8位存入R0
end
2'b01:
begin
temp = {R1[7],R1[7:0]} + {A[7],A[7:0]};
// 将R1和A的低8位相加,结果存入temp中
R1 = temp[7:0];
// 将temp的低8位存入R1
end
2'b10:
begin
temp = {R2[7],R2[7:0]} + {A[7],A[7:0]};
// 将R2和A的低8位相加,结果存入temp中
R2 = temp[7:0];
// 将temp的低8位存入R2
end
2'b11:
begin
temp = {R3[7],R3[7:0]} + {A[7],A[7:0]};
// 将R3和A的低8位相加,结果存入temp中
R3 = temp[7:0];
// 将temp的低8位存入R3
end
endcase
sub:
// 相减指令
case(Rx)
// 根据Rx指定的寄存器进行相应操作
2'b00:
begin
temp = {R0[7],R0[7:0]} - {A[7],A[7:0]};
// 将R0和A的低8位相减,结果存入temp中
R0 = temp[7:0];
// 将temp的低8位存入R0
end
2'b01:
begin
temp = {R1[7],R1[7:0]} - {A[7],A[7:0]};
// 将R1和A的低8位相减,结果存入temp中
R1 = temp[7:0];
// 将temp的低8位存入R1
end
2'b10:
begin
temp = {R2[7],R2[7:0]} - {A[7],A[7:0]};
// 将R2和A的低8位相减,结果存入temp中
R2 = temp[7:0];
// 将temp的低8位存入R2
end
2'b11:
begin
temp = {R3[7],R3[7:0]} - {A[7],A[7:0]};
// 将R3和A的低8位相减,结果存入temp中
R3 = temp[7:0];
// 将temp的低8位存入R3
end
endcase
end // end of case
end // end of if
end // end of always
```
阅读全文