Verilog:可变长度寄存器的组合逻辑

时间:2015-08-18 20:57:45

标签: for-loop concatenation verilog sha1

我正在学习Verilog。作为第一个项目,我决定选择SHA-1暴力破坏者。

SHA-1需要512位的固定长度输入。数据输入可以是可变长度的,因此必须进行很少的操作才能获得有效的512位块。基本上,对于小于512位的块,数据块的前448位必须是这3位的串联:

  1. 可变长度数据
  2. 0x01(8位)
  3. 0 padding
  4. 生成该数据的第一步是创建一个可以生成可变长度输入的模块。假设我想强制最多8个字符,该模块将输出64位总线(8位x 8个字符)以及8位总线,指示哪个数字有效。

    例如,字符串“test”将以这种方式表示:

    • 数据: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的参数,它包含我的数据输入的最大长度?我想保持这个组合逻辑功能。

    谢谢

1 个答案:

答案 0 :(得分: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进行模拟)

Re:使用非阻止分配(NBA,<=) - NBAs可用于顺序逻辑或组合逻辑。对于分配给单个值的非时钟always块,应该没有区别 - 最终分配将是使用的。虽然我在这个特定的例子中喜欢NBA,但是任何一个操作员都可以工作,所以我已经将它转换为BA以获得清晰度和同伴压力。 :)

相关问题