在该项目中,提供了用于微控制器的澳门在线代码。这 微控制器 架构和指令集显示在 part 1 和 part 2.
首先是ALU单元的澳门在线代码:
// hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 澳门在线 project: 澳门在线 code for Microcontroller // 澳门在线 code for ALU module ALU( input [7:0] Operand1,Operand2, input E, input [3:0] Mode, input [3:0] CFlags, output [7:0] Out, output [3:0] Flags // the Z (zero), C (carry), S (sign),O (overflow) bits, from MSB to LSB, connected to status register ); wire Z,S,O; reg CarryOut; reg [7:0] Out_ALU; always @(*) 开始 case(Mode) 4'b0000: {CarryOut,Out_ALU} = Operand1 + Operand2; 4'b0001: 开始 Out_ALU = Operand1 - Operand2; CarryOut = !Out_ALU[7]; 结尾 4'b0010: Out_ALU = Operand1; 4'b0011: Out_ALU = Operand2; 4'b0100: Out_ALU = Operand1 & Operand2; 4'b0101: Out_ALU = Operand1 | Operand2; 4'b0110: Out_ALU = Operand1 ^ Operand2; 4'b0111: 开始 Out_ALU = Operand2 - Operand1; CarryOut = !Out_ALU[7]; 结尾 4'b1000: {CarryOut,Out_ALU} = Operand2 + 8'h1; 4'b1001: 开始 Out_ALU = Operand2 - 8'h1; CarryOut = !Out_ALU[7]; 结尾 4'b1010: Out_ALU = (Operand2 << Operand1[2:0])| ( Operand2 >> Operand1[2:0]); 4'b1011: Out_ALU = (Operand2 >> Operand1[2:0])| ( Operand2 << Operand1[2:0]); 4'b1100: Out_ALU = Operand2 << Operand1[2:0]; 4'b1101: Out_ALU = Operand2 >> Operand1[2:0]; 4'b1110: Out_ALU = Operand2 >>> Operand1[2:0]; 4'b1111: 开始 Out_ALU = 8'h0 - Operand2; CarryOut = !Out_ALU[7]; 结尾 default: Out_ALU = Operand2; 结尾case 结尾 assign O = Out_ALU[7] ^ Out_ALU[6]; assign Z = (Out_ALU == 0)? 1'b1 : 1'b0; assign S = Out_ALU[7]; assign Flags = {Z,CarryOut,S,O}; assign Out = Out_ALU; // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project 终端模块
接下来是数据存储器的澳门在线代码:
// hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 澳门在线 project: 澳门在线 code for Microcontroller // 澳门在线 code for data memory module DMem( input clk, input E, // Enable port input WE, // Write enable port input [3:0] Addr, // Address port input [7:0] DI, // Data input port output [7:0] DO // Data output port ); reg [7:0] data_mem [255:0]; // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project always @(posedge clk) 开始 if(E==1 && WE ==1) data_mem[Addr] <= DI; 结尾 assign DO = (E ==1 )? data_mem[Addr]:0; 终端模块
// 澳门在线 project: 澳门在线 code for microcontroller // Submodule: 澳门在线 code for Adder and MUXs module adder( input [7:0] In, output [7:0] Out ); assign Out = In + 1; 终端模块 module MUX1( input [7:0] In1,In2, input Sel, output [7:0] Out ); assign Out = (Sel==1)? In1: In2; 终端模块
继续输入程序存储器的澳门在线代码:
// 澳门在线 project: 澳门在线 code for microcontroller // Submodule: 澳门在线 code for Adder and MUXs// hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 澳门在线 project: 澳门在线 code for microcontroller module PMem( input clk, input E, // Enable port input [7:0] Addr, // Address port output [11:0] I, // Instruction port // 3 special ports are used to load program to the memory input LE, // Load enable port input[7:0] LA, // Load address port input [11:0] LI//Load instruction port ); reg [11:0] Prog_Mem[255:0] ; // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project always @(posedge clk) 开始 if(LE == 1) 开始 Prog_Mem[LA] <= LI; 结尾 结尾 assign I = (E == 1) ? Prog_Mem[Addr]: 0 ; 终端模块 module adder( input [7:0] In, output [7:0] Out ); assign Out = In + 1; 终端模块 module MUX1( input [7:0] In1,In2, input Sel, output [7:0] Out ); assign Out = (Sel==1)? In1: In2; 终端模块
接下来,控制单元的澳门在线代码:
// hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 澳门在线 project: 澳门在线 code for microcontroller // Control unit in 澳门在线 module Control_Logic( input[1:0] stage, input [11:0] IR, input [3:0] SR, output reg PC_E,Acc_E,SR_E,IR_E,DR_E,PMem_E,DMem_E,DMem_WE,ALU_E,MUX1_Sel,MUX2_Sel,PMem_LE, output reg [3:0] ALU_Mode ); parameter LOAD = 2'b00,FETCH = 2'b01, DECODE = 2'b10, EXECUTE = 2'b11; always @(*) 开始 PMem_LE = 0; PC_E = 0; Acc_E = 0; SR_E = 0; IR_E = 0; DR_E = 0; PMem_E = 0; DMem_E = 0; DMem_WE = 0; ALU_E =0; ALU_Mode = 4'd0; MUX1_Sel = 0; MUX2_Sel = 0; if(stage== LOAD ) 开始 PMem_LE = 1; PMem_E = 1; 结尾 别的 if(stage== FETCH ) 开始 IR_E = 1; PMem_E = 1; 结尾 别的 if(stage== DECODE ) 开始 if( IR[11:9] == 3'b001) 开始 DR_E = 1; DMem_E = 1; 结尾 别的 开始 DR_E = 0; DMem_E = 0; 结尾 结尾 别的 if(stage== EXECUTE ) 开始 if(IR[11]==1) 开始 // ALU I-type PC_E = 1; Acc_E = 1; SR_E = 1; ALU_E = 1; ALU_Mode = IR[10:8]; MUX1_Sel = 1; MUX2_Sel = 0; 结尾 别的 if(IR[10]==1) // JZ, JC,JS, JO 开始 PC_E = 1; MUX1_Sel = SR[IR[9:8]]; 结尾 别的 if(IR[9]==1) 开始 PC_E = 1; Acc_E = IR[8]; SR_E = 1; DMem_E = !IR[8]; DMem_WE = !IR[8]; ALU_E = 1; ALU_Mode = IR[7:4]; MUX1_Sel = 1; MUX2_Sel = 1; 结尾 别的 if(IR[8]==0) 开始 PC_E = 1; MUX1_Sel = 1; 结尾 别的 开始 PC_E = 1; MUX1_Sel = 0; 结尾 结尾 结尾 终端模块
最后,微控制器的澳门在线代码:
// The microcontroller (similar to Microchip PIC12, simplified extensively, not compatible in // instruction set) in this project is a 3 cycle nonpipeline // 8 bit Harvard structure microcontroller, illustrated as the following block diagram // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 澳门在线 project: 澳门在线 code for microcontroller module MicroController(input clk,rst ); parameter LOAD = 2'b00,FETCH = 2'b01, DECODE = 2'b10, EXECUTE = 2'b11; reg [1:0] current_state,next_state; reg [11:0] program_mem[9:0]; reg load_done; reg[7:0] load_addr; wire[11:0] load_instr; reg[7:0] PC, DR, Acc; reg [11:0] IR; reg [3:0] SR; wire PC_E,Acc_E,SR_E,DR_E,IR_E; reg PC_clr,Acc_clr,SR_clr,DR_clr,IR_clr; wire [7:0] PC_updated,DR_updated; wire[11:0] IR_updated; wire[3:0] SR_updated; wire PMem_E,DMem_E,DMem_WE,ALU_E,PMem_LE,MUX1_Sel,MUX2_Sel; wire [3:0] ALU_Mode; wire [7:0] Adder_Out; wire [7:0] ALU_Out,ALU_Oper2; // LOAD instruction memory initial 开始 $readmemb("program_mem.dat", program_mem,0,9); 结尾 // ALU ALU ALU_unit( .Operand1(Acc), .Operand2(ALU_Oper2), .E(ALU_E), .Mode(ALU_Mode), .CFlags(SR), .Out(ALU_Out), .Flags(SR_updated) // the Z (zero), C (carry), S (sign),O (overflow) bits, from MSB to LSB, connected to status register ); // MUX2 MUX1 MUX2_unit( .In2(IR[7:0]),.In1(DR), .Sel(MUX2_Sel), .Out(ALU_Oper2) ); // Data Memory DMem DMem_unit( .clk(clk), .E(DMem_E), // Enable port .WE(DMem_WE), // Write enable port .Addr(IR[3:0]), // Address port .DI(ALU_Out), // Data input port .DO(DR_updated) // Data output port ); // Program memory PMem PMem_unit( .clk(clk), .E(PMem_E), // Enable port .Addr(PC), // Address port .I(IR_updated), // Instruction port // 3 special ports are used to load program to the memory .LE(PMem_LE), // Load enable port .LA(load_addr), // Load address port .LI(load_instr)//Load instruction port ); // PC ADder adder PC_Adder_unit( .In(PC), .Out(Adder_Out) ); // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // MUX1 MUX1 MUX1_unit( .In2(IR[7:0]),.In1(Adder_Out), .Sel(MUX1_Sel), .Out(PC_updated) ); // Control logic Control_Logic Control_Logic_Unit( .stage(current_state), .IR(IR), .SR(SR), .PC_E(PC_E), .Acc_E(Acc_E), .SR_E(SR_E), .IR_E(IR_E), .DR_E(DR_E), .PMem_E(PMem_E), .DMem_E(DMem_E), .DMem_WE(DMem_WE), .ALU_E(ALU_E), .MUX1_Sel(MUX1_Sel), .MUX2_Sel(MUX2_Sel), .PMem_LE(PMem_LE), .ALU_Mode(ALU_Mode) ); // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // LOAD always @(posedge clk) 开始 if(rst==1) 开始 load_addr <= 0; load_done <= 1'b0; 结尾 别的 if(PMem_LE==1) 开始 load_addr <= load_addr + 8'd1; if(load_addr == 8'd9) 开始 load_addr <= 8'd0; load_done <= 1'b1; 结尾 别的 开始 load_done <= 1'b0; 结尾 结尾 结尾 // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project assign load_instr = program_mem[load_addr]; // next state always @(posedge clk) 开始 if(rst==1) current_state <= LOAD; 别的 current_state <= next_state; 结尾 always @(*) 开始 PC_clr = 0; Acc_clr = 0; SR_clr = 0; DR_clr = 0; IR_clr = 0; case(current_state) LOAD: 开始 if(load_done==1) 开始 next_state = FETCH; PC_clr = 1; Acc_clr = 1; SR_clr = 1; DR_clr = 1; IR_clr = 1; 结尾 别的 next_state = LOAD; 结尾 FETCH: 开始 next_state = DECODE; 结尾 DECODE: 开始 next_state = EXECUTE; 结尾 EXECUTE: 开始 next_state = FETCH; 结尾 结尾case 结尾 // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 3 programmer visible register always @(posedge clk) 开始 if(rst==1) 开始 PC <= 8'd0; Acc <= 8'd0; SR <= 4'd0; 结尾 别的 开始 if(PC_E==1'd1) PC <= PC_updated; 别的 if (PC_clr==1) PC <= 8'd0; if(Acc_E==1'd1) Acc <= ALU_Out; 别的 if (Acc_clr==1) Acc <= 8'd0; if(SR_E==1'd1) SR <= SR_updated; 别的 if (SR_clr==1) SR <= 4'd0; 结尾 结尾 // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 2 programmer invisible register always @(posedge clk) 开始 if(DR_E==1'd1) DR <= DR_updated; 别的 if (DR_clr==1) DR <= 8'd0; if(IR_E==1'd1) IR <= IR_updated; 别的 if(IR_clr==1) IR <= 12'd0; 结尾 终端模块
澳门在线 testbench代码来验证微控制器:
module MCU_tb; // hzgifts.cn: FPGA project, 澳门在线 project, VHDL project // 澳门在线 project: 澳门在线 code for microcontroller // Inputs reg clk; reg rst; // Instantiate the Unit Under Test (UUT) MicroController uut ( .clk(clk), .rst(rst) ); initial 开始 // Initialize Inputs rst = 1; // Wait 100 ns for global reset to finish #100; rst = 0; 结尾 initial 开始 clk = 0; forever #10 clk = ~clk; 结尾 终端模块
测试程序1:
0000_0000_0000 1011_0000_0001 0010_0010_0000 1011_0000_0000 0011_0011_0000 0001_0000_0101 0000_0000_0000 0000_0000_0000 0000_0000_0000 0000_0000_0000
测试程序2:
0000_0000_0000 1011_0000_0001 0010_0010_0000 0011_0000_0000 0010_0000_0000 0011_0001_0000 0010_0001_0000 0011_0111_0000 0010_0111_0000 0001_0000_1001
测试程序3:
0000_0000_0000 1011_0000_0101 0010_0010_0000 0010_0010_0001 0010_0010_0010 1011_0000_0011 0010_0100_0000 0010_0101_0001 0010_0110_0010 0001_0000_1001
测试程序4:
0000_0000_0000 1011_0000_0101 1010_0000_0000 1000_0000_0111 1001_0000_0110 1111_0000_0111 1100_0000_0011 1101_0000_0101 1110_0000_0011 0001_0000_1001
使用这四个测试程序来运行仿真,并检查微控制器是否正常工作。

推荐的 澳门在线 projects:
2. FIFO存储器的澳门在线代码
3. 用于16位单周期MIPS处理器的澳门在线代码
4. 澳门在线 HDL中的可编程数字延迟计时器
5. 用于数字电路中基本逻辑组件的澳门在线代码
6. 用于32位无符号除法器的澳门在线代码
7. 用于定点矩阵乘法的澳门在线代码
8. 澳门在线 HDL中的车牌许可证识别
9. 提前进位乘法器的澳门在线代码
10。 微处理器的澳门在线代码
11。 4x4乘法器的澳门在线代码
12 停车场系统的澳门在线代码
13 使用澳门在线 HDL在FPGA上进行图像处理
14。 如何使用澳门在线 HDL将文本文件加载到FPGA中
15 交通信号灯控制器的澳门在线代码
16。 FPGA上的闹钟的澳门在线代码
17。 比较器设计的澳门在线代码
18岁 D触发器的澳门在线代码
19 完整加法器的澳门在线代码
20 带testbench的计数器的澳门在线代码
21 16位RISC处理器的澳门在线代码
22 用于在FPGA上反跳按钮的澳门在线代码
23。 如何为双向/输入端口编写澳门在线 Testbench
3. 用于16位单周期MIPS处理器的澳门在线代码
4. 澳门在线 HDL中的可编程数字延迟计时器
5. 用于数字电路中基本逻辑组件的澳门在线代码
6. 用于32位无符号除法器的澳门在线代码
7. 用于定点矩阵乘法的澳门在线代码
8. 澳门在线 HDL中的车牌许可证识别
9. 提前进位乘法器的澳门在线代码
10。 微处理器的澳门在线代码
11。 4x4乘法器的澳门在线代码
12 停车场系统的澳门在线代码
13 使用澳门在线 HDL在FPGA上进行图像处理
14。 如何使用澳门在线 HDL将文本文件加载到FPGA中
15 交通信号灯控制器的澳门在线代码
16。 FPGA上的闹钟的澳门在线代码
17。 比较器设计的澳门在线代码
18岁 D触发器的澳门在线代码
19 完整加法器的澳门在线代码
20 带testbench的计数器的澳门在线代码
21 16位RISC处理器的澳门在线代码
22 用于在FPGA上反跳按钮的澳门在线代码
23。 如何为双向/输入端口编写澳门在线 Testbench
24 澳门在线和LogiSim中的Tic Tac Toe游戏
25岁 澳门在线中的32位5级流水线MIPS处理器(第1部分)
26。 澳门在线中的32位5级流水线MIPS处理器(第2部分)
27。 澳门在线中的32位5级流水线MIPS处理器(第3部分)
28岁 解码器的澳门在线代码25岁 澳门在线中的32位5级流水线MIPS处理器(第1部分)
26。 澳门在线中的32位5级流水线MIPS处理器(第2部分)
27。 澳门在线中的32位5级流水线MIPS处理器(第3部分)
29。 复用器的澳门在线代码
30岁 澳门在线中的N位加法器设计
31。 澳门在线和VHDL:通过示例解释
32。 FPGA上时钟分频器的澳门在线代码
33。 如何在澳门在线中生成时钟使能信号
34。 用于PWM发生器的澳门在线代码
35岁 澳门在线编码与软件编程
36。 Moore FSM序列检测器的澳门在线代码
37。 Basys 3 FPGA上的7段显示控制器的澳门在线代码
31。 澳门在线和VHDL:通过示例解释
32。 FPGA上时钟分频器的澳门在线代码
33。 如何在澳门在线中生成时钟使能信号
34。 用于PWM发生器的澳门在线代码
35岁 澳门在线编码与软件编程
36。 Moore FSM序列检测器的澳门在线代码
37。 Basys 3 FPGA上的7段显示控制器的澳门在线代码
不错,但是缺少以下模块:
回复删除-MUX1
-加法器
更新,谢谢。
删除还可以请您详细说明一下指令集吗?我成功地合成了Altera飓风IV的代码,但是没有'现在就运行它,我'我试图了解第一个测试程序的目的,看起来像是计数器或类似的东西
回复删除Instruction set: http://www.hzgifts.cn/2016/11/verilog-hdl-implementation-of-micro.html
回复删除Architecture Design: http://www.hzgifts.cn/2016/11/verilog-microcontroller-code.html
谢谢 !
删除先生,我想像在每个micrcontroller中一样,向该microntroller中添加一个MMIO 8位PortA(例如在DRAM的地址0x08处),以便可以仅使用其地址读取或写入uC PORT。因此,请建议对代码进行可能的更改。
回复删除You can refer to this: http://www.hzgifts.cn/2016/12/a-complete-8-bit-microcontroller-in-vhdl.html
回复删除在该微控制器中,可以根据需要添加内存和IO。
先生,你能分享一下吗"program_mem.dat"你在$ readmemb中提到过。
回复删除测试程序在那里。测试程序1->4.将其复制到program_mem.dat中。
删除我无法正确模拟它。您能帮我测试程序吗?此外,仿真仅显示2个元素-时钟和复位。请帮忙。
回复删除$ readmemb("program_mem.dat", program_mem,0,9);
删除您需要将其他测试程序加载到"program_mem.dat"归档并运行仿真。是的,仅提供时钟和复位,但是您需要查看仿真波形和数据存储器以了解MCU的操作。
我正在使用Xilinx ISE 14.7,我已经创建了将txt文件复制的内容"test program 1"并重命名为"program_mem.dat",然后尝试进行模拟。从哪里可以看到结果?
删除将必要的信号添加到仿真波形以查看结果。您需要了解存储在指令存储器中的程序,以便了解仿真波形的结果
删除能否请您上传"program_mem.dat"文件?模拟上述progran_mem.dat文件的代码时出现错误,能否请您告诉我如何使用该dat文件进行模拟。
回复删除谢谢
您需要创建此文件并将提供的测试程序复制到该文件"program_mem.dat"您创建的。然后,运行仿真并查看仿真波形的结果。
删除我创建了一个文本文件,将其重命名"program_mem.dat"。然后将其中一个测试程序复制到其中,然后将文本文件保存在保存我的澳门在线文件的文件夹中。仍然显示无法找到文件的错误。请帮忙
回复删除将文件保存到运行代码的同一文件夹中。该文件应命名"program_mem.dat" not "program_mem.dat.txt".
删除谢谢。现在工作正常。只是一个问题,这是12位单片机还是8位单片机?
删除你好,你能帮我吗?我也面临着同样的问题。这表明文件找不到。
删除在控制单元中
回复删除别的 if(IR [8] == 0)////这应该是if(IR [8] == 1)吗?我猜是对的吗?
begin
PC_E = 1;
MUX1_Sel = 1;
end
else
begin
PC_E = 1;
MUX1_Sel = 0;
end
end
end
终端模块
没有。该代码已经正确。 IR [8] == 1 =>MUX1_Sel = 0为跳转或跳转指令选择IR [7:0](IR [8] = 1)。否则(IR [8] == 0),MUX1_Sel = 1使PC值增加1(Adder_Out)。检查MUX1代码。
删除该代码将在VIVADO 2017.4中执行
回复删除当然。您可以将Vivado用于此项目。
删除在测试台上我必须提供什么输入,请问在上面(第3部分)中提供的代码之后,我可以得到测试台的代码吗?我将得到clk和sel波形作为输出
删除提供了Testbench。输入是要放入程序存储器中的指令。要验证操作,请运行仿真并检查寄存器和存储器的内容。
删除您好,我遇到了program_mem问题。找不到dat
回复删除先生
回复删除您可以制作一部模拟视频吗?
为什么将进位设置为MSB的倒数?
回复删除