pic微处理器设计指导书.doc_第1页
pic微处理器设计指导书.doc_第2页
pic微处理器设计指导书.doc_第3页
pic微处理器设计指导书.doc_第4页
pic微处理器设计指导书.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

pic微处理器设计指导书 Microchip Technology的PIC16F5X是一系列低成本、高性能、8位、全静态和基于闪存的CMOS单片机。 它采用的RISC架构仅有33条指令,本设计的每条指令均在一个周期内完成。 一、总体设计流程 1、功能模块列表PIC使用哈佛结构的精简指令集,哈佛结构把数据存储和指令存储部分分开。 先通过Decoder将指令解码,再到ROM中读取数据,经过ALU运算,写回存储单元。 图2简化框图图2用粗线突出了使用时序逻辑的部分,可以看出,最开始的读取和最终的写入部分都是时序逻辑,同步写入f。 其余部分应当用组合逻辑,快速执行指令,实现在一个时钟周期内完成。 因此,哈佛结构具有较高的执行效率。 2、分模块设计需要具体设计的模块有:Stack、Seqnc、Prog_ROM、Decoder、ALU 8、Reg_fie、Reg_Misc,以及顶层的PIC16F54。 其中ALU分为Adder、Shift、Throu、Logic合肥工业大学4四个模块。 最后,定义一个HFUT模块,实现LED的接口信号。 每个模块均在Xilinx中,用Verilog语言建模,设计逻辑功能。 当设计完成时,进行编译,编译成功时,模块设计完成。 USTC7761.v PIC16F54.v UART_Tx.v Seqnc.v Prog_Rom.v Decoder.v ALU8.v Reg_fie.v Reg_Misc Stack.v UART_Rx.v Throu8.v Shift8.v Logic8.v Adder8.v HFUT.v 3、仿真测试模块设计完成后,用Modelsim软件进行仿真测试,验证各模块的正确性。 4、烧入FPGA将HFUT.bit文件烧入FPGA,并使用自己编写的汇编文件转换为ROM文件,测试CPU的正确性。 二、模块说明 1、HFUT.V模块这是最顶层模块。 定义了计时器和输入输出口。 从中我们可以看到porta_tris管理led灯的使能,portb_tris管理led等的输出;option管理tr_out的输出。 2、UART_RX.V模块这是负责数据读取的模块。 数据经rxd_in串行输入,经data_out并行输出。 每次buffer读满,输出一个new_data信号?示CPU读取数据。 3、UART_TX.V模块这是负责数据写出的模块。 数据经data_in并行输入,经txd_out串行输出接口模块。 如果数据尚未输出接口模块,busy信号?示CPU不要往外输出数据。 4、PIC16F54.V模块这是CPU的顶层模块,负责指令的具体实现。 包括decoder、ALU、RAM、ROM。 它从decoder中获得从具体指令中抽象得到的使能信号、读信号、写信号。 这个模块的设计有一种基本思想把数据和控制分开。 PIC微处理器设计5即一个信号的输出往往是这样的结构也就是说,这个模块不必关心输出值的来历、具体是何指令,只需按照decoder的指令,从它该来的地方取出数据,把它放到该放的地方去。 具体而言,读信号我们可以根据f_out_mux选择读的,并将结果存入f_out_data中,但是这存入的信号不一定能进入ALU之中,还要通过判断K8A_sel是不是0来选择。 这一步可以看出,所有信号都照常体现在PIC模块中,但是否使用这路信号还要根据Decoder的结果决定。 综上所述,这种将数据与控制分开的思想大大简化了程序的结构。 我们只需判断可能的输入、应该选择的输出就好。 合肥工业大学6实验一简单组合逻辑设计一实验目的1.学习PIC16F54微处理器的数据手册。 2.学习Basys2开发板的参考手册。 3.理解PIC16F54微处理器的整体设计框图。 4.学会安装ISE、Maplab、超级终端等软件。 5.以一个组合逻辑电路为例,熟悉ISE软件进行硬件设计的流程。 二软件介绍1.ISE软件I SE的全称为Integrated SoftwareEnvironment,即“集成软件环境”,是Xilinx公司的硬件设计工具。 利用Xilinx公司的ISE开发设计软件的工程设计流程,具体分为五个步骤即输入(Design Entry)、综合(Synthesis)、实现(Implementation)、验证(Verification)、下载(Download)。 1)图形或文本输入(Design Entry)图形或文本输入包括原理图、状态机、波形图、硬件?述语言(HDL),是工程设计的第一步,ISE集成的设计工具主要包括HDL器(HDL Editor)、状态机器(StateCAD)、原理图器(ECS)、IP核生成器(CoreGenerator)和测试激励生成器(HDL Bencher)等。 常用的设计输入方法是硬件?述语言(HDL)和原理图设计输入方法。 原理图输入是一种常用的基本的输入方法,其是利用元件库的图形符号和连接线在ISE软件的图形器中作出设计原理图,ISE中设置了具有各种电路元件的元件库,包括各种门电路、触发器、锁存器、计数器、各种中规模电路、各种功能较强的宏功能块等用户只要点击这些器件就能调入图形器中。 这种方法的优点是直观、便于理解、元件库资源丰富。 但是在大型设计中,这种方法的可维护性差,不利于模块建设与重用。 更主要的缺点是当所选用芯片升级换代后,所有的原理图都要作相应的改动。 故在ISE软件中一般不利用此种方法。 为了克服原理图输入方法的缺点,目前在大型工程设计中,在ISE软件中常用的设计方法是HDL设计输入法,其中影响最为广泛的HDL语言是VHDL和Verilog HDL。 它们的共同优点是利于由顶向下设计,利于模块的划分与复用,可移植性好,通用性强,设计不因芯片的工艺和结构的变化而变化,更利于向ASIC的移植,故在ISE软件中推荐使用HDL设计输入法。 波形输入及状态机输入方法是两种最常用的辅助设计输入方法,使用波形输入法时,只要绘制出激励波形的输出波形,ISE软件就能自动地根据响应关系进行设计;而使用状态机输入时,只需设计者画出状态转移图,ISE软件就能生成PIC微处理器设计7相应的HDL代码或者原理图,使用十分方便。 其中ISE工具包中的StateCAD就能完成状态机输入的功能。 但是需要指出的是,后两种设计方法只能在某些特殊情况下缓解设计者的工作量,并不适合所有的设计。 2)综合(Synthesis)综合是将行为和功能层次表达的电子系统转化为低层次模块的组合。 一般来说,综合是针对VHDL来说的,即将VHDL?述的模型、算法、行为和功能?述转换为FPGA/CPLD基本结构相对应的网表文件,即构成对应的映射关系。 在Xilinx ISE中,综合工具主要有Synplicity公司的Synplify/Synplify Pro,Synopsys公司的FPGA CompilerII/Express,Exemplar Logic公司的LeonardoSpectrum和Xilinx ISE中的XST等,它们是指将HDL语言、原理图等设计输入翻译成由与、或、非门,RAM,寄存器等基本逻辑单元组成的逻辑连接(网表),并根据目标与要求优化所形成的逻辑连接,输出edf和edn等文件,供CPLD/FPGA厂家的布局布线器进行实现。 3)实现(Implementation)实现是根据所选的芯片的型号将综合输出的逻辑网表适配到具体器件上。 Xilinx ISE的实现过程分为翻译(Translate)、映射(Map)、布局布线(Place&Route)等3个步骤。 ISE集成的实现工具主要有约束器(Constraints Editor)、引脚与区域约束器(PACE)、时序分析器(Timing Analyzer)、FPGA底层器(FGPA Editor)、芯片观察窗(Chip Viewer)和布局规划器(Floorplanner)等。 4)验证(Verification)验证(Verification)包含综合后仿真和功能仿真(Simulation)等。 功能仿真就是对设计电路的逻辑功能进行模拟测试,看其是否满足设计要求,通常是通过波形图直观地显示输入信号与输出信号之间的关系。 综合后仿真在针对目标器件进行适配之后进行,综合后仿真接近真实器件的特性进行,能精确给出输入与输出之间的信号延时数据。 ISE可结合第三方软件进行仿真,常用的工具如Model Tech公司的仿真工具ModelSim和测试激励生成器HDL Bencher,Synopsys公司的VCS等。 通过仿真能及时发现设计中的错误,加快设计中的错误,加快设计进度,?高设计的可靠性。 每个仿真步骤如果出现问题,就需要根据错误的定位返回到相应的步骤更改或者重新设计。 5)下载(Download)下载(Download)即编程(Program)设计开发的最后步骤就是将已经仿真实现的程序下载到开发板上,进行在线调试或者说将生成的配置文件写入芯片中进行测试。 在ISE中对应的工具是iMPACT。 合肥工业大学8三实验内容本实验以一个简单的指令译码电路为例,来熟悉ISE软件的设计流程。 该电路通过对指令的判断,对输入数据执行相应的操作,包括加、减、与、或和求反,并且无论是指令作用的数据还是指令本身发生的变化,结果都要做出及时的反映。 Verilog代码define plus3d0define minus3d1define band3d2define bor3d3define unegate3d4module alu(out,opcode,a,b);output2:0out;input2:0opcode;input1:0a,b;reg2:0out;always(opcode ora orb)begin case(opcode)plus:out=a+b;/加操作minus:out=a-b;/减操作band:out=a&b;/与操作bor:out=a|b;/或操作unegate:out=a;/求反default:out=3hx;/未收到指令时,输出任意态endcase end endmodule测试源代码module alutest;wire2:0out;reg2:0opcode;reg1:0a,b;alu uut(.out(out),.opcode(opcode),.a(a),.b(b);initial begina=$random%4;b=$random%4;PIC微处理器设计9opcode=3h0;repeat (5)begin#100a=$random%4;b=$random%4;opcode=opcode+1;end#100$stop;end endmoduleucf文件NEToutLOC=P7;NEToutLOC=M11;NEToutLOC=M5;NETopcodeLOC=E2;NETopcodeLOC=F3;NETopcodeLOC=G3;NETbLOC=B4;NETbLOC=K3;NETaLOC=L3;NETaLOC=P11;四实验步骤新建工程-新建源文件(Verilog Module)-新建源文件(Verilog TestFixture)-仿真-新建源文件(Implementation ConstraintsFile)-综合-实现-生成二进制文件-利用Adept下载到板子验证。 五实验结果1)行为级仿真波形如下图所示。 2)将alu.bit文件下载到板子上进行验证。 (结果略)合肥工业大学10实验二T UART串口通信一实验目的UART(Universal AsynchronousReceiver Transmitter,通用异步收发器)是广泛使用的异步串行数据通信协议。 下面首先介绍UART硬件接口及电平转换电路,分析UART的传输时序并利用Verilog HDL语言进行建模与仿真,最后通过开发板与PC相连进行RS-232通信来测试UART收发器的正确性。 二硬件接口及电平转换UART是通用异步串行口的意思,RS232是UART的一种,它采用的232电平。 其他的UART串口,还有单片机上的异步通信口,采用的是TTL电平。 TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5+12V为低电平,而-12-5V为高电平。 Uart串口的RXD、TXD等一般直接与处理器芯片的引脚相连,而RS232串口的RXD、TXD等一般需要经过电平转换(通常由Max232等芯片进行电平转换)才能接到处理器芯片的引脚上,否则这么高的电压很可能会把芯片烧坏。 图1RS232转TTL模块三传输时序0/10/10/10/10/10/10/10/1IDLE STARTBIT0BIT1BIT2BIT3BIT4BIT5BIT6BIT7STOP/NEXTB IDLESTARTTx图2发送模块时序图0/10/10/10/10/10/10/10/1IDLESTART BIT0BIT1BIT2BIT3BIT4BIT5BIT6BIT7STOPIDLESTARTRxNEXTBERROR图3接收模块时序图四Verilog建模及仿真1.UART发送模块PIC微处理器设计11UART发送模块的功能接收到发送指令后,把数据按UART协议输出,先输出一个低电平的起始位,然后从低到高输出8个数据位,接着是可选的奇偶校验位,最后是高电平的停止位。 Verilog HDL语言代码如下module UART_tx(rst,clk,load,data_in,txd_out,busy);input rst;input clk;input load;input7:0data_in;output txd_out;output busy;/reg shift;reg3:0state;reg10:0tr;reg7:0TXD;reg Dout;/parameter IDLE=0;parameter START=1;parameter BIT0=2;parameter BIT1=3;parameter BIT2=4;parameter BIT3=5;parameter BIT4=6;parameter BIT5=7;parameter BIT6=8;parameter BIT7=9;parameter STOP=10;parameter NXTB=11;/parameter Dprs=8b11111111;parameter Frqz=1302;/50,000/38.4wire wrap;assign wrap=(tr=Frqz-1);/Tx rstclkloaddata_in7:0txd_outbusy合肥工业大学12always(posedge clk)if(rst)begin state=IDLE;tr=0;TXD=Dprs;end else begin case(state)IDLE:begin if(load)begin state=state+1;TXD=data_in;end else begin state=state;TXD=Dprs;end tr=0;end START,BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7:begin if(wrap)begin state=state+1;tr=0;end else begin state=state;tr=tr+1;end TXD=TXD;end STOP:begin if(load)begin TXD=data_in;if(wrap)begin state=START;tr=0;PIC微处理器设计13end elsebegin state=state+1;tr=tr+1;end end elsebeginTXD=TXD;if(wrap)begin state=IDLE;tr=0;end elsebegin state=state;tr=tr+1;end end end NXTB:begin if(wrap)begin state=START;tr=0;end elsebegin state=state;tr=tr+1;end TXD=TXD;end default:begin state=IDLE;tr=0;TXD=Dprs;end endcaseend/always(state)case(state)IDLE:shift=0;START:shift=1;BIT0:shift=1;BIT1:shift=1;合肥工业大学14BIT2:shift=1;BIT3:shift=1;BIT4:shift=1;BIT5:shift=1;BIT6:shift=1;BIT7:shift=1;STOP:shift=0;NXTB:shift=1;default:shift=0;endcase assignbusy=shift;/always(state,TXD)case(state)IDLE:Dout=1;START:Dout=0;BIT0:Dout=TXD0;BIT1:Dout=TXD1;BIT2:Dout=TXD2;BIT3:Dout=TXD3;BIT4:Dout=TXD4;BIT5:Dout=TXD5;BIT6:Dout=TXD6;BIT7:Dout=TXD7;STOP:Dout=1;NXTB:Dout=1;default:Dout=1b1;endcase assigntxd_out=Dout;/endmodule2.UART接收模块UART接收模块的功能时时检测线路,当线路产生下降沿时,即认为线路有数据传输,启动接收数据进程进行接收,按从低位到高位接收数据。 UART接收模块的Verilog HDL语言代码如下module UART_rx(rst,clk,rxd_in,read,testing,data_out,new_data);input rst;Rx rstclkrxd_inreaddata_out7:0newdataPIC微处理器设计15input clk;input rxd_in;input read;output4:0testing;output7:0data_out;output new_data;/reg flag;reg3:0state;reg10:0tr;reg7:0RXD;reg7:0Dout;/parameter IDLE=4h0;parameter START=4h1;parameter BIT0=4h2;parameter BIT1=4h3;parameter BIT2=4h4;parameter BIT3=4h5;parameter BIT4=4h6;parameter BIT5=4h7;parameter BIT6=4h8;parameter BIT7=4h9;parameter STOP=4ha;parameter NXTB=4hb;parameter ERROR=4hc;/parameter Dprs=8b11111111;parameter Frqz=1302;/50,000/38.4wire wrap2,wrap;assign wrap2=(tr=Frqz/2-1);assign wrap=(tr=Frqz-1);/always(posedge clk)if(rst)begin state=IDLE;tr=0;RXD=Dprs;end elsebegin case(state)IDLE:begin RXD=Dprs;if(rxd_in)begin state=state;tr=0;end elsebegin state=state+1;tr=0;end endSTART:begin RXD=RXD;if(!wrap2)begin state=state;合肥工业大学16tr=tr+1;end elsebegin tr=0;if(rxd_in)state=IDLE;else state=state+1;end endBIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7:begin if(!wrap)begin state=state;tr=tr+1;RXD=RXD;end elsebegin state=state+1;tr=0;RXD=rxd_in,RXD7:1;end endSTOP:begin RXD=RXD;if(!wrap)begin state=state;tr=tr+1;end elsebegin tr=0;if(rxd_in)state=state+1;else state=ERROR;end endNXTB:begin state=IDLE;tr=0;RXD=RXD;end ERROR:begin RXD=RXD;if(!wrap2)begin state=state;tr=tr+1;endelsebegin state=IDLE;tr=0;endenddefault:begin PIC微处理器设计17state=IDLE;tr=0;RXD=Dprs;end endcaseend/wire get_data;assign get_data=(state=NXTB);/always(posedge clk)if(get_data)Dout=RXD;else Dout=Dprs;assign data_out=Dout;/always(posedge clk)if(rst)flag=0;elsebeginif(get_data)flag=1;elsebeginif(read)flag=0;else flag=flag;endendassign new_data=flag;assign testing=(state=ERROR),state;/Endmodule3.Rx接收模块的测试文件module UART_rx_tb01_v;/Inputs regrst;reg clk;reg rxd_in;reg read;/Outputs wire7:0data_out;wire new_data;/Instantiate theUnit UnderTest(UUT)UART_rx uut(.rst(rst),.clk(clk),.rxd_in(rxd_in),.read(read),.data_out(data_out),.new_data(new_data);合肥工业大学18parameter Frqz=1302;/50,000/38.4parameter tp=20;/clk cyclefor50MHz initial begin/Initialize Inputsrst=1;#(0.5*tp);/rst=0;clk=0;rxd_in=1;/rxd_in=0;read=0;#100;rst=0;#(10*tp);rxd_in=0;#(650*tp);rxd_in=1;#(100*tp);rxd_in=0;#(Frqz*8.5*tp);rxd_in=1;#(Frqz/2+10)*tp);read=1;#tp;read=0;end always#(tp/2)clk=clk;/generating clkinitial#(30000*tp)$stop;endmodule仿真波形图如下4.发送模块的测试文件(略)五板级验证PIC微处理器设计19为了测试UART与PC通信的正确性,本例测试方法是,PC将数据发送到FPGA,FPGA接收到数据再发送给PC。 根据PC的串口调试工具的设置,决定代码是否需要奇偶校验位,以及分频系数。 分配FPGA引脚,编译工程,连接好开发板及下载线缆,接上电源,下载配置FPGA,打开PC的串口调试工具,发送数据,观察接收到的数据。 (图略)创建顶层文件将上述发送和接收模块均包含在内,然后进行板级验证,Verilog代码如下module Basys3_IO_Test(input clk,input btn0,output RsTx,input RsRx);wire new_data_wire;wire7:0data_out_wire;wire busy_wire;wire read_n_load;assign read_n_load=!busy_wire&new_data_wire;/UART_rx UART_rx_01(.rst(btn0),.clk(clk),.rxd_in(RsRx),.read(read_n_load),.testing(testing_wire),.data_out(data_out_wire),.new_data(new_data_wire);/UART_tx UART_tx_01(.rst(btn0),.clk(clk),.load(read_n_load),.data_in(data_out_wire),.txd_out(RsTx),.busy(busy_wire);/endmodule合肥工业大学20实验三算术逻辑单元模块ALU模块负责计算,将PIC模块传来的操作数根据decoder的方式进行计算。 结果传回PIC模块中,由顶层决定结果如何使用。 ALU内部有四个子模块,分别是Adder8模块、Logic8模块、Shift8模块、Throu8模块。 可用adder实现加减法和自加 一、自减一;Logic实现与、或、非、异或;可用shift实现左右移位;Through实现swap、clr和move。 下面详细设计四个模块1.8Adder8模块Adder8模块实现了操作数op_A和op_B的加减操作运算,op_A和op_B两条输入线为两个八位的操作数,输入信号sub为减法信号,输入信号op_mux为两位的选择信号,分别选择加、减、增 一、减一运算。 输出信号Sum是八位的输出结果信号,输出信号C和DC为两个和进位有关的信号。 Verilog语句module Adder8(op_A,op_B,op_mux,sub,Sum,C,DC);/input7:0op_A;input7:0op_B;input1:0op_mux;/0:add,1:sub,2:inc,3:dec inputsub;output7:0Sum;output C;output DC;/wire7:0op_B_tmp;assign p_B_tmp=op_mux1?(op_mux0?8hff:8h01):(op_mux0?op_B:op_B);wire4:0Sum_L=1b0,op_A3:0+1b0,op_B_tmp3:0+sub;wire9:5Sum_H=1b0,op_A7:4+1b0,op_B_tmp7:4+Sum_L4;/assign Sum=Sum_H8:5,Sum_L3:0;assign C=Sum_H9;assign DC=Sum_L4;/endmodule Adder8op_A7:0op_B7:0subop_mux1:0Sum7:0CDCPIC微处理器设计212.L8ogic8模块Logic模块实现了四种逻辑运算。 Logic模块有三个输入,其中op_A和op_B两条输入线为两个八位的操作数,两位输入信号op_mux为逻辑运算的选择信号,当op_mux为00,结果为ior运算,当op_mux为01,结果为and运算,当op_mux为10,结果为xor运算,当op_mux为11,结果为p运算。 最后输出为八位的Func运算结果信号。 Verilog语句module Logic8(op_A,op_B,op_mux,Func);/input7:0op_A;input7:0op_B;input1:0op_mux;/0:ior,1:and,2:xor,3:p output7:0Func;/wire7:0Func_ior=op_A|op_B;wire7:0Func_add=op_A&op_B;wire7:0Func_xor=op_Aop_B;wire7:0Func_p=op_A;/Assign Func=op_mux1?(op_mux0?Func_p:Func_xor):(op_mux0?Func_add:Func_ior);/Endmodule3.S8hift8模块Shift8模块实现的功能是对八位的输入操作数oprd进行移位,而输入信号rlf_n_rrf选择了向左或者向右移位。 八位的输出S_out为移位以后的结果,而输出信号C_out则是移出的位。 module Shift8(C_in,oprd,rlf_n_rrf,S_out,C_out);/Logic8op_A7:0op_B7:0op_mux1:0Func7:0Shift8C_inoprd7:0rlf_n_rrfS_out7:0C_out合肥工业大学22input C_in;input7:0oprd;input rlf_n_rrf;/0:rrf,1:rlf output7:0S_out;output C_out;/assignC_out,S_out=rlf_n_rrf?oprd7:0,C_in:oprd0,C_in,oprd7:1;/endmodule4.T8hrou8模块module Throu8(oprd,clr,swap_n_mov,T_out);/input7:0oprd;input clr;input swap_n_mov;/0:mov,1:swap output7:0T_out;/assign T_out=clr?8b00:(swap_n_mov?oprd3:0,oprd7:4:oprd);/endmodule5.综合模块最后,设计一个大的ALU模块,把前四个模块都放进去,定义总体的输入输出引脚。 ALU8模块的总体输入输出如下图所示总共有十条输入线,四条输出线。 Verilog语句Throu8clroprd7:0Swap_n_movT_out7:0ALU8clrrlf_n_rrfop_mux_aAlu_outSwap_n_movop_mux_lsubout_muxC_inop_Alop_Blop_Aop_BC_newDC_newZ_newPIC微处理器设计23module ALU8(clr,swap_n_mov,rlf_n_rrf,op_mux_l,op_mux_a,sub,out_mux,C_in,op_A1,op_B1,op_A,op_B,ALU_out,C_new,DC_new,Z_new);/input clr;/1:clr inputswap_n_mov;/0:mov,1:swap inputrlf_n_rrf;/0:rrf,1:rlf input1:0op_mux_l;/0:ior,1:and,2:xor,3:p input1:0op_mux_a;/0:add,1:sub,2:inc,3:dec inputsub;input1:0out_mux;/0:thou,1:Shift,2:Func,3:Adder inputC_in;input7:0op_A1;input7:0op_B1;input7:0op_A;/to theLogic8sub moduleonly input7:0op_B;/to theLogic8sub moduleonly output7:0ALU_out;output C_new;output DC_new;output Z_new;/wire7:0T_out,S_out,Func,Sum;wire C_out,C_wire;wire7:0ALU_out_buf;/Adder8Adder8_1(.op_A(op_A1),.op_B(op_B1),.sub(sub),.op_mux(op_mux_a),.Sum(Sum),.C(C_wire),.DC(DC_new);Logic8Logic8_1(.op_A(op_A),.op_B(op_B),.op_mux(op_mux_l),.Func(Func);Shift8Shift8_1(.C_in(C_in),.oprd(op_A1),.rlf_n_rrf(rlf_n_rrf),.C_out(C_out),.S_out(S_out);Throu8Throu8_1(.oprd(op_A1),.clr(clr),.swap_n_mov(swap_n_mov),.T_out(T_out);/assign ALU_out_buf=out_mux1?(out_mux0?Sum:Func):(out_mux0?S_out:T_out);assign ALU_out=ALU_out_buf;assign Z_new=|ALU_out_buf;assign C_new=out_mux1?C_wire:C_out;/endmodule合肥工业大学246.测试模块模块设计完成以后,在ISIM仿真工具中,用ALU8_tb01模块进行行为级仿真,根据波形来判断ALU8模块功能的正确性。 仿真波形图如下,Verilog测试代码module ALU8_tb01_v;/Inputs regclr;reg swap_n_mov;reg rlf_n_rrf;reg1:0op_mux_l;reg1:0op_mux_a;reg sub;reg C_in;reg7:0op_A1;reg7:0op_B1;reg7:0op_A;reg7:0op_B;reg1:0out_mux;/Outputs wire7:0ALU_out;wire C_new;wire DC_new;wire Z_new;/Instantiate theUnit UnderTest(UUT)ALU8uut(.clr(clr),.swap_n_mov(swap_n_mov),.rlf_n_rrf(rlf_n_rrf),.op_mux_l(op_mux_l),.op_mux_a(op_mux_a),.sub(sub),.out_mux(out_mux),.C_in(C_in),.op_A1(op_A1),.op_B1(op_B1),.op_A(op_A),.op_B(op_B),.ALU_out(ALU_out),.C_new(C_new),.DC_new(DC_new),.Z_new(Z_new);parameter tp=10;/clk cyclefor100MHz PIC微处理器设计25initialbegin/Initialize Inputsclr=0;swap_n_mov=0;rlf_n_rrf=0;op_mux_l=0;op_mux_a=0;sub=0;out_mux=0;C_in=0;clk=0;op_A1=0;op_B1=0;op_A=0;op_B=0;end/generating clkreg clk;always#(tp/2)clk=clk;always(posedge clk)beginout_mux,op_mux_a,op_mux_l=out_mux,op_mux_a,op_mux_l+1;rlf_n_rrf,clr,swap_n_mov=rlf_n_rrf,clr,swap_n_mov+1;C_in=C_in;end always(posedge clk)begin op_A1=$random%8;op_B1=$random%8;op_A=$random%8;op_B=$random%8;end always(op_mux_a)sub=(op_mux_a=2b01);/initial#(3200*tp)$stop;endmodule合肥工业大学26实验四D Drecoder译码模块一PIC16F54指令集介绍Decoder模块涉及到指令集,所以先介绍指令集如下表指令集综述助记符,操作数说明12位操作码面向字节的文件寄存器操作ADDWF f,d W和f相加000111df ffffANDWF f,d W和f作逻辑与运算000101df ffffCLRF f将f清零0000011f ffffCLRW将W寄存器清零000001000000F f,d f取反001001df ffffDECF f,d f减1000011df ffffDECFSZ f,d f减1,为0则跳过001011df ffffINCF f,d f增1001010df ffffINCFSZ f,d f增1,为0则跳过001111df ffffIORWF f,d W和f作逻辑或运算000100df ffffMOVF f,d将f的内容传送到目标寄存器001000df ffffMOVWF f将W的内容传送到f0000001f ffffNOP空操作000000000000RLF f,d对f执行带进位的循环左移001101df ffffRRF f,d对f执行带进位的循环右移001100df ffffSUBWF f,d f减去W000010df ffffSWAPF f,d将f中的两个半字节进行交换001110df ffffXORWF f,d W和f作逻辑异或运算000110df ffff面向位的文件寄存器操作BCF f,b将f中的某位清零0100bbbf ffffBSF f,b将f中的某位置10101bbbf ffffBTFSC f,b检测f中的某位,为0则跳过0110bbbf ffffBTFSS f,b检测f中的某位,为1则跳过0111bbbf ffff立即数和控制操作指令ANDLW k立即数和W相与1110kkkk kkkkCALL k调用子程序1001kkkk kkkkCLRWDT清零看门狗定时器000000000100GOTO k无条件跳转101k kkkk kkkk IORLWk立即数与W作逻辑或运算1101kkkk kkkkMOVLW k将立即数传送到W1100kkkk kkkkOPTION装载OPTION寄存器000000000010RETLW k返回并将立即数传送到W1000kkkk kkkkSLEEP进入待机模式000000000011TRIS f载入TRIS寄存器000000000fff XORLWk立即数与W作逻辑异或运算1111kkkkkkkkPIC微处理器设计27每条PIC16F5X指令都是一个12位字,由操作码(指定指令类型)和一个或多个操作数(指定指令操作)组成。 指令集将指令分为字节操作指令、位操作指令和立即数和控制操作指令。 对于字节操作指令,f为代表文件寄存器的指示符,而d为代表目标寄存器的指示符。 文件寄存器指示符指定指令将会使用存储区内32个文件寄存器中的哪一个。 目标寄存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论