- module ppblaze(clk,rst,port_id,out_port);
- /***** *****/
- input clk,rst;
- output[7:0] port_id;
- output[7:0] out_port;
- //--- ---
- wire [9:0] address;
- wire [17:0] instruction;
- wire [5:0] cmd;//just for simulate
- assign cmd = instruction[17:12];
- /*** ***/
- reg clk_div2;
- always @(posedge clk or posedge rst) begin
- if(rst) clk_div2 <= 1'd0;
- else clk_div2 <= ~clk_div2;
- end
- /*** ****/
- reg pc_sel,rs1_sel,rs1_load,id_load,out_load;
- always @(rst or instruction) begin
- if(rst) {pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00000;
- else
- case (instruction[17:12])
- 6'b000000:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00100;//load
- 6'b011000:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b01100;//add
- 6'b101100:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00011;//out
- 6'b110100:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b10000;//jump
- default:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00000;
- endcase
- end
- /*** pc control ***/
- reg [9:0] pc_r;
- always @(posedge clk_div2 or posedge rst) begin
- if(rst) pc_r <= 10'd0;
- else if(pc_sel) pc_r <= instruction[9:0];
- else pc_r <= pc_r + 1'd1;
- end
- assign address = pc_r;
- /*** rs1 regitor ***/
- reg[7:0] rs1;
- wire[7:0] rs1_data;
- wire[7:0] add_reault;
- assign rs1_data = rs1_sel ? add_reault:instruction[7:0];
- always @(posedge clk_div2 or posedge rst) begin
- if(rst) rs1 <= 8'd0;
- else if(rs1_load) rs1 <= rs1_data;
- end
- /*** add ***/
- assign add_reault = instruction[7:0] + rs1;
- /*** out instrution ***/
- reg[7:0] port_id;
- reg[7:0] out_port;
- always @(posedge clk_div2 or posedge rst) begin
- if(rst) {port_id,out_port} <= {8'd0,8'd0};
- else begin
- if(id_load) port_id <= instruction[7:0];
- if(out_load) out_port <= rs1;
- end
- end
- /*** ***/
- led program
- (
- .address(address),
- .instruction(instruction),
- .clk(clk));
- endmodule
Led program是使用汇编程序生成的RAM代码,verilog或VHDL格式都有,可以使用附件的KCPSM3汇编器生成,在DOS窗口下输入汇编器的当前路径,调用改汇编器即可。
Led program源代码很简单,仅包含四条语句,完成一个简单的流水灯程序(没有延时,实际用估计一闪而过了)。
- CONSTANT led, 01
- LOAD s1,01
- start:
- ADD s1,01
- OUTPUT s1,led
- JUMP start
我们先使用pBlazIDE编辑、仿真环境来仿真一下。pBlazIDE界面如下,还是比较美观的。pBlazIDE仿真的程序和编译的程序格式不大一样,这点需要注意,需要仿真程序是,从file菜单下选着导入即可。可以看到随着程序的运行,右边的led在逐渐变化。
接着我们做硬件仿真,在附件中提供了完整的仿真代码,包括测试激励和BlackRam库文件,打开modelsim,选着当前的路径后,在Transcipt中输入do run.do 即可看到仿真波形