2010-10-17 3 views
6

Tôi gặp sự cố với mã Verilog này. Về cơ bản, nó sẽ không cho phép tôi làm các tuyên bố Y = 3'di. Về cơ bản, tôi muốn Y bằng i. Tôi khá chắc chắn vấn đề là i. Vì vậy, có cách nào để làm điều này trong Verilog? Ngoài ra, W là đầu vào có 8 bit (nói cách khác là W[7:0]).Gán số nguyên để reg trong Verilog

for (i = 7; i >= 0; i = i - 1) 
begin 
    if(W[i]) Y=3'di; 
end 

Cảm ơn.

+1

định nghĩa của 'W' và 'y' là gì? – ChaosPandion

+1

đầu vào [7: 0] W, đầu ra reg [2: 0] Y – DemonicImpact

Trả lời

9

Bạn có thể chọn bit sử dụng dấu ngoặc vuông.

for (i = 7; i >= 0; i = i - 1) 
begin 
    if(W[i]) Y = i[2:0]; 
end 

Nhưng thậm chí không cần thiết nếu i được khai báo là số nguyên. Tuy nhiên, nó sẽ mất nhiều bit phù hợp trong Y tự động và bạn chỉ muốn các LSB.

+0

Cảm ơn! Ngoài ra, chỉ cần làm rõ, i [2] là bit quan trọng nhất, phải không? – DemonicImpact

+0

Trong trường hợp này, có. –

2

Bạn có thể muốn sử dụng một tuyên bố case đây:

case (1'b1) 
    W[0]: Y=3'd0; 
    W[1]: Y=3'd1; 
    W[2]: Y=3'd2; 
    W[3]: Y=3'd3; 
    W[4]: Y=3'd4; 
    W[5]: Y=3'd5; 
    W[6]: Y=3'd6; 
    W[7]: Y=3'd7; 
    default: Y=3'd0; // to avoid inferring a latch when W==8'd0 
endcase 

Điều này làm cho các ưu tiên rõ ràng hơn đối với độc giả của mã của bạn.

+0

Đó chỉ là khó hiểu và không thể mở rộng. Nó sẽ không làm cho nó thông qua một đánh giá mã với tôi. –

+0

Tôi muốn được quan tâm để xem bất kỳ cách tiếp cận nào bạn nghĩ là tốt hơn. Như tôi đã nói, cách tiếp cận 'case' mà tôi sử dụng làm ưu tiên cho người đọc, và IMO rõ ràng hơn so với vòng lặp' for' ở trên, mỗi cái có khả năng tạo nhiều phép gán cho Y, với mỗi phép gán liên tiếp sẽ ghi đè lên những người trước đó. Đây là một điều dễ dàng để bỏ qua trong một đọc mã bình thường, đặc biệt là cho các kỹ sư ít kinh nghiệm. Việc vô ý sử dụng các biến không dấu trong các vòng lặp có điều kiện thoát của 'i> = 0' là một lỗ hổng phổ biến khác với phương pháp này. – jlf

+0

Đối với khả năng mở rộng, đây chỉ là bộ mã hóa ưu tiên 3 bit; thiết kế cho khả năng mở rộng chỉ thuộc về những thứ có thể cần phải mở rộng quy mô và chỉ gây thiệt hại cho sự rõ ràng khi hoàn toàn cần thiết, mà không phải là trường hợp ở đây. – jlf

0

Tôi thấy rằng tốt hơn nên sử dụng các máy trạng thái để thực hiện "thường xuyên" cho vòng lặp. Something như thế này:

module yourthing(clk, W, i, Y) 
input clk; 
input [7:0] W; 
output [2:0] Y; 
reg [2:0] i; 

[email protected](posedge clk) begin 
    if(reset) begin 
    i = 3'd7; 
    Y = 3'd0; 
    end 

    else begin 
    case(i) 
     3'd7 : begin 
       if(W[i]) Y = i; 
       i = 3'd6; 
      end 
     3'd6 : begin 
       if(W[i]) Y = i; 
       i = 3'd5; 
      end 
     3'd5 : begin 
       if(W[i]) Y = i; 
       i = 3'd4; 
      end 
     3'd4 : begin 
       if(W[i]) Y = i; 
       i = 3'd3; 
      end 
     3'd3 : begin 
       if(W[i]) Y = i; 
       i = 3'd2; 
      end 
     3'd2 : begin 
       if(W[i]) Y = i; 
       i = 3'd1; 
      end 
     3'd1 : begin 
       if(W[i]) Y = i; 
       i = 3'd0; 
      end 
     3'd0 : begin 
       if(W[i]) Y = i; 
       i = 3'd7; 
      end 
    endcase 
    end 
endmodule 

Hope this helps ...

+0

Không giống nhau. Điều này sẽ mất nhiều chu kỳ đồng hồ. –