2015-08-18 44 views
0

我正在學習Verilog。作爲第一個項目,我決定使用SHA-1暴力破解器。Verilog:可變長度寄存器的組合邏輯

SHA-1需要512位的固定長度輸入。數據輸入可以是可變長度的,所以只需很少的操作就可以獲得有效的512位塊。基本上,對於小於512位小的塊,該數據塊的第一448位必須爲這3個的串聯:

  1. 可變長度數據
  2. 0×01(8個比特)
  3. 0填充

我在生成數據的第一步是創建一個可以生成可變長度輸入的模塊。假設我想蠻力最多8個字符,該模塊將輸出一個64位總線(8位×8個字符),還有一個8位總線,用於指示哪些數字有效。

例如,字符串 「測試」 將表示這種方式:

  • 數據:0x0000000074657374
  • valid_digits:0b00001111

與開始,我的問題是,我有問題基於valid_digits進行適當的連接並保持事物可配置。

這是一段可以正常工作的代碼,但是對於8位輸入是硬編碼的。我相信我可以在那裏使用循環,但無法達到爲它獲得正確的語法。

assign data_block[511:64] = 
     (valid_digits == {1{1'b1}}) ? {chars[7:0], 8'h1, 432'b0 } : 
     (valid_digits == {2{1'b1}}) ? {chars[15:0], 8'h1, 424'b0 } : 
     (valid_digits == {3{1'b1}}) ? {chars[23:0], 8'h1, 416'b0 } : 
     (valid_digits == {4{1'b1}}) ? {chars[31:0], 8'h1, 408'b0 } : 
     (valid_digits == {5{1'b1}}) ? {chars[39:0], 8'h1, 400'b0 } : 
     (valid_digits == {6{1'b1}}) ? {chars[47:0], 8'h1, 392'b0 } : 
     (valid_digits == {7{1'b1}}) ? {chars[55:0], 8'h1, 384'b0 } : 
     (valid_digits == {8{1'b1}}) ? {chars[63:0], 8'h1, 376'b0 } : 
     0; 

任何人有一個想法是什麼語法我應該用它來重新編寫一個循環,一個名爲參數:MAX_CHAR_CNT會包含我的數據輸入的最大長度是多少?我想保持這種組合邏輯功能。

謝謝

回答

0

這裏是我的刺它 - 也許不是完美的,但似乎模擬確定。如果沒有別的,可能會給你一個開始。

module test(valid_digits,chars, data_block); 
    parameter MAX_CHAR_CNT = 8; 
    input [MAX_CHAR_CNT-1:0] valid_digits; 
    input [8*MAX_CHAR_CNT-1:0] chars; 
    output reg [511:0] data_block; 

    wire [511:0] data_lines [MAX_CHAR_CNT-1:0]; 

    genvar i; 
    integer x; 

    generate 
    for (i=0; i<MAX_CHAR_CNT; i=i+1) begin:DATA 
     assign data_lines[i] = {chars[8*(i+1)-1:0], 8'h1, {(512-8*(2+i)){1'b0}}}; 
    end 
    endgenerate 

    always @(*) begin:CONN 
    data_block = 0; 
    for (x=0; x<MAX_CHAR_CNT; x=x+1) begin 
     //if (valid_digits == {(x+1){1'b1}}) data_block <= data_lines[x]; 
     if (valid_digits == (9'b1<<(x+1))-1) data_block = data_lines[x]; 
    end 
    end 

endmodule 

(爲模擬參見http://www.edaplayground.com/x/FiD


回覆:使用非阻塞賦值(NBA的,<=) - NBA的可用於順序或組合邏輯。對於分配給單個值的非時鐘塊always,應該沒有區別 - 最終的分配將是使用的分配。雖然我在這個特定的例子中喜歡NBA,但是任何一個運營商都可以工作,所以我已經把它轉換成了BA,既清晰又耐心。 :)

+1

你爲什麼在'CONN'塊中使用NBA('<=')?如果它假設是組合的,它應該使用阻塞賦值('=')。 – Unn

+0

謝謝!模擬的輸出給出了我所需要的(除了填充是512而不是448)。即使它工作,那段代碼也不僅僅是組合邏輯。另外,當我嘗試用XST進行綜合時,我得到一個錯誤,說CONN語句塊中的「x不是一個常量」if語句 –

+0

@Unn - 你可以使用NBA的組合邏輯;在我的答案中看到我的附錄。 – wilcroft