2012-09-09 67 views
5

Tôi đang cố dịch một chương trình Verilog thành vhdl và đã tình cờ gặp một câu lệnh trong đó toán tử dấu hỏi (?) Được sử dụng trong chương trình Verilog.Toán tử dấu hỏi chấm (?)

Sau đây là mã Verilog;

1 module music(clk, speaker); 
2 input clk; 
3 output speaker; 
4 parameter clkdivider = 25000000/440/2; 

5 reg [23:0] tone; 
6 always @(posedge clk) tone <= tone+1; 

7 reg [14:0] counter; 
8 always @(posedge clk) if(counter==0) counter <= (tone[23] ? clkdivider-1 : clkdivider/2-1); else counter <= counter-1; 

9 reg speaker; 
10 always @(posedge clk) if(counter==0) speaker <= ~speaker; 
11 endmodule 

Tôi không hiểu dòng thứ 8, ai cũng có thể làm sáng tỏ điều này? Tôi đã đọc trên trang web thế giới ASIC mà dấu hỏi là sự thay thế Verilog cho ký tự Z. Nhưng tôi không hiểu tại sao nó được sử dụng trong bối cảnh này.

Trân trọng

Trả lời

12

Đó là ternary operator. Nó viết tắt cho một câu lệnh if

Format:

condition ? if true : if false 

Ví dụ:

tone[23] ? clkdivider-1 : clkdivider/2-1 

Chuyển thành một cái gì đó tương tự (cú pháp không đúng nhưng tôi nghĩ bạn sẽ nhận được nó):

if tone[23] is 1, counter = clkdivider-1 
else counter = clkdivider/2-1 

Dưới đây là hai ví dụ về số 2 to 1 MUX using if statement and ternary operator.

Trên trang web ASIC-thế giới, nó được bao phủ dưới Conditional Operators

4

Một cách khác để viết, ví dụ Verilog sau:

q <= tone[23] ? clkdivider-1 : clkdivider/2-1; 

trong VHDL sẽ là:

q <= clkdivider-1 when tone[23] else clkdivider/2-1; 
+0

Đây là lý do tại sao tờ khai rất quan trọng trong câu hỏi. Một điều kiện phải đánh giá một giá trị boolean. Giai điệu duy nhất [23] sẽ đáp ứng các tiêu chí đó là nếu giai điệu là BOOLEAN_VECTOR. – user1155120

Các vấn đề liên quan