我正在學習Verilog。作爲第一個項目,我決定使用SHA-1暴力破解器。Verilog:可變長度寄存器的組合邏輯
SHA-1需要512位的固定長度輸入。數據輸入可以是可變長度的,所以只需很少的操作就可以獲得有效的512位塊。基本上,對於小於512位小的塊,該數據塊的第一448位必須爲這3個的串聯:
- 可變長度數據
- 0×01(8個比特)
- 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會包含我的數據輸入的最大長度是多少?我想保持這種組合邏輯功能。
謝謝
你爲什麼在'CONN'塊中使用NBA('<=')?如果它假設是組合的,它應該使用阻塞賦值('=')。 – Unn
謝謝!模擬的輸出給出了我所需要的(除了填充是512而不是448)。即使它工作,那段代碼也不僅僅是組合邏輯。另外,當我嘗試用XST進行綜合時,我得到一個錯誤,說CONN語句塊中的「x不是一個常量」if語句 –
@Unn - 你可以使用NBA的組合邏輯;在我的答案中看到我的附錄。 – wilcroft