смешение проблем блокировки и неблокирования и первого бита 16-битного входа не рассматривается - PullRequest
0 голосов
/ 03 мая 2018

Это мой полный код. ввод 'h' представляет собой 16 битов данных и знаковый бит. Некоторые конкретные шаблоны должны быть распознаны в этих базах данных. Таким образом, каждая база данных берется в FSM и проверяется на этот конкретный шаблон.

Теперь есть два вопроса:

Первая проблема заключается в том, что первый бит данных никогда не учитывается.

И вторая проблема заключается в том, что переменной 'i' назначаются как блокирующие, так и неблокирующие (без которых код, похоже, не работает). Может кто-нибудь, пожалуйста, помогите с этим.

 module formatting(x,h,sign,y0,y1,y2,y3,out1,out2,out3,out4,out5,
 ft1,ft2,ft3,ft4,ft5,bit1,bit2,bit3,bit4,bit5);

 input [16:0]x;
 input [0:16]h;
 output sign;
 output [15:0]y0,y1,y2,y3;
 output reg [1:0]out1,out2,out3,out4,out5;
 output reg [3:0]ft1,ft2,ft3,ft4,ft5;
 output reg  bit1,bit2,bit3,bit4,bit5;

 wire [15:0]x1;
 reg inp;
 integer i=0;
 reg [2:0]s=3'b0;
 reg [2:0]st=3'b0;
 reg [3:0]ft=4'b0;
 reg [2:0]cnt=3'b0;
 reg [1:0]out;

 assign  sign=(x[0]^h[16]);
 assign  x1=x[16:1];
 assign  y0=((x1>>3)+(x1>>1)+(x1>>2));
 assign  y1=(x1>>1);
 assign  y2=((x1>>1)+(x1>>3));
 assign  y3=((x1>>2)+(x1>>1));

 always@(i,h,inp) 
   begin
if(i<16) 
    begin
        inp<=h[i+1];
        i<=i+1;//non-blocking assignment of variable'i'
   case(s)
   3'b000:if(inp == 1'b1)
            begin
               if(i<=13)
                 begin
                   s=3'b001;
                   st=st+1'b1;
                   ft=i;

                 end        
               else if(i==14)
                 begin
                   s=3'b100;
                   st=st+1'b1;
                   ft=i;

                 end  
               else if(i==15)
                 begin
                   s=3'b000;
                   st=st+1'b1;
                   ft=i;
                   out=2'b01;
                   cnt=cnt+1'b1;

                 end  
             end    
          else 
                begin
                   s=3'b000;

                end    

   3'b001: if(inp == 1'b0)
            begin
               s=3'b010;

            end
          else
            begin
              s=3'b011;
            end                       

   3'b010:if(inp == 1'b1)
             begin
               s=3'b000;
               out=2'b10;
               cnt=cnt+1'b1;
             end
           else
             begin
             s=3'b000;
             out=2'b01;
             cnt=cnt+1'b1;
             end    

   3'b011:if(inp == 1'b1)
             begin
               s=3'b000;
               out=2'b00;
               cnt=cnt+1'b1;
             end 
           else  
             begin
              s=3'b000;
              out=2'b11;
              cnt=cnt+1'b1;
             end
   3'b100:if(inp == 1'b1)
              begin
               s=3'b000;
               out=2'b11;
               cnt=cnt+1'b1;
              end   
          else
              begin
               s=3'b000;
               out=2'b01;
               cnt=cnt+1'b1;
              end

    default:begin
                 s=3'b000;
                 out=2'bxx;
              end 
     endcase

     case(cnt)
             3'b001:begin
                      out1=out;
                      bit1=1'b1;
                    end 
             3'b010:begin
                     out2=out;
                     bit2=1'b1;
                    end 
             3'b011:begin
                      out3=out;
                      bit3=1'b1;
                    end
             3'b100:begin
                      out4=out;
                      bit4=1'b1;
                    end
             3'b101:begin
                      out5=out;
                      bit5=1'b1;
                    end 
             default:begin
                       out1=2'b00;bit1=1'b0;
                       out2=2'b00;bit2=1'b0;
                       out3=2'b00;bit3=1'b0;
                       out4=2'b00;bit4=1'b0;
                       out5=2'b00;bit5=1'b0;
                     end                                                                              
           endcase

            case(st)
             3'b001:begin 
                      ft1=ft;
                    end  
             3'b010:begin 
                      ft2=ft;
                    end  
             3'b011:begin 
                      ft3=ft;
                    end  
             3'b100:begin
                      ft4=ft;
                    end  
             3'b101:begin
                      ft5=ft;
                    end     
             default:begin
                       ft1=4'b0000;
                       ft2=4'b0000;
                       ft3=4'b0000;
                       ft4=4'b0000;
                       ft5=4'b0000;
                     end
           endcase
   end 
    else
     begin
       i=0;//blocking assignment of variable'i'
       st=3'b000;
       cnt=3'b000;
       ft=4'b0000;
       s=3'b000;
     end        
  end    
  endmodule

1 Ответ

0 голосов
/ 03 мая 2018

Вы принимаете около FSM. В HDL FSM - это часть кода / аппаратного обеспечения, которая работает через несколько состояний, используя clock . Ваш код не имеет часов и поэтому не является FSM .

Это также вызывает путаницу в ваших блокирующих и неблокирующих назначениях. В синхронизированном разделе вы используете только неблокирующие назначения. В комбинаторном разделе вы используете только блокирующие назначения.

Боюсь, вам нужно серьезно переписать код, думая о том, что нужно делать на каждом шаге (часах). Также добавьте сигнал сброса. Это установит начальное состояние, с которого все начинается.

Также в настоящее время предпочтительным является использование always (*) или always_comb. Опасность заключается в том, что вы забыли переменную в своем списке чувствительности, и тогда ваше моделирование не будет соответствовать аппаратному обеспечению.


Без часов вы должны написать весь раздел, используя один цикл for:

for (i=0; i<16; i=i+1)
begin
   // All logic expressed as a function of i
end

Я предвижу проблемы, так как у вас тоже есть дело. HDL - это, как говорится, Hardware Язык описания. В конце концов, у вас есть один аппарат, который должен выполнить всю обработку. Таким образом, инструмент синтеза должен знать все оборудование, которое он должен генерировать, используя время компиляции известные значения.

...