qq_34976559
ElementWeird
2020-12-15 15:37
采纳率: 100%
浏览 208

verilog语法问题,截取多位寄存器中连续的某些位赋值

44位的寄存器[43:0]DataBuf;

截取其中八位,比如第4到第11是用DataBuf[11:4]吗?

复制到buf<=DataBuf[11:4];这样对吗?

如果正确为什么我仿真时这一步后buf中毫无变化?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • windhit
    windhit 2020-12-15 23:06
    已采纳

    这样截位是没问题的,buf没变化,要看下时钟、复位信号什么的是否都正常。或者你把代码贴上来我帮你看看。

    点赞 评论
  • qq_34976559
    ElementWeird 2020-12-16 14:15
    module Rec
    (
    	data,clk,rstn,got,outbuf
    );
    input data;
    input clk;
    input rstn;
    output got;
    output outbuf;
    localparam
    zero    =3'b000,
    first   =3'b001,
    second  =3'b010,
    third   =3'b011,
    fourth  =3'b100,
    fifth   =3'b111,
    sixth   =3'b110,
    HighPulseShortestTime  =90,//corresponding to 1.8us
    HighPulselongestTime  =180,//corresponding to 3.6us
    ShortestOneBitTime    =950,//corresponding to 19us
    longestOneBitTime    =1100,//corresponding to 22us
    NormalOneTime        =1040;//corresponding to 20.8us
    
    reg data1,data2;
    reg [2:0]stage;
    reg [2:0]c_stage;
    reg [2:0]c_stage2;
    reg got;
    reg [43:0]DataBuf;
    reg [15:0]TimeCnt;
    reg [6:0]bitCnt;
    reg tempsum;
    reg [7:0]tempByteBuf;
    reg [7:0]tempByteBuf1;
    reg [23:0]outbuf;
    /**********************/
    //intermediate val
    reg stageRstMedia;
    /**********************/
    
    
    
    always@(posedge clk or negedge rstn)
    begin
    	if(rstn==1'b0)
    	begin
    		stage<=zero;
    		DataBuf<=44'b0;
    		TimeCnt<=4'h0000;
    		data1<=0;
    		data2<=0;
    		bitCnt<=0;
    	end
    	else
    	begin
    		data1<=data;
    		data2<=data1;
    		if(stageRstMedia==1)
    		begin
    			stage<=zero;
    		end
    		if(bitCnt==44)
    			stage<=fourth;
    		case(stage)
    			zero://after reset,from 0 to 1
    			begin
    				if(data2==1)
    				begin
    					stage<=first;
    					TimeCnt<=0;
    				end
    				else
    				begin
    					stage<=zero;
    					TimeCnt<=0;
    					DataBuf<=44'b0;
    					bitCnt<=0;
    				end
    			end
    			
    			first://from 1 to 0 in one bit or 1...
    			begin
    				TimeCnt<=TimeCnt+1;
    				if(data2==0)//sginal changed
    				begin
    					if(TimeCnt<HighPulseShortestTime)
    					begin
    						stage<=zero;
    						TimeCnt<=0;
    						DataBuf<=44'b0;
    						bitCnt<=0;
    					end
    					else
    					begin
    						stage<=second;
    					end
    				end
    				else
    				begin
    					if(TimeCnt>HighPulselongestTime)
    					begin
    						stage<=zero;
    						TimeCnt<=0;
    						DataBuf<=44'b0;
    						bitCnt<=0;
    					end
    				end
    			end
    			
    			second://from 0 to 1 or from 0 to 0 in one bit
    			begin
    				TimeCnt<=TimeCnt+1;
    				if(data2==1)
    				begin
    					if(TimeCnt<ShortestOneBitTime)
    					begin
    						stage<=zero;
    						TimeCnt<=0;
    						DataBuf<=44'b0;
    						bitCnt<=0;
    					end
    					else//normally received one bit
    					begin
    						DataBuf<=DataBuf|(44'b1<<bitCnt);
    						bitCnt<=bitCnt+1;
    						TimeCnt<=0;
    						stage<=first;//because next bit mybe recognize as 1
    					end
    				end
    				if(TimeCnt>longestOneBitTime)
    				begin
    					DataBuf<=DataBuf|(44'b1<<bitCnt);
    					bitCnt<=bitCnt+1;
    					stage<=third;
    					TimeCnt<=longestOneBitTime-NormalOneTime;
    					
    				end
    			end
    			
    			third://from 0 to 0 or 0 to 1
    			begin
    				TimeCnt<=TimeCnt+1;
    				if(data2==1)
    				begin
    					if(TimeCnt>ShortestOneBitTime)
    					begin
    						bitCnt<=bitCnt+1;//jump one bit as 0
    						stage<=first;
    						TimeCnt<=0;
    					end
    					else
    					begin
    						stage<=zero;
    						TimeCnt<=0;
    						DataBuf<=44'b0;
    						bitCnt<=0;
    					end
    				end
    				if(TimeCnt>longestOneBitTime)
    				begin
    					bitCnt<=bitCnt+1;//jump one bit as 0
    					stage<=third;
    					TimeCnt<=longestOneBitTime-NormalOneTime;
    				end
    			end
    			
    			fourth:
    			begin
    				
    			end
    			
    		endcase
    	
    	end
    end
    
    always@(posedge clk or negedge rstn)
    begin
    	if(rstn==1'b0)
    	begin
    		tempByteBuf<=0;
    		tempByteBuf1<=0;
    		stageRstMedia<=0;
    		got<=0;
    		c_stage<=zero;
    		c_stage2<=0;
    	end
    	else
    	begin
    //		if(bitCnt>4)//head check
    //		begin
    //			if((DataBuf[0]!=1)||(DataBuf[1]!=0)||(DataBuf[2]!=1)||(DataBuf[3]!=1))
    //			begin
    //				stageRstMedia<=1;				
    //			end
    //		end
    //		if(bitCnt==44)//tail check
    //		begin
    //			if((DataBuf[40]!=1)||(DataBuf[41]!=1)||(DataBuf[42]!=0)||(DataBuf[43]!=1))
    //			begin
    //				stageRstMedia<=1;	
    //			end
    //		end
    //		if(bitCnt>13)
    //		begin
    //		end
    		case(c_stage)
    			zero:
    			begin
    				if(bitCnt>4)
    				begin
    					if((DataBuf[0]!=1)||(DataBuf[1]!=0)||(DataBuf[2]!=1)||(DataBuf[3]!=1))
    					begin
    						stageRstMedia<=1;
    						c_stage<=sixth;
    					end
    					else
    					begin
    						c_stage<=c_stage+1;
    					end
    				end	
    			end
    			first:
    			begin
    				if(bitCnt>13)
    				begin
    					tempsum=DataBuf[4]+DataBuf[5]+DataBuf[6]+DataBuf[7]+DataBuf[8]+DataBuf[9]+DataBuf[10]+DataBuf[11]+1;
    					if(tempsum!=DataBuf[12])
    					begin
    						stageRstMedia<=1;
    						c_stage<=sixth;
    					end
    					else
    					begin
    						c_stage<=c_stage+1;
    					end
    				end
    			end
    			second:
    			begin
    				if(bitCnt>22)
    				begin
    					tempsum=DataBuf[13]+DataBuf[14]+DataBuf[15]+DataBuf[16]+DataBuf[17]+DataBuf[18]+DataBuf[19]+DataBuf[20]+1;
    					if(tempsum!=DataBuf[21])
    					begin
    						stageRstMedia<=1;
    						tempByteBuf=DataBuf[11:4];
    						c_stage<=sixth;
    					end
    					else
    					begin
    						c_stage<=c_stage+1;
    					end
    				end
    			end
    			third:
    			begin
    				if(bitCnt>31)
    				begin
    					tempsum=DataBuf[22]+DataBuf[23]+DataBuf[24]+DataBuf[25]+DataBuf[26]+DataBuf[27]+DataBuf[28]+DataBuf[29]+1;
    					if(tempsum!=DataBuf[30])
    					begin
    						stageRstMedia<=1;
    						c_stage<=sixth;
    					end
    					else
    					begin
    						c_stage<=c_stage+1;
    					end
    				end
    			end
    			fourth:
    			begin
    				if(bitCnt>40)
    				begin
    					tempsum=DataBuf[31]+DataBuf[32]+DataBuf[33]+DataBuf[34]+DataBuf[35]+DataBuf[36]+DataBuf[37]+DataBuf[38]+1;
    					if(tempsum!=DataBuf[39])
    					begin
    						stageRstMedia<=1;
    						c_stage<=sixth;
    					end
    					else
    					begin
    						c_stage<=c_stage+1;
    					end
    				end
    			end
    			fifth:
    			begin
    				case(c_stage2)
    				0:
    				begin
    					c_stage2<=c_stage2+1;
    					tempByteBuf=DataBuf[11:4];
    					//tempByteBuf=DataBuf[11:4]+DataBuf[20:13];
    					//outbuf[7:0]<=DataBuf[11:4];
    				end
    				1:
    				begin
    					tempByteBuf=tempByteBuf+DataBuf[29:22];
    					tempByteBuf1<=DataBuf[38:31];
    					c_stage2<=c_stage2+1;
    				end
    				2:
    				begin
    					if(tempByteBuf1==tempByteBuf)
    					begin
    						got<=1;
    						outbuf[7:0]<=DataBuf[11:4];
    						outbuf[15:8]<=DataBuf[20:13];
    						outbuf[23:16]<=DataBuf[29:22];
    						c_stage2<=0;
    					end
    					else
    					begin
    						c_stage2<=0;
    						got<=0;
    						stageRstMedia<=1;
    						c_stage<=sixth;
    					end
    				end
    				endcase
    			end
    			sixth:
    			begin
    				c_stage<=zero;
    			end
    		endcase
    	end
    end
    endmodule
    点赞 评论
  • qq_34976559
    ElementWeird 2020-12-16 14:19

    你好,上面是我的代码,我c_stage2的case是想做一个校验和检验,但是赋值过程都没有进行下去,很奇怪不知道卡在哪里了。
    另外还有一个问题是 verilog3个单字节的数相加,如果我用非阻塞赋值,在一个clock内完成吗?应该不可能吧,如果不能综合出来的电路岂不是和语法逻辑有矛盾,这个我一直有疑问。方便加微信吗?如果你能解答我的问题真的很感谢。

    点赞 评论
  • qq_34976559
    ElementWeird 2020-12-16 14:22

    fifth:
                begin
                    case(c_stage2)
                    0:
                    begin
                        c_stage2<=c_stage2+1;
                        tempByteBuf=DataBuf[11:4];
                        //tempByteBuf=DataBuf[11:4]+DataBuf[20:13];
                        //outbuf[7:0]<=DataBuf[11:4];
                    end
                    1:
                    begin
                        tempByteBuf=tempByteBuf+DataBuf[29:22];
                        tempByteBuf1<=DataBuf[38:31];
                        c_stage2<=c_stage2+1;
                    end

    抱歉,代码有点长,进程卡在这,tempByteBuf没有更新,不清楚是啥原因。  作揖

    点赞 评论
  • qq_34976559
    ElementWeird 2020-12-16 15:01

    我是用modelsim仿真看的,时钟和复位信号都是正常的

    点赞 评论
  • qq_34976559
    ElementWeird 2020-12-17 16:47

    module Rec
    (
        data,clk,rstn,got,outbuf
    );
    input data;
    input clk;
    input rstn;
    output got;
    output outbuf;
    localparam
    zero    =3'b000,
    first   =3'b001,
    second  =3'b010,
    third   =3'b011,
    fourth  =3'b100,
    fifth   =3'b111,
    sixth   =3'b110,
    HighPulseShortestTime  =90,//corresponding to 1.8us
    HighPulselongestTime  =180,//corresponding to 3.6us
    ShortestOneBitTime    =950,//corresponding to 19us
    longestOneBitTime    =1100,//corresponding to 22us
    NormalOneTime        =1040;//corresponding to 20.8us

    reg data1,data2;
    reg [2:0]stage;
    reg [2:0]c_stage;
    reg [2:0]c_stage2;
    reg got;
    reg [43:0]DataBuf;
    reg [15:0]TimeCnt;
    reg [6:0]bitCnt;
    reg tempsum;
    reg [7:0]tempByteBuf;
    reg [7:0]tempByteBuf1;
    reg [23:0]outbuf;
    /**********************/
    //intermediate val
    reg stageRstMedia;
    /**********************/

    always@(posedge clk or negedge rstn)
    begin
        if(rstn==1'b0)
        begin
            stage<=zero;
            DataBuf<=44'b0;
            TimeCnt<=4'h0000;
            data1<=0;
            data2<=0;
            bitCnt<=0;
        end
        else
        begin
            data1<=data;
            data2<=data1;
            if(stageRstMedia==1)
            begin
                stage<=zero;
            end
            if(bitCnt==44)
                stage<=fourth;
            case(stage)
                zero://after reset,from 0 to 1
                begin
                    if(data2==1)
                    begin
                        stage<=first;
                        TimeCnt<=0;
                    end
                    else
                    begin
                        stage<=zero;
                        TimeCnt<=0;
                        DataBuf<=44'b0;
                        bitCnt<=0;
                    end
                end
                
                first://from 1 to 0 in one bit or 1...
                begin
                    TimeCnt<=TimeCnt+1;
                    if(data2==0)//sginal changed
                    begin
                        if(TimeCnt<HighPulseShortestTime)
                        begin
                            stage<=zero;
                            TimeCnt<=0;
                            DataBuf<=44'b0;
                            bitCnt<=0;
                        end
                        else
                        begin
                            stage<=second;
                        end
                    end
                    else
                    begin
                        if(TimeCnt>HighPulselongestTime)
                        begin
                            stage<=zero;
                            TimeCnt<=0;
                            DataBuf<=44'b0;
                            bitCnt<=0;
                        end
                    end
                end
                
                second://from 0 to 1 or from 0 to 0 in one bit
                begin
                    TimeCnt<=TimeCnt+1;
                    if(data2==1)
                    begin
                        if(TimeCnt<ShortestOneBitTime)
                        begin
                            stage<=zero;
                            TimeCnt<=0;
                            DataBuf<=44'b0;
                            bitCnt<=0;
                        end
                        else//normally received one bit
                        begin
                            DataBuf<=DataBuf|(44'b1<<bitCnt);
                            bitCnt<=bitCnt+1;
                            TimeCnt<=0;
                            stage<=first;//because next bit mybe recognize as 1
                        end
                    end
                    if(TimeCnt>longestOneBitTime)
                    begin
                        DataBuf<=DataBuf|(44'b1<<bitCnt);
                        bitCnt<=bitCnt+1;
                        stage<=third;
                        TimeCnt<=longestOneBitTime-NormalOneTime;
                        
                    end
                end
                
                third://from 0 to 0 or 0 to 1
                begin
                    TimeCnt<=TimeCnt+1;
                    if(data2==1)
                    begin
                        if(TimeCnt>ShortestOneBitTime)
                        begin
                            bitCnt<=bitCnt+1;//jump one bit as 0
                            stage<=first;
                            TimeCnt<=0;
                        end
                        else
                        begin
                            stage<=zero;
                            TimeCnt<=0;
                            DataBuf<=44'b0;
                            bitCnt<=0;
                        end
                    end
                    if(TimeCnt>longestOneBitTime)
                    begin
                        bitCnt<=bitCnt+1;//jump one bit as 0
                        stage<=third;
                        TimeCnt<=longestOneBitTime-NormalOneTime;
                    end
                end
                
                fourth:
                begin
                    
                end
                
            endcase
        
        end
    end

    always@(posedge clk or negedge rstn)
    begin
        if(rstn==1'b0)
        begin
            tempByteBuf<=0;
            tempByteBuf1<=0;
            stageRstMedia<=0;
            got<=0;
            c_stage<=zero;
            c_stage2<=0;
        end
        else
        begin
    //        if(bitCnt>4)//head check
    //        begin
    //            if((DataBuf[0]!=1)||(DataBuf[1]!=0)||(DataBuf[2]!=1)||(DataBuf[3]!=1))
    //            begin
    //                stageRstMedia<=1;                
    //            end
    //        end
    //        if(bitCnt==44)//tail check
    //        begin
    //            if((DataBuf[40]!=1)||(DataBuf[41]!=1)||(DataBuf[42]!=0)||(DataBuf[43]!=1))
    //            begin
    //                stageRstMedia<=1;    
    //            end
    //        end
    //        if(bitCnt>13)
    //        begin
    //        end
            case(c_stage)
                zero:
                begin
                    if(bitCnt>4)
                    begin
                        if((DataBuf[0]!=1)||(DataBuf[1]!=0)||(DataBuf[2]!=1)||(DataBuf[3]!=1))
                        begin
                            stageRstMedia<=1;
                            c_stage<=sixth;
                        end
                        else
                        begin
                            c_stage<=c_stage+1;
                        end
                    end    
                end
                first:
                begin
                    if(bitCnt>13)
                    begin
                        tempsum=DataBuf[4]+DataBuf[5]+DataBuf[6]+DataBuf[7]+DataBuf[8]+DataBuf[9]+DataBuf[10]+DataBuf[11]+1;
                        if(tempsum!=DataBuf[12])
                        begin
                            stageRstMedia<=1;
                            c_stage<=sixth;
                        end
                        else
                        begin
                            c_stage<=c_stage+1;
                        end
                    end
                end
                second:
                begin
                    if(bitCnt>22)
                    begin
                        tempsum=DataBuf[13]+DataBuf[14]+DataBuf[15]+DataBuf[16]+DataBuf[17]+DataBuf[18]+DataBuf[19]+DataBuf[20]+1;
                        if(tempsum!=DataBuf[21])
                        begin
                            stageRstMedia<=1;
                            tempByteBuf=DataBuf[11:4];
                            c_stage<=sixth;
                        end
                        else
                        begin
                            c_stage<=c_stage+1;
                        end
                    end
                end
                third:
                begin
                    if(bitCnt>31)
                    begin
                        tempsum=DataBuf[22]+DataBuf[23]+DataBuf[24]+DataBuf[25]+DataBuf[26]+DataBuf[27]+DataBuf[28]+DataBuf[29]+1;
                        if(tempsum!=DataBuf[30])
                        begin
                            stageRstMedia<=1;
                            c_stage<=sixth;
                        end
                        else
                        begin
                            c_stage<=c_stage+1;
                        end
                    end
                end
                fourth:
                begin
                    if(bitCnt>40)
                    begin
                        tempsum=DataBuf[31]+DataBuf[32]+DataBuf[33]+DataBuf[34]+DataBuf[35]+DataBuf[36]+DataBuf[37]+DataBuf[38]+1;
                        if(tempsum!=DataBuf[39])
                        begin
                            stageRstMedia<=1;
                            c_stage<=sixth;
                        end
                        else
                        begin
                            c_stage<=c_stage+1;
                        end
                    end
                end
                fifth:
                begin
                    case(c_stage2)
                    0:
                    begin
                        c_stage2<=c_stage2+1;
                        tempByteBuf=DataBuf[11:4];
                        //tempByteBuf=DataBuf[11:4]+DataBuf[20:13];
                        //outbuf[7:0]<=DataBuf[11:4];
                    end
                    1:
                    begin
                        tempByteBuf=tempByteBuf+DataBuf[29:22];
                        tempByteBuf1<=DataBuf[38:31];
                        c_stage2<=c_stage2+1;
                    end
                    2:
                    begin
                        if(tempByteBuf1==tempByteBuf)
                        begin
                            got<=1;
                            outbuf[7:0]<=DataBuf[11:4];
                            outbuf[15:8]<=DataBuf[20:13];
                            outbuf[23:16]<=DataBuf[29:22];
                            c_stage2<=0;
                        end
                        else
                        begin
                            c_stage2<=0;
                            got<=0;
                            stageRstMedia<=1;
                            c_stage<=sixth;
                        end
                    end
                    endcase
                end
                sixth:
                begin
                    c_stage<=zero;
                end
            endcase
        end
    end
    endmodule

    点赞 评论
  • windhit
    windhit 2020-12-17 22:01

    你这里存在阻塞赋值和非阻塞赋值混用的情况,最好不要这样用,可能会导致综合上的问题。另外,你的代码风格不是很好,一个always块,尽量只对一个reg或者wire操作。另外,同一个变量不可以在多个always块中被赋值。

    点赞 评论

相关推荐