可编程逻辑器件设计及应用试验报告 下载本文

b、 CLK:时钟射入,频率为22.1184MHz;

c、 CLK_S:对应波特率分频输出,根据FreSel输入控制数据进行对应分频,对应模式

有300、600、1200、1800、2400、4800、9600、14.4K、19.2K、28.8Kbps d、 CLK_S16:对应波特率16倍分频输出; ? 过程说明:

a、 建立Verilog模块; b、 建立Verilog仿真; c、 验证模块正确性;

d、 建立电路图方式顶层模块Serial

e、 连接波特率发生器模块和模式控制模块进行联合验证;

源代码如下:

module FreqMod(FreSel, CLK, CLK_S16, CLK_S); input [3:0] FreSel; input CLK;

output CLK_S16; output CLK_S; reg CLK_S=0; reg CLK_S16=0; reg [16:0]count=0; reg [16:0]count_16=0; reg [16:0]num=0; reg [16:0]num16=0; always @(posedge CLK) begin if(FreSel==0) num<=36864;//300 else if(FreSel==1) num<=18432;//600 else if(FreSel==2) num<=9216;//1200 else if(FreSel==3) num<=6144;//1800 else if(FreSel==4) num<=4608;//2400 else if(FreSel==5) num<=2304;//4800 else if(FreSel==6) num<=1152;//9600 else if(FreSel==7) num<=768;//14.4k else if(FreSel==8) num<=576;//19.2k else if(FreSel==9) num<=384;//28.8k

end always @(posedge CLK) begin count<=count+1; num16<=num/(16); count_16=count_16+1; if(count>=num) begin CLK_S<=~CLK_S; count<=0; end if(count_16>=num16) begin CLK_S16<=~CLK_S16; count_16<=0; end end endmodule

测试代码如下:

module FreqModTest_v; // Inputs reg [3:0] FreSel; reg CLK; // Outputs wire CLK_S16; wire CLK_S;

parameter PERIOD = 100; //value=时钟周期(单位ns) always begin CLK= 1'b0;

#(PERIOD/2) CLK = 1'b1; #(PERIOD/2); end // Instantiate the Unit Under Test (UUT) BitProducer uut ( .FreSel(FreSel), .CLK(CLK), .CLK_S16(CLK_S16), .CLK_S(CLK_S) ); initial begin

// Initialize Inputs // Wait 100 ns for global reset to finish #100;

FreSel=1001; // Add stimulus here end endmodule

4、 建立发送数据模块(verilog)

81DataInTXWR发送数据模块CLKModBUSY1111

图5-3 发送数据模块

? 功能说明:

a、 DataIn:发送数据输入、8bits;

b、 WR:控制数据写入,1bit;上升沿锁存输入数据;写入后下一个CLK上升沿开始

立即发送数据

c、 CLK:时钟射入,对应波特率时钟;

d、 Mod:模式输入,0对应无奇偶校验;1对应有奇偶校验;

e、 TX:串行数据输出,平时高电平,当有数据输入后,下一个CLK上升沿开始立即

发送数据;

f、 BUSY:空闲指示,当TX输出时为高,其它时间为低; ? 过程说明:

a、 建立Verilog模块; b、 建立Verilog仿真; c、 验证模块正确性; d、 加入顶层模块Serial e、 进行联合验证;

源代码如下:

module TxMod(DataIn, WR, CLK, Mod, TX, BUSY); input [7:0] DataIn; input WR; input CLK; input Mod; output TX; output BUSY; reg Tx=1;

reg Busy=0; reg [7:0]data=0; reg flag=0; reg [3:0]count=1; reg num=0; always @(posedge WR) begin

data<=DataIn; num<=data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+data[7]; flag<=1; end always @(posedge CLK) begin if(flag==1) begin Busy<=1; if(count==1) Tx<=0; else if(count==2) Tx<=data[0]; else if(count==3) Tx<=data[1]; else if(count==4) Tx<=data[2]; else if(count==5) Tx<=data[3]; else if(count==6) Tx<=data[4]; else if(count==7) Tx<=data[5]; else if(count==8) Tx<=data[6]; else if(count==9) Tx<=data[7]; else if(count==10) begin if(Mod==0) Tx<=1; else if(Mod==1) Tx<=num; count<=0; flag<=0; end count<=count+1;