马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
题目:设计一个简易异步接收机,用BCD05工艺库实现(从代码到版图)。 1M==1us
1.接收机功能 发送机等价为一个11位的移位寄存器,发送数据时以固定的125KHz的频率移位。发送数据格式见图1。发送机在空闲状态下(不发送数据时)txd端口(与接收机的rxd相连)为1,由于发送数据的第一位总是0,故接收机可检测到一个“负跳变”以实现发送与接收的同步。接下来的8位是要求接收的数据,接收机应能够正确接收该数据,使接收端的b[7:0]等于发送端的b[7:0]。发送端的第10位为奇偶校验位e,e等于b0^b1^b2^b3^b4^b5^b6^b7,接收机可根据接收到的b[7:0]与e的关系判断是否发生了数据传输错误。发送数据的最后一位为固定的1,确保空闲状态下txd端口为1。 2.接收机端口定义 (1)rxd: 接收数据端口 (2)rst_n: 同步复位端,低有效。 (3)rcv_en:接收使能信号,高有效。 (4)b[7:0]: 接收数据。 (5)rcv_ok: 接收正确的标志。每次接收开始时清0,接收到校验位e后,根据运算决定输出,1表示正确,0表示错误。 (6)rcv_st:接收状态。1表示正在接收过程中,b[7:0]不可用,0表示已完成接收,b[7:0]可用。 3.设计环境 (1)所有输出端负载为0.1PF。 (2)所有输入信号内阻为1k。 (3)所有输入信号上升、下降时间不超过2ns。 (4)rcv_en端输入延迟为时钟周期的20%。 (5)输出延迟为时钟周期的30%。 4.答题要求 (1)设计代码
(2)验证代码,包括正确的和有接收错误的。 (4)状态机和数据通道图。 (5)仿真结果 (6)逻辑综合脚本 (7)版图 尝试了修改latch 块,但改完功能受影响;
求助各位大神,怎么解决而影响功能呀 我写的Verilog代码如下:
//2014-06-22
module tg(b,a,y); input a; input b; output y; reg y;
always@(a or b) if(a==1'b1) y=b; else y=1'b1; endmodule //---------------------------------------------------------------------------------------------------------------- module det(din,clk,rst_n,en,neg); input din; input clk; input rst_n; input en; output neg; reg q1; reg q2; reg neg; always @(posedge clk) begin q1<=din; q2<=q1 ; if(rst_n==1'b0 ) neg<=0; else if(en==1'b0 && din==1'b0) neg<=q1^q2; else neg<=0; end
endmodule //--------------------------------------------------------------------------------------------------------- module latch(clk,clr,y); input clk; input clr; output y; //-------------------- reg y; reg x; //-------------------- always@(negedge clr) if(clr==1'b0) y<=1'b0; //------------------------ always@(clk) begin x=1'b1; if(clk==1'b1) y=x; end endmodule
//----------------------------------------------------------------------------------------------------------- module dff(data,clk,clr,q); input data; input clk; input clr; output q;
reg q;
always@(posedge clk or posedge clr ) if(clr==1'b1) q<=1'b0; else q<=data; endmodule //------------------------------------------------------------------------------------------------------- module cnt16(clk,clr,ena,co); input clk; input clr; input ena; output co;
reg co; reg [3:0]q;
always@(posedge clk or negedge clr) begin if(clr==1'b0) q<=4'h0; else if(ena==1'b1) if (q==4'b1111) q<=4'b0000; else q<=q+1'b1; end
always@(q) begin if(q==4'b1111) co=4'h1; else co=4'h0; end endmodule //-------------------------------------------------------------------------------------------------------- module cnt11(clk,clr,ena,q,co); input clk; input clr; input ena; output [3:0]q; output co;
reg [3:0]q; reg co;
always@(posedge clk or negedge clr) begin if(clr==1'b0) q<=4'h0; else if(ena==1'b1) if (q==4'b1010) q<=4'b0000; else q<=q+1'b1; end
always@(q) begin if(q==4'b1010) co=4'h1; else co=4'h0; end endmodule //----------------------------------------------------------------------------------------------------------- module receiver_fsm(clk,rst_n,x1,neg,rcv_st,q1,q2); input clk; input rst_n; input [3:0] x1; input neg; output rcv_st; output q1; output q2; //--------------- reg rcv_st; reg q1; reg q2; reg [2:0]cs; reg [2:0]ns; //--------------------- parameter idle =3'b000; parameter st1 =3'b001; parameter st2 =3'b010; parameter st3 =3'b011; parameter st4 =3'b100; parameter st5 =3'b101; //--------------------- always@(posedge clk) if(rst_n==1'b0) cs <=idle; else cs <=ns; //--------------------------------------- always@(cs or x1 or neg) case(cs) idle: begin {rcv_st,q1,q2}=3'b000; if(x1==4'b0000) ns=st1; end st1: begin {rcv_st,q1,q2}=3'b001; if(x1==4'b0000) ns=st1; else if(4'b0001<=x1<=4'b0111) ns=st2; end st2: begin {rcv_st,q1,q2}=3'b101; if(x1==4'b1000) ns=st3; end st3: begin {rcv_st,q1,q2}=3'b100; if(x1==4'b1001) ns=st4; end st4: begin {rcv_st,q1,q2}=3'b110; if(x1==4'b1010) ns=st5; end st5: begin {rcv_st,q1,q2}=3'b010; if(neg==1'b1) ns=idle; end endcase
endmodule
//----------------------------------------------------------------------------------------------- module s2p (sdata,clk,rst_n,en1,en2,in1,out,pdata); output [7:0] pdata; output out; input sdata,clk,rst_n,en1; input en2,in1; reg out; reg [7:0] pdata; reg [7:0] p_reg; //--------------------------------------- always @(posedge clk or negedge rst_n) if (rst_n==1'b0) begin pdata <=8'h00; end else if(en1==1) begin pdata[7:0]<=8'hzz; p_reg[7:1]<=p_reg [6:0]; p_reg[0]<=sdata; end else if(en1==1'b0) begin pdata<=p_reg; end //---------------------------------------------- always@(en2 or in1 or p_reg) if(en2==1'b0) out=1'b0; else out=in1^~yh(p_reg); function yh; input[7:0] a; integer i; begin yh=a[0]; for (i=1;i<8;i=i+1) begin yh=yh^a; end end endfunction //-------------------------------------- endmodule //------------------------------------------------------------------------------------------------------ module receiver2(rxd,rst_n,rcv_en,clk,b8bit,rcv_ok,rcv_st); input rxd; input rst_n; input rcv_en; input clk; output [7:0] b8bit; output rcv_ok; output rcv_st;
//--------------------------- wire s0,s1,s2,s3,s4,s5,s7,s8,s10; wire [3:0]s6; reg [2:0]cs,ns; //----------------------------- parameter idle=3'b000; parameter st1 =3'b001; parameter st2 =3'b010; parameter st3 =3'b011; parameter st4 =3'b100; //---------------------------- tg u1(.b(rcv_st),.a(rcv_en),.y(s0)); det u2(.din(rxd),.clk(clk),.rst_n(rst_n),.en(s0),.neg(s1)); latch u3(.clk(s1),.clr(s2),.y(s3)); latch u3_1(.clk(s10),.clr(s1),.y(rcv_ok)); dff u4(.data(rxd),.clk(s4),.clr(s1),.q(s5)); cnt16 u5(.clk(clk),.clr(rst_n),.ena(s3),.co(s4)); cnt11 u6(.clk(s4),.clr(rst_n),.ena(s3),.q(s6),.co(s2)); receiver_fsm u7(.clk(clk),.rst_n(rst_n),.x1(s6),.neg(s1),.rcv_st(rcv_st),.q1(s8),.q2(s7)); s2p u9(.sdata(rxd),.clk(s4),.rst_n(rst_n),.en1(s7),.en2(s8),.in1(s5),.out(s10),.pdata(b8bit)); //--------------------------------------------------------------------------------------------------------- endmodule
测试代码如下 module receiver2_tb();reg rxd;reg rst_n;reg rcv_en;reg clk;wire [7:0] b8bit;wire rcv_ok;wire rcv_st;//-----------------------------receiver2 u0(.rxd(rxd),.rst_n(rst_n),.rcv_en(rcv_en),.clk(clk),.b8bit(b8bit),.rcv_ok(rcv_ok),.rcv_st(rcv_st));//-----------------------task half_pulse;inout clock; #2.5clock = ~ clock;endtask//----------------------------------------------------------------------------task pulse;input[31:0] num;integer i; for(i=0;i<num;i=i+1) begin half_pulse(clk); half_pulse(clk); end endtask//-------------------------------initial beginrst_n=1'b0;rcv_en=1'b1;clk=1'b0;rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;rst_n=1'b1;#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;//e bit#95rxd=1'b1;//end bit#95 rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;//e bit#95rxd=1'b1;//end bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;//e bit#95rxd=1'b1;//end bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;//e bit#95rxd=1'b1;//end bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//12 bite 1#95rxd=1'b0;//begin bit#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b0;#95rxd=1'b0;#95rxd=1'b1;#95rxd=1'b1;#95rxd=1'b1;//e bit#95rxd=1'b1;//end bitend//--------------------initial pulse(50000000);//-----------------------endmodule 用DC编译时报错如下图
脚本文件如下 #------------------------------------------------------------------------------# File : A TCL format DC script file # Author : xinxn # date : 2010-08-04 #------------------------------------------------------------------------------set TECH_LIB_PATH "/iclibs/CSMCBCD05/synopsys"set SYMBOL_LIB_PATH "/iclibs/CSMCBCD05/icons"set CORE_LIB "IC05CScore_50_typbcdv10.db"set IO_LIB "IC05CSpad_50_typbcdv10.db"#------------------------------------------------------------------------------set search_path [concat $TECH_LIB_PATH $search_path]set search_path [concat $SYMBOL_LIB_PATH $search_path]echo $search_path#------------------------------------------------------------------------------set target_library {IC05CScore_50_typbcdv10.db}set link_library {* IC05CScore_50_typbcdv10.db IC05CSpad_50_typbcdv10.db}set symbol_library {IC05CScore.sdb}#------------------------------------------------------------------------------# add DesignWare Libs to link library#------------------------------------------------------------------------------set SYN_LIB {dw_foundation.sldb}lappend link_library $SYN_LIB#------------------------------------------------------------------------------#------------------------------------------------------------------------------set WORK_DIR /home/socusr/dcset THIS_DESIGN receiver2#------------------------------------------------------------------------------# reports path and file#------------------------------------------------------------------------------set SETUP_RPT_FILE $WORK_DIR/report/setup_time.rptset HOLD_RPT_FILE $WORK_DIR/report/hold_time.rptset AREA_RPT_FILE $WORK_DIR/report/area.rptset CELL_RPT_FILE $WORK_DIR/report/cell.rptset POWER_RPT_FILE $WORK_DIR/report/power.rptset VIOL_FILE $WORK_DIR/report/voilation.rpt#----------------------------------------------------------------------------------set NETLIST_FILE $WORK_DIR/netlist/receiver2_gate.vset SDC_FILE $WORK_DIR/sdc/receiver2.sdc#----------------------------------------------------------------------------------set CLK_PER 5set IN_DLY [expr $CLK_PER * 0.2]set OUT_DLY [expr $CLK_PER * 0.3]set MAX_TRANSITION 0.1#----------------------------------------------------------------------------------read_verilog $WORK_DIR/code/receiver2.vcurrent_design $THIS_DESIGNlinkcheck_design#----------------------------------------------------------------------------------set ALL_EX_CLK [remove_from_collection [all_inputs] [get_ports clk]]#----------------------------------------------------------------------------------# design rules constraints#----------------------------------------------------------------------------------# set driving ability of input ports and load of output ports.#----------------------------------------------------------------------------------set_drive 1.0 $ALL_EX_CLKset_drive 0 [get_ports clk]set_load 0.1 [all_outputs]#----------------------------------------------------------------------------------set auto_wire_load_selection trueset_max_transition $MAX_TRANSITION $THIS_DESIGNset_max_fanout 6 $ALL_EX_CLKset_max_fanout 2 [get_ports rst_n] #-----------------------------------------------------------------------------------# Timing constraints#-----------------------------------------------------------------------------------create_clock -p $CLK_PER -name CLK [get_ports clk]set_clock_latency 1.0 [get_clocks CLK]set_clock_uncertainty -setup 0.1 CLKset_clock_uncertainty -hold 0.1 CLKset_input_delay -max $IN_DLY -clock CLK $ALL_EX_CLK set_input_delay -min 0.5 -clock CLK $ALL_EX_CLKset_output_delay $OUT_DLY [all_outputs]#-----------------------------------------------------------------------------------report_port #-----------------------------------------------------------------------------------set_dont_touch_network [get_clocks CLK]uniquifyset_max_area 0compile -map_effort high#-----------------------------------------------------------------------------------report_constraint -all_violators > $VIOL_FILE#-----------------------------------------------------------------------------------report_timing > $SETUP_RPT_FILEreport_timing -delay min > $HOLD_RPT_FILE#-----------------------------------------------------------------------------------report_cell > $CELL_RPT_FILEreport_area > $AREA_RPT_FILEreport_power > $POWER_RPT_FILE#-----------------------------------------------------------------------------------#-----------------------------------------------------------------------------------write -format verilog -hier -o $NETLIST_FILEwrite_sdc -nosplit $SDC_FILE#quit
尝试了修改latch 块,但改完功能受影响;
求助各位大神,怎么解决而影响功能呀 |