2013-10-17 56 views
0

這是我的問題。 根據系統配置,我有未知數量的輸入(全部爲3位寬)。我想設計一個解碼器來選擇最大值的輸入作爲輸出。所以我在這裏使用嵌入式ruby,以便可以將配置傳遞給RTL。 這裏是我的設計:使用verilog設計具有未知輸入數量的解碼器

代碼:

module decoder 
(
<% (1...NUM_INPUT).each do |i| -%> 
    input  [2:0] freq_<%=i%>, 
<% end -%> 
    output [2:0] decoded_freq   
) 
<% (1...NUM_INPUT-1).each do |i| -%> 
    wire  [2:0] x<%=i%>, 
<% end -%> 

    integer i; 
//decode logic below 
    assign x1 = (freq_1 > freq_2)? freq_1:freq_2; //compare the first two inputs and select the bigger one 
    for (i=1; i<NUM_INPUT-1;i++)     //for-loop to do the rest 
     x<%=i+1%> = (x<%=i%> > freq_<%=i+2%>)? x<%=i%>:freq_<%=i+2%>; 
    assign decoded_freq = x<%=NUM_INPUT-1%>; 
endmodule 

將這項工作?我不確定這裏的for-loop。它會按我的想法工作嗎?有沒有其他方法可以做到這一點?

+2

哇,這裏發生了什麼?我不認識Ruby,但看起來真的很醜。無論如何,如果你想合成一些具有「未知」數量輸入的東西,在合成之前需要知道輸入的數量。您不能在FPGA中動態創建信號,它在編程時都需要在那裏。 – Russell

+0

很明顯,你還沒有嘗試使用紅寶石來解析文件。最後一個for循環不會解開,你有Verilog拼寫錯誤。你試圖遵循什麼版本的IEEE標準?你可以用嵌入式ruby實現功能。 (提示:使用參數) – Greg

回答

1

使用erb優秀的模板verilog。 NUM_INPUT將被定義,然後生成verilog,我認爲這增加了可擴展性和重用代碼。

新工具可以支持多維端口我發現它對某些工具不可靠,例如input [31:0] data [9:0]

有一個紅寶石寶石設計用於解析文件,如RubyIt;

僅舉你已經使用1...NUM...NUM意味着直到NUM-1,你通常會使用0...NUM暗示NUM迭代或1..NUM開始從1

編號爲已使用循環是一個Verilog的風格但是你已經使用嵌入式ruby來處理一些變量。

一些像這樣的事情可能會更好:

<% NUM_INPUT = 3 %> 
module decoder 
(
    <% (1..NUM_INPUT).each do |i| -%> 
    input  [2:0] freq_<%=i%>, 
    <% end -%> 
    output  [2:0] decoded_freq   
); 
<% (1..NUM_INPUT).each do |i| -%> 
wire  [2:0] x<%=i%>; 
<% end -%> 

//decode logic below 
assign x1 = (freq_1 > freq_2)? freq_1:freq_2; //compare the first two inputs and select the bigger one 
<%# Ruby comment, for loop to create the others %> 
<% (2..NUM_INPUT).each do |i| -%> 
assign x<%=i%> = (x<%=i-1%> > freq_<%=i%>)? x<%=i-1%>:freq_<%=i%>; 
<% end %> 

我叫這個decoder.rv並運行它創建decoder.v與

gem install ruby_it 

ruby_it -f test.rv 

生成文件:

module decoder 
(
    input  [2:0] freq_1, 
    input  [2:0] freq_2, 
    input  [2:0] freq_3, 
    output  [2:0] decoded_freq   
); 
wire  [2:0] x1; 
wire  [2:0] x2; 
wire  [2:0] x3; 

//decode logic below 
assign x1 = (freq_1 > freq_2)? freq_1:freq_2; //compare the first two inputs and select the bigger one 

assign x2 = (x1 > freq_2)? x1:freq_2; 
assign x3 = (x2 > freq_3)? x2:freq_3; 
+0

仍然存在Verilog語法錯誤。在第一個右括號之後需要分號。 Wire聲明需要用分號而不是逗號來結束。 '整數我;'應該被刪除,因爲它不再使用。 – Greg

+0

您的正確@Greg,我專注於獲取紅寶石解析。將更新。 – Morgan

相關問題