Verilog HDL数字系统设计课件_第1页
Verilog HDL数字系统设计课件_第2页
Verilog HDL数字系统设计课件_第3页
Verilog HDL数字系统设计课件_第4页
Verilog HDL数字系统设计课件_第5页
已阅读5页,还剩228页未读 继续免费阅读

下载本文档

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

文档简介

1、Verilog HDL复杂数字系统设计南通大学电子信息学院本课程主要内容数字系统实例:数字系统实例:nFIFOn异步串行通信接口n调制解调器nI2C接口的接口的EEPROM读写器读写器nCISC CPUnRISC CPU例例1:一个挂在总线上的:一个挂在总线上的8位寄存器。位寄存器。module register0(db,nce,nwe) ;inout7:0 db ;input nce,nwe;reg7:0 q;assign db= (nce |(!nwe)?8bzzzzzzzz :q;always (posedge nwe) begin if(nce=0) q=db;endendmodule

2、复习例2:带有异步清零端的同步4位二进制加法计数器module ncounter(rst, clk, q );input rst, clk;output3:0 q;reg3:0 q;always( posedge clk or negedge rst) if (!rst) q=0; else if (q=15) q=0; else q=q+1;endmodule同步清零?例例3:分频器的设计:分频器的设计module nfrequency( rst, clk, q );input rst, clk;output3:0 q;reg3:0 q;always( posedge clk or nege

3、dge rst )if (!rst)q=0;else if (q=15) /可以实现可以实现16分频分频q=0;elseq=q+1;endmodule同步清零?其它分频系数?例例4:11111010000序列检测器序列检测器module shift(q,s,d,clk);output11:0 q;output s;input d;input clk;reg11:0 q;reg s;always (posedge clk)begin q=q1; q0=d; endalways (posedge clk) if(q=12b 11111010000) s=1; else s=0;endmodule例

4、例5:设计一个容量为:设计一个容量为1kB的的RAM。module memory (d,a,we,rd);inout7:0 d;input9:0 addr;input we,rd;wire7:0 q ;assign d= rd ? q: 8hzz;lpm_ram_dp0 ram0(d ,a , a ,we,rd,q);endmodule1.以结构描述方式实现下列逻辑: Y=ABC+DE+ CFG2.试设计一个具有使能端ncs的2-4译码器。3.中断请求有效电平为高电平,中断请求输入线INTR0INTR15中INTR15优先权最高。试设计一个中断优先权编码器。当有中断请求时,INT=1,同时输出

5、中断请求输入线的编码V;否则INT=0,V的输出任意。4.试设计一个4位加减运算器,输入为A、B、CIN、M,输出为OUT和COUT。当M=0时执行加法运算, M=1时,执行减法运算。5.试设计一个14分频器,要求占空比1:1。6.试设计一个具有三态输出缓冲的8位数据寄存器。7.试设计一个具有清0和置数功能的8位二进制加1计数器。8. 设计一个8位的加/减计数器。时钟信号为 clk,同步清0信号为rst。 clk上升沿时刻,当inc=1计数器加2,当dec=1计数器减1,其它情况时计数器保持不变。 9.设计一个16位移位寄存器。10.设计一个16位双向移位寄存器,当d=0时右移, d=1时左移

6、。11.设计一个产生0100100111的序列信号发生器。12.试以调用库函数的方法设计一个容量为8K24bit的RAM。其双向数据线为D 0:23,地址线为A0:12,写信号为new (低电平有效),读信号为nrd(低电平有效)。13.设计一个位宽为8位、深度为8层的堆栈。14.试按下图设计VerilogHDL模型。s0s1s2s3s411/00?/010/101/000/11?/01?/000/001/100/01?/01?/010/100/001/1?1/0第一章 先进先出数据缓冲器设计1.1 FIFO工作原理工作原理先进先出数据管理 ph-头指针(指向第一个数据) pe-尾指针(指向第

7、一个空单元) 判缓冲器空条件: 当pe=ph-空判缓冲器满条件: 当pe+1=ph-满clknresetfifo_infifo_outfifo_wrfifo_rdbusyemptyfullFIFOclknresetfifo_infifo_outfifo_wrfifo_rdbusyemptyfullFIFOfifo_infifo_outrdwrphpe,qrdenwrenwraddressdatardaddressRAM1.2 状态转换图状态转换图n采用同步时序n状态机: 3个状态stopwritereadfifo_rd=1 / rd=1fifo_rd=0 / rd=0fifo_wr=1 / w

8、r=1fifo_wr=0 / wr=0n写操作写操作-需要2个clk完成n读操作读操作-需要2个clk完成1.3 FIFO模型设计之一模型设计之一/FIFO /Size:255Bytesmodule fifo(clk,nreset,pe,ph,fifo_in,fifo_out,fifo_wr,fifo_rd, busy,empty,full,state,wr,rd);input clk,nreset,fifo_wr,fifo_rd;/input7:0 fifo_in;output1:0 state;output empty,full,wr,rd,busy;/output7:0 fifo_out

9、,pe,ph;reg1:0 state;reg7:0 fifo_out;reg wr,rd,empty,full;/fifo write , read ,empty , fullreg7:0pe,ph; /fifo point:P_end,P_headparameter write=1,read=2,stop=0;always(posedge clk)if (nreset=0) begin pe=0;ph=0; endelse case(state) stop: if( fifo_wr=1 & pe+1!=ph) /write start begin rd=0; wr=1;state=

10、write;busy=1; end else if(fifo_rd=1 & pe!=ph) /read start begin wr=0;rd=1;state=read;busy=1; end else begin wr=0;rd=0;state=stop;busy=0; if(ph=pe) empty=1; else if(pe+1=ph) full=1; else begin empty=0; full=0; end end write: if( fifo_wr=0 ) /end of write begin pe=pe+1;wr=0;rd=0;state=stop;busy=0;

11、 empty=0; if(pe+2=ph) full=1; else full=0; end read: if(fifo_rd=0) /end of read begin ph=ph+1;wr=0;rd=0;state=stop;busy=0;full=0; if(ph+1=pe) empty=1; else empty=0; end endcaselpm_ram_dp1 ram0(fifo_in,pe,ph,wr,rd,fifo_out); /module lpm_ram_dp0(data,wraddress,rdaddress,wren,rden,q);endmodule仿真结果:1.4

12、FIFO模型设计之二n支持连续写,连续读。n启动写操作,外部单一时钟节拍写,实际完成需滞后一拍n启动读操作,外部单一时钟节拍读,但需等待一拍n读、写不可同时进行/Fifo of continuous operation /Size:255Bytesmodule fifo_c(clk,nreset,pe,ph,fifo_in,fifo_out,data, fifo_wr,fifo_rd,busy,empty,full,state,wr,rd);input clk,nreset,fifo_wr,fifo_rd;/input7:0 fifo_in;output1:0 state;output emp

13、ty,full,wr,rd,busy;/output7:0 fifo_out,pe,ph,data; reg1:0 state;reg7:0 fifo_out,data;reg wr,rd,empty,full,busy; /fifo write , read ,empty , fullreg7:0pe,ph; /fifo point:P_end,P_headparameter write=1,read=2,stop=0;always(posedge clk)if (nreset=0) begin pe=0;ph=0; endelse case(state) stop: if( fifo_wr

14、=1 & pe+8b00000001 !=ph) /write start begin rd=0;wr=1;state=write;busy=1;data=fifo_in; end else if(fifo_rd=1 & pe!=ph) /read start begin wr=0;rd=1;state=read;busy=1; end else begin wr=0;rd=0;state=stop;busy=0; if(ph=pe) empty=1; else if(pe+1=ph) full=1; else begin empty=0; full=0; end end wr

15、ite: begin pe=pe+ 8b00000001;data=fifo_in; if( fifo_wr=0) /end of write begin wr=0;rd=0;state=stop;busy=0; empty=0; if(pe+ 8b00000010 =ph) full=1; else full=0; end else /write continue if(pe+ 8b00000010 =ph) begin / buffer is full. not to write. full=1; wr=0;rd=0;state=stop; busy=0; empty=0; end els

16、e /write continue begin wr=1;rd=0; state=write; busy=1; empty=0; end endread: begin ph=ph+ 8b00000001; if(fifo_rd=0) /end of read begin wr=0;rd=0;state=stop;busy=0;full=0; if(ph+ 8b00000001 =pe) empty =1; else empty=0; end else /read continue if(ph+ 8b00000001 =pe) / empty begin wr=0;rd=0;state=stop

17、;busy=0;full=0; end else / not empty begin wr=0;rd=1;state=read;busy=1; end end endcaselpm_ram_dp1 ram0(data,pe,ph,wr,rd,clk,fifo_out); endmodule实验1 FIFO设计与仿真验证要求:缓冲大于100级数据宽度16位习题习题1设计一个产生设计一个产生0100100111的序列信号发生器。的序列信号发生器。习题习题2试以调用库函数的方法设计一个容量为试以调用库函数的方法设计一个容量为8K24bit的的RAM。其双向数据线为。其双向数据线为D 0:23,地址线

18、为,地址线为A0:12,写,写信号为信号为new (低电平有效)(低电平有效),读信号为读信号为nrd(低电平有效)。(低电平有效)。习题习题3 设计一个设计一个8位的加位的加/减计数器。时钟信号为减计数器。时钟信号为 clk,同,同步清步清0信号为信号为rst。 clk上升沿时刻,当上升沿时刻,当inc=1计数器加计数器加2,当,当dec=1计数器减计数器减2,其它情况时计数器保持不变。,其它情况时计数器保持不变。 习题习题4设计一个位宽为设计一个位宽为8位、深度为位、深度为8层的堆栈。层的堆栈。第二章 定时器/计数器接口电路设计目的:设计一个与INTEL8253兼容的定时器/计数器2.1定

19、时器/计数器接口电路的功能n3通道、6种工作方式n16位计数器(每个计数器可按二进制或十进制来计数,时钟脉冲下降沿使计数器进行减1操作 )计数器初值寄存器GATECLKiOUTi减1计数器16位计数通道结构:可编程可编程地址线地址线:A1A0端口地址端口地址 :A1A0= 0 0- CN0数据端口 0 1- CN1数据端口 1 0- CN2数据端口 1 1-控制端口数据线:D7-D0控制线:/we, /rd, /cs通道I/O:clk0 , out0, gate0 clk1 , out1, gate1 clk2 , out2, gate22.2 8253的内部结构和引脚特性数据总线缓冲器读/写

20、控制逻辑控制字寄存器计数器0计数器1计数器2CLK0GATE0OUT0CLK1GATE1OUT1CLK2GATE2OUT2RDWRCSA0A1CSWRRDD7D0GNDVCCA01121324b) 引脚图a) 内部结构图CLK0GATE0OUT0A1CLK1GATE1OUT1GATE2OUT2CLK2D7D02.3 8253控制字格式 SC1SC2RW1RW2M2M1M0BCD00:计数器001:计数器110:计数器211:无意义00:锁存计数值01:只读写低8位10:只读写高8位11:先读写低8位 后读写高8位000:方式0001:方式1X10:方式2X11:方式3100:方式4101:方式

21、50:二进制计数1:十进制计数D7D6D5D4D3D2D1D0编程步骤:先写控制字(到控制口)再写计数器初值(到相应的通道端口)2.4 工作方式与工作时序工作方式与工作时序 1方式方式0(单脉冲发生器)(单脉冲发生器)n计数器只计一遍。控制字写入后,OUT端为低;当计数初值写入后,在下一个CLK脉冲的下降沿将计数初值寄存器内容装入减1计数寄存器,然后计数器开始减1计数,在计数期间,当减1计数器回0之前,输出端OUT维持低电平。n当计数值回0时,OUT输出端变为高电平,并保持到重新写入新的控制字或新的计数值为止。可作为中断请求信号。n在计数过程中,若GATE信号变为低电平,则在低电平期间暂停计数

22、,减1计数寄存器值保持不变。 n在计数过程中,若重新写入新的计数初值,则在下一个CLK脉冲的下降沿,减1计数寄存器以新的计数初值重新开始计数过程。 8253方式0三种情况的时序波形 CLKGATEOUT43210WRCLKGATEOUT43321CWN=40WRCLKGATEOUT43232CWN=4N=310WRCWN=4方式方式2(周期脉冲发生器)(周期脉冲发生器) 可产生周期性的负脉冲信号,负脉冲宽度为一个时钟周期。写入控制字后,OUT端变为高电平,若GATE为高电平,当写入计数初值后,在下一个CLK的下降沿将计数初值寄存器内容装入减1计数寄存器,并开始减1计数。当减1计数寄存器的值为1

23、时,OUT端输出低电平;减1计数寄存器回0时OUT端输出高电平,并开始一个新的计数过程。在减1计数寄存器未减到1时,GATE信号由高变低,则停止计数。但当GATE由低变高时,则重新将计数初值寄存器内容装入减1计数寄存器,并重新开始计数。GATE信号保持高电平,但在计数过程中重新写入计数初值,则当正在计数的一轮结束并输出一个CLK周期的负脉冲后,将以新的初值进行计数。 8253方式2下的三种情况:WRCLKGATEOUT32132CWN=31WRCLKGATEOUT32213CWN=32WRCLKGATEOUT32154CWN=33N=512.5 设计与仿真设计与仿真 控制口编程状态机:stat

24、e0=00-未编程或完毕 01-已写控制字(等待输入数据) 10-已写1字节数据(等待输入下一数据)通道0方式0状态机:cnt0_f=0-未启动(未装入计数初值寄存器内容) 1-已装入,作减1计数 2-已回0,不自动装入通道0方式2状态机:cnt0_f=0-未启动或等待装入计数初值寄存器内容 1-已装入,作减1计数 启动标志: start0_f=0, 不启动 =1, 启动(当编程完毕)/timer/counter:8253module timer(out0,clk0,d,gate0,a0,a1,nwe,nrd,ncs,cnt0,cnt0_f,control0); input clk0,gate

25、0,a0,a1,nwe,nrd,ncs; inout 7:0 d; output out0; output 15:0 cnt0; output 1:0 cnt0_f; output 7:0 control0; reg 7:0 control0; reg 15:0 cnt0_b,cnt0; reg 1:0 state0; reg 1:0 cnt0_f; reg start0_f,out0; wire clock0;assign d=(!nrd & !ncs & !a0 & !a1)? cnt07:0:8bzzzzzzzz; /read low_byte of cnt0as

26、sign d=(!nrd & !ncs & a0 & !a1)? cnt015:8:8bzzzzzzzz; /read high_byte of cnt0assign clock0=clk0 & start0_f & gate0;/8253 programalways (negedge start0_f or negedge clock0) if(start0_f=0) begin cnt0_f=0;out0=1; endelse begin case(control03:1) if( start0_f=1 ) /mode 0 /state=2o00 i

27、f(cnt0_f=0 ) /load / start_f=1 begin cnt015:0=cnt0_b15:0;cnt0_f=1;out0=0; end else if( cnt0!=1 & cnt0_f=1) begin out0=0;cnt0=cnt0-1; end else begin out0=1;cnt0_f=2; end if( start0_f=1 ) /mode 2 state=2o00 if(cnt0_f=0 ) /load begin cnt0=cnt0_b;cnt0_f=1;out0=1; end else if( cnt0=2 & cnt0_f=1)

28、begin out0=0;cnt0=cnt0-1;cnt0_f=0 ; end else cnt0=cnt0-1; default : cnt0_f=0 ; endcase endendmodule方式0仿真结果:方式2仿真结果:实验二 定时器/计数器设计与仿真验证作业1.设计一个同步计数式单稳态触发器。如下图示,已知clk为10MHz,脉冲k触发后,输出q为100uS的脉冲。clkkq2.设计一个16bit移位寄存器(右移),设移位时钟信号为clk。将RAM(256*16bit)中的数据不断依次取出,移位输出。3.试设计一个模块,能输出如下图所示的波形。t(us)1231Vmodule ge

29、n(clk,reset,wren,din,wraddr,out);input clk,reset,wren;input 15:0din;input 7:0wraddr;output out;reg7:0rdaddr;reg load;reg3:0 count;reg15:0q;wire rden,out;always (posedge clk)if (reset) begin count=0;load=1;rdaddr=0;endelse if (count=15) begin count=0;load=1;end else if (count=7) begin rdaddr=rdaddr+1

30、; count=count+1;load=0;end else begin count=count+1;load=0;endalways (posedge clk)if(load) q=dout;else begin q1;q15=0;endlpm_ram_dp0 ram0(din,wraddr,rdaddr,wren,rden, dout);assign out=q0;assign rden=1;endmodule第三章 异步串行通信接口设计起始位D0D1D2D3D4D5D6D7停止位空闲状态异步串行通信的数据帧结构异步串行通信的数据帧结构:波特率波特率(baud rate)例例:空闲状态起

31、始起始位位1 1位位数据数据7-87-8位位校验校验位位1 1位位停止停止位位1 1位位例例3-1:异步串行输出接口异步串行输出接口UART_TXdinwrcedbftxdresetclkdbf-data buffer fullmodule uart_tx(clk,din,nreset, wr,ce,dbf, txd);input clk,nreset ,wr,ce;/clk=0.694MHz/baud=0.694Mhz/12=57.6kHzinput 7:0din; output txd,dbf;reg7:0 data;reg9:0 shift;reg4:0 count,t;reg3:0 s

32、tate;reg 1:0 state0;reg dbf,tbr; / dbf-data buffer full.tbr-transmit buffer ready.例例3-1:assign txd=shift0;always(posedge clk or negedge nreset)if (nreset=0) state0=0;else case(state0) 0:if(wr=1 & ce=1) begin data=din;state0=1;end 1:if(wr=0 | ce=0) begin dbf=1;state0=2;end 2:if(tbr=1) begin dbf=0

33、;state0=0;end endcasealways(posedge clk or negedge nreset)if (nreset=0) begin state=0; shift=10b1;end elsecase(state)4b0000:if(t=11 & dbf=1) begin tbr=1; state=1;t=0; shift9=1; shift8:1=data7:0; shift0=0; /bit0:start bit end else if (t11) t=t+1;4b0001: if(t=11) /bit1:d0 begin shift1; shift9=1; s

34、tate=2;t=0; tbr=0; end else t=t+1;4b0010: if(t=11) /bit2:d1 begin shift1; shift9=1; state=3;t=0; end else t=t+1;4b0011: if(t=11) /bit3:d2 begin shift1; shift9=1; state=4;t=0; end else t=t+1; 4b0100: if(t=11) /bit4:d3 begin shift1; shift9=1; state=5;t=0; end else t=t+1; 4b0101: if(t=11) /bit5:d4 begi

35、n shift1; shift9=1; state=6;t=0; end else t=t+1;4b0110: if(t=11) /bit6:d5 begin shift1; shift9=1; state=7;t=0; end else t=t+1;4b0111: if(t=11) /bit7:d6 begin shift1; shift9=1; state=8;t=0; end else t=t+1;4b1000: if(t=11) /bit8:d7 begin shift1; shift9=1; state=9;t=0; end else t=t+1;4b1001: if(t=11) /

36、bit9:stop begin shift1;shift9=1; state=0;t=0; end else t=t+1;default : begin t=0; state=0;endendcaseendmodule异步串行输出接口仿真异步串行输出接口仿真AC75停止位起始位AC710075停止位起始位data例例3-2:异步串行输入接口异步串行输入接口UART_RXrdceerrorrxdclkrdcrdc-receive data completed单工异步串行输入、输出接口单工异步串行输入、输出接口UART_TXdinwrcedbftxdresetclkdataUART_RXrdcee

37、rrorrxdclkrdcMPU1MPU 2双工异步串行输入输出接口双工异步串行输入输出接口UARTdinwrcedbftxdresetclkdataUARTrdceerrorrxdclkMPU1MPU 2txdrxderrorrdcrdcresetrddbfwr起始位D0D1D2D3D4D5D6D7停止位空闲状态如何识别起始位?如何判别数据?如何判别停止位?module uart_rx(clk,rxd,rd,ce,data,s,t,error,rdc,nreset);input clk,rxd,nreset;/clk=0.694MHzinput rd,ce;output error,rdc;

38、/rdc-receive data completedoutput 7:0 data;output 3:0 s;output 4:0 t;reg 4:0 t;reg 3:0 s;reg 7:0 data0,data1;reg error,rdc;reg rdf;reg 7:0 data;/rdf-read data flagalways (ce or rd)if(ce & rd) =1 ) begin data= data1; rdf=1; endelse begin data=8hzz; rdf=0; end always (posedge clk) /baud=57.600khzi

39、f(!nreset) begin data1 = 8h00; rdc = 0; s = 0; t = 0; data0 = 8h00; error = 0; endelse begin if (rdf=1)rdc=0; case(s) 0:if(rxd=1)begin s=1;t=0;end/ 1:if(rxd=0)begin s=2;t=t+1;end 2:if(t=6) begin if(rxd=0) begin s=3;t=0;error=0;end else begin s=1;t=0; end end else t=t+1; 3:if(t=11) begin data00=rxd;t

40、=0;s=4;end else t=t+1; 4:if(t=11) begin data01=rxd;t=0;s=5;end else t=t+1; 5:if(t=11) begin data02=rxd;t=0;s=6;end else t=t+1; 6:if(t=11) begin data03=rxd;t=0;s=7;end else t=t+1; 7:if(t=11) begin data04=rxd;t=0;s=8;end else t=t+1; 8:if(t=11) begin data05=rxd;t=0;s=9;end else t=t+1; 9:if(t=11) begin

41、data06=rxd;t=0;s=10;end else t=t+1; 10:if(t=11) begin data07=rxd;t=0;s=11;end else t=t+1; 11:if(t=11) if(rxd=1) begin t=0;s=0;data1=data0;error=0; rdc=1; end else begin error=1;t=0;s=0;end/frame error or overflow error else t=t+1; default:begin t=0;s=0;end endcase endendmodule 异步串行输入接口仿真异步串行输入接口仿真实验

42、3 异步串行通信接口设计与仿真要求:1)设计异步串行通信接口发送模块并仿真)设计异步串行通信接口发送模块并仿真2)设计异步串行通信接口接收模块并仿真)设计异步串行通信接口接收模块并仿真3)设计顶层模块,实现与)设计顶层模块,实现与PC机通信机通信UART_TXdinwrcedbftxdresetclkdataUART_RXrdceerrorrxdclkrdcPCresetUARTDE2(RS232)(TTL)txdrxd(TTL)(RS232)MAX232参考程序module uart(CLOCK_50,UART_RXD,UART_TXD,LEDR,LEDG,KEY);input CLOCK_

43、50;input 0:0KEY;input UART_RXD;output UART_TXD; output 0:0LEDR; output 1:0LEDG;wire 7:0 data_rx;wire nreset,error,rdc,dbf;assign nreset = KEY0; /resetassign LEDR0 = error;assign LEDG0 = rdc;assign LEDG1 = dbf;reg rd_rx,ce_rx;reg wr_tx,ce_tx;always (posedge clk)beginif(rdc = 1)begin ce_rx = 1; rd_rx

44、= 1; endelse begin ce_rx = 0; rd_rx = 0; end if(ce_rx = 1 & rd_rx = 1) begin wr_tx = 1;ce_tx = 1;endelse begin wr_tx = 0;ce_tx Import Assignment,打开对话框,调入引脚对应文件DE2_pin_assignments_uart.txt即可。2)Assignments-pins3)锁好引脚后由锁好引脚后由Processing - Start compilation进行全编译进行全编译DE2_pin_assignments_uart.txtTo,Loc

45、ationKEY0,PIN_G26LEDR0,PIN_AE23LEDG0,PIN_AE22LEDG1,PIN_AF22CLOCK_50,PIN_N2UART_RXD,PIN_C25UART_TXD,PIN_B251)如果编译没有错误,准备下载。如果编译没有错误,准备下载。 由由Tools - Progammer2)硬件设置硬件设置:Currently selected hardware:usb 下载:3)弹出如下对话框,下载前做如下设置:弹出如下对话框,下载前做如下设置:n点击点击“Add File”,选择,选择uart.sof文件,文件,n设置设置Mode为为“JTAG”,点击,点击“Sta

46、rt”,开始下载,开始下载n在PC上运行”串口调试助手”n设定波特率为57600,无校验,数据位8位,停止位1位n在发送区发字符,接收区能收到.与PC机通信:第4章 调制解调器设计 在数字通信系统中,一般将原始信号经过量化编码变成二进制码流,称为基带信号。 数字基带信号一般不适合于直接传输,如通过公共电话网络传输数字信号时,由于电话网络带宽为3.4KHZ,因此数字信号不能直接在上面传输。此时可将数字信号进行调制后再进行传输。4.1 2FSK调制原理实现方法S2fsk(t)载波发生器1载波发生器22选1s(t)f1f2调制器f02选1f1Sin(w0t)Sin(w1t)DACClock(66MH

47、z)100.825MHz1.1MHz移位寄存器9696Tclk/8=12Tf096Tclk/6=16Tf1clk=6.6MHz基带信号n解调原理(非相干解调法,由鉴相器实现)解调器DD11&clrclrQQfifrADC10: cap=cap+101: cap=cap-1Clock(66MHz)700.942MHz抽样判决module TOP( clock, /输入时钟66MHZ reset, /异步复位信号 高电平有效 d_out, d0, Dout,data,cap,qi,qr);input clock;input reset;output 7:0d_out,data;output

48、 d0,qi,qr;output Dout; output 5:0cap;reg 7:0data;reg3:0 cnt0;assign clk=cnt03;/6.6MHZalways (posedge clock ) if(cnt0=9) cnt0=0; else cnt0=cnt0+1b1;always (posedge clk ) if(reset) data=8b1010_1100; wire busy;modulation fsk_mo( .reset(reset), .clk(clk), .data(data), .busy(busy), .d_out(d_out), .d0(d0)

49、 );demodulation fsk_de( .reset(reset), .clock(clock), .AD_data(d_out), .Dout(Dout), .cap(cap),.qi(qi),.qr(qr) );endmodule module modulation(reset,clk,data,busy,d_out,d0);input reset,clk;input 7:0data;output 7:0d_out;/input of dac output busy,d0;reg7:0 d_out;reg7:0 data_buf;reg3:0 stat0,stat1;reg11:0

50、cnt;reg busy;reg d0;always(posedge clk) d0=data_buf0; always(posedge clk) if (reset=1) cnt=0;else case(cnt)95:begin data_buf1;cnt=cnt+1b1;busy=0;end191:begin data_buf1;cnt=cnt+1b1;end287:begin data_buf1;cnt=cnt+1b1;end383:begin data_buf1;cnt=cnt+1b1;end479:begin data_buf1;cnt=cnt+1b1;end575:begin da

51、ta_buf1;cnt=cnt+1b1;end672:begin data_buf1;cnt=cnt+1b1;busy=1;end768:begin data_buf=data;cnt=0;enddefault: cnt=cnt+1b1; endcasealways(posedge clk)if (data_buf0=0) case(stat0)0:begin d_out=128;stat0=stat0+1b1;end1:begin d_out=128+71;stat0=stat0+1b1;end2:begin d_out=128+100;stat0=stat0+1b1;end3:begin

52、d_out=128+71;stat0=stat0+1b1;end4:begin d_out=128;stat0=stat0+1b1;end5:begin d_out=128-71;stat0=stat0+1b1;end6:begin d_out=128-100;stat0=stat0+1b1;end7:begin d_out=128-71;stat0=0;stat1=0;enddefault begin d_out=128;stat0=1b0;end endcaseelse case(stat1)0:begin d_out=128;stat1=stat1+1b1;end1:begin d_ou

53、t=128+82;stat1=stat1+1b1;end2:begin d_out=128+82;stat1=stat1+1b1;end3:begin d_out=128;stat1=stat1+1b1;end4:begin d_out=128-82;stat1=stat1+1b1;end5:begin d_out=128-82;stat1=0;stat0=0;enddefault: begin d_out=128;stat1138)fi=1; /fi is input of demodulation else if(AD_data118) fi=0;endalways (posedge cl

54、ock)/begin if(count=69) /fr=66MHz/70=0.942MHz, f0=6.6MHz/8=0.825MHz,f1=6.6MHz/6=1.1MHzcount=0;else count=count+1;if(count35)fr=35)fr=1;endalways (posedge fr or posedge clr) /qr_dffif(clr=1) qr=0;else qr=1;always (posedge fi or posedge clr) /qi_dffif(clr=1) qi=0;else qi=1;always (posedge clock or pos

55、edge reset) if(reset) cap20)cap=cap-1;else if(qr=0 & qi=1 & cap40)cap=30)Dout=1;else if(cap30)Dout=0;endmodule4.2 2PSK调制器实现方案:S(t)S2psk(t)0例:f02选1f1Sin( t)Sin(t+)DACClock(66MHz)16 = 2 4.125 /16(MHz)Clk4.125MHzfout移位寄存器基带信号16LOADDATA解调器实现方案:2PSKBPFLPF抽样判决定时脉冲COS wcty(t) s(t) x(t) s(t) ADCABSf

56、ip0=p1;p1=p2; p14=p15;if (q=1)p15= AD;elsep15= - AD;QDAD_datapq(1,-1)p110LPF1D_outAD*qD_out1110AD转换为补码(偏移码)VCO2LPF鉴相器PLLAD_datamodule psk_1( clock, /输入时钟66MHZ reset, /异步复位信号 高电平有效 d_out, d0, Dout,data,cap,q,p15,d,AD);input clock;input reset;output 7:0d_out,data;output d0,q,d;output 11:0p15;output 7:

57、0AD; output Dout; output 11:0cap;reg 7:0data;reg 3:0cnt;wire busy;assign clk=cnt3;always(posedge clock)cnt=cnt+1;always (posedge clk ) if(reset) data=8b1010_1101; modulation mo( .reset(reset), .clk(clk), .data(data), .busy(busy), .d_out(d_out), .d0(d0) );demodulation de( .reset(reset), .clock(clock)

58、, .AD_data(d_out), .Dout(Dout), .cap(cap),.q(q),.p15(p15),.d(d),.AD(AD) );endmodule module modulation(reset,clk,data,busy,d_out,d0);input reset,clk;/clk-4.125MHzinput 7:0data;output 7:0d_out;/input of dac output busy,d0;reg7:0 d_out;reg7:0 data_buf;reg3:0 stat0,stat1;reg busy;reg d0;reg6:0cnt;/16*8a

59、lways(posedge clk) d0=data_buf0; / mod 128always(posedge clk) if (reset=1) begin cnt=0;stat0=0;stat1=0;endelsebegin case(cnt)15:begin data_buf1;cnt=cnt+1b1;busy=0;end 31:begin data_buf1;cnt=cnt+1b1;end47:begin data_buf1;cnt=cnt+1b1;end63:begin data_buf1;cnt=cnt+1b1;end79:begin data_buf1;cnt=cnt+1b1;

60、end95:begin data_buf1;cnt=cnt+1b1;end111:begin data_buf1;cnt=cnt+1b1;busy=1;end127:begin data_buf=data;cnt=0;enddefault: cnt=cnt+1b1; endcaseif (data_buf0=1) case(stat0)0:begin d_out=128;stat0=stat0+1b1;end1:begin d_out=128+38;stat0=stat0+1b1;end2:begin d_out=128+71;stat0=stat0+1b1;end3:begin d_out=128+92;stat0=stat0+1b1;end4:begin d_out=128+100;stat0=stat0+1b1;end5:begin d_out=12

温馨提示

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

评论

0/150

提交评论