当前位置:   article > 正文

AES_128加密解密算法,verilog实现。完整代码_aes128加解密算法

aes128加解密算法

具体的理论知识,本人不在详述。网上已经有很多了

AES128加密算法完整实现_u013605322的博客-CSDN博客_aes128加密算法

AES加密 - block2016 - 博客园

AES算法简介_Jimmy.li的博客-CSDN博客_aes算法

密码算法详解——AES - ReadingLover - 博客园

以上内容都对aes_128加密有很详细的说明。

下面直接进入正题,代码实现!

一、top层模  

       详细说明已在模块内部标注

  1. /*
  2. 说明:
  3. 1.aes_top模块作用是完成整个加密或者解密轮循环的计数,及对应的数据流向。
  4. 2.由于加解密10轮循环不是完全一样的,所有需设计状态机4种状态,初始状态,开始状态,中间9
  5. 轮循环计数状态及最后一轮状态。
  6. 3.密钥扩展可以在循环之前把十轮密钥全部计算存入寄存器组,也可以在每轮循环中做一次密钥扩展,
  7. 由于节省资源,本人是在每次轮循环时,再计算密钥扩展。
  8. */
  9. module aes_top(
  10. input clk,
  11. input rst_n,
  12. input start_i, //加解密开始信号
  13. input decrypt, //加密 / 解密
  14. input [127:0] data_in, // 密文输入
  15. input [127:0] key_in, // 密钥输入
  16. output reg [127:0] data_o, // 明文
  17. output reg ready_o //完成标志信号
  18. );
  19. //状态参数
  20. localparam IDLE =4'b0001,
  21. FIRST =4'b0010,
  22. MIDDLE =4'b0100,
  23. FINALLY=4'b1000;
  24. reg [3:0] state;
  25. reg [3:0] state_next;
  26. wire idle_first ;
  27. wire first_middle ;
  28. wire middle_finally ;
  29. wire finally_idle ;
  30. //计数器
  31. reg [3:0] cnt;
  32. wire add_cnt;
  33. wire end_cnt;
  34. reg decrypt_i; //加解密寄存器
  35. wire midround_done;
  36. reg first_round;
  37. reg finally_end;
  38. //密钥寄存器组
  39. reg [127:0] key_orginal ;
  40. reg [3:0] rcon ;
  41. reg key_en ;
  42. wire key_done ;
  43. wire [127:0] key_rdata ;
  44. //列混合 变量
  45. reg mixcolum_en ;
  46. wire [127:0] mixcolum_data ;
  47. wire [127:0] mixcolum_dout ;
  48. wire mixcolum_ready ;
  49. //行移位 变量
  50. reg invshiftrow_en ;
  51. reg [127:0] invshiftrow_data ;
  52. wire [127:0] invshiftrow_dout ;
  53. wire invshiftrow_ready ;
  54. //字节代换 变量
  55. wire sbox_ready ;
  56. wire [127:0] sbox_dout ;
  57. reg sbox_en ;
  58. wire [127:0] sbox_data ;
  59. //轮密钥加 变量
  60. reg addround_flag2;
  61. reg addround_flag1;
  62. reg addround_en1 ;
  63. wire addround_en ;
  64. reg [127:0] addround_data ;
  65. wire [127:0] addround_key ;
  66. wire [127:0] addround_dout ;
  67. wire addround_ready ;
  68. //******************************************************************/
  69. //decrypt 打拍 ,也可不用打拍
  70. always @(posedge clk or negedge rst_n) begin
  71. if(!rst_n) begin
  72. decrypt_i <= 0;
  73. end
  74. else begin
  75. decrypt_i <= decrypt;
  76. end
  77. end
  78. //中间9轮计数
  79. always @(posedge clk or negedge rst_n) begin
  80. if(!rst_n) begin
  81. cnt <= 0;
  82. end
  83. else if(add_cnt) begin
  84. if(end_cnt) begin
  85. cnt <= 0;
  86. end
  87. else begin
  88. cnt <= cnt + 1'b1 ;
  89. end
  90. end
  91. end
  92. assign add_cnt = (state==MIDDLE) && midround_done ;
  93. assign end_cnt = add_cnt && (cnt==9-1);
  94. assign midround_done = (decrypt_i ? mixcolum_ready : addround_ready);
  95. always@(posedge clk or negedge rst_n) begin
  96. if(!rst_n) begin
  97. state <= IDLE;
  98. end
  99. else begin
  100. state <= state_next;
  101. end
  102. end
  103. always @(*) begin
  104. case (state)
  105. IDLE :begin
  106. if(idle_first) begin
  107. state_next = FIRST;
  108. end
  109. else begin
  110. state_next = IDLE;
  111. end
  112. end
  113. FIRST :begin
  114. if(first_middle) begin
  115. state_next = MIDDLE;
  116. end
  117. else begin
  118. state_next = FIRST;
  119. end
  120. end
  121. MIDDLE :begin
  122. if(middle_finally) begin
  123. state_next = FINALLY;
  124. end
  125. else begin
  126. state_next = MIDDLE;
  127. end
  128. end
  129. FINALLY :begin
  130. if(finally_idle) begin
  131. state_next = IDLE;
  132. end
  133. else begin
  134. state_next = FINALLY;
  135. end
  136. end
  137. default:state_next = IDLE;
  138. endcase
  139. end
  140. assign idle_first = state==IDLE && (start_i ) ; //IDLE初始状态
  141. assign first_middle = state==FIRST && (first_round ) ; //第一次轮密钥加
  142. assign middle_finally = state==MIDDLE && (end_cnt ) ; //中间循环9次
  143. assign finally_idle = state==FINALLY && (finally_end ) ; //最后一次循环
  144. always@(posedge clk or negedge rst_n) begin
  145. if(!rst_n) begin
  146. first_round <= 0;
  147. end
  148. else if(state==FIRST) begin
  149. first_round <= addround_ready ;
  150. end
  151. else begin
  152. first_round <= 0;
  153. end
  154. end
  155. always@(posedge clk or negedge rst_n) begin
  156. if(!rst_n) begin
  157. finally_end <= 0;
  158. end
  159. else if(state==FINALLY) begin
  160. finally_end <= addround_ready ;
  161. end
  162. else begin
  163. finally_end <= 0;
  164. end
  165. end
  166. //密钥扩展
  167. key_memory u_key_memory(
  168. //exterior
  169. .clk (clk ),
  170. .rst_n (rst_n ),
  171. .start_i (key_en ),
  172. .key_in (key_orginal ),
  173. .rcon (rcon ), //轮常量
  174. .key_rcon (key_rdata ),
  175. .allkey_done (key_done )
  176. );
  177. //key_orginal
  178. always@(posedge clk or negedge rst_n) begin
  179. if(!rst_n) begin
  180. key_orginal <= 0;
  181. end
  182. else if(start_i) begin
  183. key_orginal <= key_in ;
  184. end
  185. end
  186. //rcon 轮常量计数
  187. always@(posedge clk or negedge rst_n) begin
  188. if(!rst_n) begin
  189. rcon <= 0;
  190. end
  191. else if( ~decrypt_i ) begin
  192. if(state==FIRST || state==IDLE) begin
  193. rcon <= 0;
  194. end
  195. else if(state==MIDDLE) begin //正向加密不需要等所有密钥扩展完,即可加密;
  196. case(cnt) //逆向解密 必须要等所有密钥扩展完,才能加密
  197. 0: rcon <= 1;
  198. 1: rcon <= 2;
  199. 2: rcon <= 3;
  200. 3: rcon <= 4;
  201. 4: rcon <= 5;
  202. 5: rcon <= 6;
  203. 6: rcon <= 7;
  204. 7: rcon <= 8;
  205. 8: rcon <= 9;
  206. default:;
  207. endcase
  208. end
  209. else if(state==FINALLY) begin
  210. rcon <= 10;
  211. end
  212. end
  213. else if(decrypt_i) begin
  214. if(state==FIRST || state==IDLE) begin
  215. rcon <= 10;
  216. end
  217. else if(state==MIDDLE) begin
  218. case(cnt)
  219. 0: rcon <= 9;
  220. 1: rcon <= 8;
  221. 2: rcon <= 7;
  222. 3: rcon <= 6;
  223. 4: rcon <= 5;
  224. 5: rcon <= 4;
  225. 6: rcon <= 3;
  226. 7: rcon <= 2;
  227. 8: rcon <= 1;
  228. default:rcon <= 0;
  229. endcase
  230. end
  231. else if(state==FINALLY) begin
  232. rcon <= 0;
  233. end
  234. end
  235. end
  236. //key_en 需在字节代换后,开始计算密钥
  237. always @(posedge clk or negedge rst_n) begin
  238. if(!rst_n) begin
  239. key_en <= 0;
  240. end
  241. else begin
  242. key_en <= sbox_ready | start_i;
  243. end
  244. end
  245. addroundkey u_add( //轮密钥加
  246. .clk (clk ) ,
  247. .rst_n (rst_n ) ,
  248. .start_i (addround_en ) ,
  249. .data (addround_data ) ,
  250. .key (addround_key ) ,
  251. .data_o (addround_dout ) ,
  252. .ready_o (addround_ready)
  253. );
  254. //轮密钥加 循环条件转换
  255. assign addround_key = key_rdata ;
  256. always @(posedge clk or negedge rst_n) begin
  257. if(!rst_n) begin
  258. addround_en1 <= 0;
  259. addround_data <= 0;
  260. // addround_key <= 0;
  261. end
  262. else if(state==MIDDLE )begin
  263. if(~decrypt_i) begin
  264. addround_en1 <= mixcolum_ready ;
  265. addround_data <= mixcolum_dout;
  266. //addround_key <= key_rdata;
  267. end
  268. else begin
  269. addround_data <= sbox_dout ;
  270. addround_en1 <= sbox_ready ;
  271. //addround_key <= key_rdata;
  272. end
  273. end
  274. else if(state==FINALLY )begin
  275. if(~decrypt_i) begin
  276. addround_en1 <= invshiftrow_ready ;
  277. addround_data <= invshiftrow_dout ;
  278. // addround_key <= key_rdata;
  279. end
  280. else begin
  281. addround_data <= sbox_dout ;
  282. addround_en1 <= sbox_ready ;
  283. //addround_key <= key_rdata;
  284. end
  285. end
  286. else begin
  287. if(~decrypt_i) begin
  288. addround_en1 <= start_i;
  289. addround_data <= data_in;
  290. //addround_key <= key_rdata;
  291. end
  292. else begin
  293. addround_en1 <= start_i;
  294. addround_data <= data_in;
  295. //addround_key <= key_rdata;
  296. end
  297. end
  298. end
  299. //轮密钥加 ,需在一轮循环完 和 密钥扩展完 同时完成条件下
  300. always @(posedge clk or negedge rst_n) begin
  301. if(!rst_n) begin
  302. addround_flag1 <= 0;
  303. end
  304. else if(addround_en) begin
  305. addround_flag1 <= 0;
  306. end
  307. else if(addround_en1) begin
  308. addround_flag1 <= 1'b1;
  309. end
  310. end
  311. always @(posedge clk or negedge rst_n) begin
  312. if(!rst_n) begin
  313. addround_flag2 <= 0;
  314. end
  315. else if(addround_en) begin
  316. addround_flag2 <= 0;
  317. end
  318. else if(key_done) begin
  319. addround_flag2 <= 1'b1;
  320. end
  321. end
  322. assign addround_en=addround_flag2 & addround_flag1;
  323. aes_sbox u_aes_sbox( //字节代换
  324. .clk (clk ),
  325. .rst_n (rst_n ),
  326. .start_i (sbox_en ),
  327. .decrypt_i (decrypt_i ),
  328. .data_i (sbox_data ),
  329. .data_o (sbox_dout ),
  330. .ready_o (sbox_ready )
  331. );
  332. assign sbox_data= decrypt_i ? invshiftrow_dout : addround_dout;
  333. always @(posedge clk or negedge rst_n) begin
  334. if(!rst_n) begin
  335. sbox_en <= 0;
  336. // sbox_data <= 0;
  337. end
  338. else if( ~decrypt_i )begin
  339. sbox_en <= addround_ready && (rcon!=10); //除去最后一轮
  340. // sbox_data <= addround_dout;
  341. end
  342. else if(decrypt_i) begin
  343. sbox_en <= invshiftrow_ready;
  344. //sbox_data <= invshiftrow_dout;
  345. end
  346. end
  347. invshiftrow u_invshiftrow( //行移位
  348. .clk (clk ),
  349. .rst_n (rst_n ),
  350. .start_i (invshiftrow_en ),
  351. .decrypt_i (decrypt_i ),
  352. .data_i (invshiftrow_data ),
  353. .data_o (invshiftrow_dout ),
  354. .ready_o (invshiftrow_ready )
  355. );
  356. always @(posedge clk or negedge rst_n) begin
  357. if(!rst_n) begin
  358. invshiftrow_en <= 0;
  359. invshiftrow_data <= 0;
  360. end
  361. else if( ~decrypt_i )begin
  362. invshiftrow_en <= sbox_ready ;
  363. invshiftrow_data <= sbox_dout ;
  364. end
  365. else if(decrypt_i) begin
  366. if(state==FIRST ) begin
  367. invshiftrow_en <= addround_ready ;
  368. invshiftrow_data <= addround_dout ;
  369. end
  370. else if(state==MIDDLE ||state==FINALLY) begin
  371. invshiftrow_en <= mixcolum_ready ;
  372. invshiftrow_data <= mixcolum_dout ;
  373. end
  374. end
  375. end
  376. mixcolum u_mixcolum( //列混合
  377. .clk (clk ),
  378. .rst_n (rst_n ),
  379. .start_i (mixcolum_en ),
  380. .decrypt_i (decrypt_i ),
  381. .data_i (mixcolum_data ),
  382. .data_o (mixcolum_dout ),
  383. .ready_o (mixcolum_ready )
  384. );
  385. assign mixcolum_data = decrypt_i ? addround_dout : invshiftrow_dout;
  386. always @(posedge clk or negedge rst_n) begin
  387. if(!rst_n) begin
  388. mixcolum_en <= 0;
  389. // mixcolum_data <= 0;
  390. end
  391. else if( ~decrypt_i && state==MIDDLE )begin
  392. mixcolum_en <= invshiftrow_ready;
  393. //mixcolum_data <= invshiftrow_dout ;
  394. end
  395. else if(decrypt_i && state==MIDDLE ) begin
  396. mixcolum_en <= addround_ready;
  397. // mixcolum_data <= addround_dout ;
  398. end
  399. end
  400. //data_o,
  401. //ready_o
  402. always @(posedge clk or negedge rst_n) begin
  403. if(!rst_n) begin
  404. data_o <= 0;
  405. ready_o <= 0;
  406. end
  407. else if(finally_end) begin
  408. data_o <= addround_dout ;
  409. ready_o <= finally_end;
  410. end
  411. else begin
  412. ready_o <= 0;
  413. end
  414. end
  415. endmodule

二、密钥扩展

        此部分含义2个模块,一. key_memory.v 对密钥扩展的次数进行计数。二.key_extend.v 完成密钥扩展与轮常量因子的计数

  1. /*
  2. 密钥扩展轮数计数层
  3. */
  4. module key_memory(
  5. //exterior
  6. input clk ,
  7. input rst_n ,
  8. input start_i ,
  9. input [127:0] key_in ,
  10. input [3:0] rcon , //轮数
  11. output [127:0] key_rcon ,
  12. output reg allkey_done
  13. );
  14. reg [3:0] cnt;
  15. wire add_cnt;
  16. wire end_cnt;
  17. //interior
  18. reg [127:0] key_extend_data ;
  19. reg key_extend_en ;
  20. wire [3:0] rd_num ;
  21. wire [127:0] key_extend_in ;
  22. wire key_extend_ready ;
  23. key_extend u_key_extend(
  24. .clk (clk ) ,
  25. .rst_n (rst_n ) ,
  26. .start_i (key_extend_en ) ,
  27. .rd_num (rd_num ) ,
  28. .key_in (key_extend_data ) ,
  29. .ready_o (key_extend_ready ) ,
  30. .key_out (key_extend_in )
  31. );
  32. always @(posedge clk or negedge rst_n) begin
  33. if(!rst_n) begin
  34. cnt <= 0;
  35. end
  36. else if(add_cnt)begin
  37. if(end_cnt) begin
  38. cnt <= 0;
  39. end
  40. else begin
  41. cnt <= cnt+1'b1;
  42. end
  43. end
  44. end
  45. assign add_cnt= key_extend_ready;
  46. assign end_cnt= add_cnt && cnt== ( rcon-1 ); //0-10
  47. assign rd_num = cnt;
  48. //key_extend_i
  49. always @(posedge clk or negedge rst_n) begin
  50. if(!rst_n) begin
  51. key_extend_data <= 0;
  52. end
  53. else if(add_cnt) begin
  54. key_extend_data <= key_extend_in ;
  55. end
  56. else if(cnt==0) begin
  57. key_extend_data <= key_in;
  58. end
  59. end
  60. //key_strat_i
  61. always @(posedge clk or negedge rst_n) begin
  62. if(!rst_n) begin
  63. key_extend_en <= 1'b0;
  64. end
  65. else if( start_i && rcon ) begin
  66. key_extend_en <= 1'b1 ;
  67. end
  68. else if( end_cnt==0 )begin
  69. key_extend_en <= add_cnt ;
  70. end
  71. else begin
  72. key_extend_en <= 1'b0;
  73. end
  74. end
  75. /************************ exterior **********************/
  76. //allkey_done
  77. always @(posedge clk or negedge rst_n) begin
  78. if(!rst_n) begin
  79. allkey_done <= 0;
  80. end
  81. else if(rcon==0) begin
  82. allkey_done <= start_i ;
  83. end
  84. else if(end_cnt) begin
  85. allkey_done <= 1'b1 ;
  86. end
  87. else begin
  88. allkey_done <= 0;
  89. end
  90. end
  91. // 时序逻辑与组合逻辑的选择
  92. assign key_rcon = (rcon==0) ? key_in : key_extend_in ;
  93. /* always @(posedge clk or negedge rst_n) begin
  94. if(!rst_n) begin
  95. key_rcon <= 0;
  96. end
  97. else if(rcon==0)begin
  98. key_rcon <= key_in ;
  99. end
  100. else if(end_cnt)begin
  101. key_rcon <= key_extend_in ;
  102. end
  103. end */
  104. endmodule
  1. /*
  2. 密钥扩展逻辑代码实现
  3. 1.若i不是4的倍数,那么第i列如下计算:
  4. w[i] = w[i-4] ^ w[i-1] ;
  5. 2.若i是4的倍数,那么第i列如下计算:
  6. w[i] = w[i-4] ^ g w[i-1] ;
  7. g函数由字循环、字节代换和轮常量异或三部分组成,这三部分的作用分别如下:
  8. 1) 字循环:将1个字中的4个字节循环左移1个字节;
  9. 2) 字节代换:对字循环的结果使用S盒 进行字节代换;
  10. 3) 轮常量异或:对前两步的结果同轮常量Rcon[j] 进行异或,其中j代表轮数。
  11. casex (x)
  12. 0次: rcon = 8'h01;
  13. 第 1次: rcon = 8'h02;
  14. 2次: rcon = 8'h04;
  15. 第 3次: rcon = 8'h08;
  16. 4次: rcon = 8'h10;
  17. 第 5次: rcon = 8'h20;
  18. 6次: rcon = 8'h40;
  19. 第 7次: rcon = 8'h80;
  20. 8次: rcon = 8'h1b;
  21. 第 9次: rcon = 8'h36;
  22. */
  23. module key_extend(
  24. input clk ,
  25. input rst_n,
  26. input start_i,
  27. input [3:0] rd_num,
  28. input [127:0] key_in,
  29. output reg ready_o,
  30. output reg[127:0] key_out
  31. );
  32. reg [3:0] state;
  33. reg [3:0] state_next;
  34. reg [7:0] rcon;
  35. reg [31:0] w0;
  36. reg [31:0] w1;
  37. reg [31:0] w2;
  38. reg [31:0] w3;
  39. wire [31:0] wreg0;
  40. wire [31:0] wreg1;
  41. wire [31:0] wreg2;
  42. wire [31:0] wreg3;
  43. reg [31:0] shift_wreg;
  44. wire[31:0] norshift_wreg;
  45. reg [7:0] addr;
  46. wire [7:0] mem_out;
  47. reg [7:0] a;
  48. reg [7:0] b;
  49. reg [7:0] c;
  50. reg [7:0] d;
  51. reg [23:0] zero=24'b0;
  52. always @( rd_num ) begin
  53. case(rd_num)
  54. 0: rcon = 8'h01;
  55. 1: rcon = 8'h02;
  56. 2: rcon = 8'h04;
  57. 3: rcon = 8'h08;
  58. 4: rcon = 8'h10;
  59. 5: rcon = 8'h20;
  60. 6: rcon = 8'h40;
  61. 7: rcon = 8'h80;
  62. 8: rcon = 8'h1b;
  63. 9: rcon = 8'h36;
  64. default :rcon =0;
  65. endcase
  66. end
  67. always @(posedge clk or negedge rst_n) begin
  68. if(!rst_n) begin
  69. w0 <= 0;
  70. w1 <= 0;
  71. w2 <= 0;
  72. w3 <= 0;
  73. end
  74. else begin
  75. w3 <= key_in[31:0];
  76. w2 <= key_in[63:32];
  77. w1 <= key_in[95:64];
  78. w0 <= key_in[127:96];
  79. end
  80. end
  81. memory_S u_S(.clk(clk), .rst_n(rst_n),.addr(addr) , .mem_out(mem_out));
  82. //这里我们直接采样S盒转换
  83. always@(posedge clk or negedge rst_n) begin
  84. if(!rst_n) begin
  85. state <= 0;
  86. end
  87. else begin
  88. state <= state_next;
  89. end
  90. end
  91. always @(*) begin
  92. case (state)
  93. 0:
  94. if(start_i) begin
  95. state_next = 1;
  96. end
  97. else begin
  98. state_next = 0;
  99. end
  100. 1: begin
  101. state_next = 2;
  102. end
  103. 2: begin
  104. state_next = 3;
  105. end
  106. 3: begin
  107. state_next = 4;
  108. end
  109. 4: begin
  110. state_next = 5;
  111. end
  112. 5:begin
  113. state_next =6;
  114. end
  115. 6: begin
  116. state_next = 7;
  117. end
  118. 7: begin
  119. state_next = 0;
  120. end
  121. default:state_next = 0;
  122. endcase
  123. end
  124. always @(*) begin
  125. case (state)
  126. 1: begin
  127. addr=w3[7:0] ;
  128. end
  129. 2: begin
  130. addr=w3[15:8] ;
  131. end
  132. 3: begin
  133. addr=w3[23:16] ;
  134. end
  135. 4: begin
  136. addr=w3[31:24] ;
  137. end
  138. default:begin
  139. addr= 0;
  140. end
  141. endcase
  142. end
  143. always @(*) begin
  144. case (state)
  145. 2: begin
  146. a=mem_out ;
  147. d= shift_wreg[7:0];
  148. b= shift_wreg[23:16];
  149. c= shift_wreg[31:24];
  150. end
  151. 3: begin
  152. d= shift_wreg[7:0];
  153. a= shift_wreg[15:8];
  154. c= shift_wreg[31:24];
  155. b=mem_out ;
  156. end
  157. 4: begin
  158. d= shift_wreg[7:0];
  159. a= shift_wreg[15:8];
  160. b= shift_wreg[23:16];
  161. c=mem_out ;
  162. end
  163. 5: begin
  164. a= shift_wreg[15:8];
  165. b= shift_wreg[23:16];
  166. c= shift_wreg[31:24];
  167. d=mem_out ;
  168. end
  169. default:begin
  170. d= shift_wreg[7:0];
  171. a= shift_wreg[15:8];
  172. b= shift_wreg[23:16];
  173. c= shift_wreg[31:24];
  174. end
  175. endcase
  176. end
  177. //字节移位
  178. always @(posedge clk or negedge rst_n) begin
  179. if(!rst_n) begin
  180. shift_wreg <= 0;
  181. end
  182. else begin
  183. shift_wreg <={c,b,a,d};
  184. end
  185. end
  186. //异或常轮量
  187. assign norshift_wreg = shift_wreg ^ {rcon,zero} ;
  188. assign wreg0 = w0 ^ norshift_wreg;
  189. assign wreg1 = w1 ^ wreg0;
  190. assign wreg2 = w2 ^ wreg1;
  191. assign wreg3 = w3 ^ wreg2;
  192. always @(posedge clk or negedge rst_n) begin
  193. if(!rst_n) begin
  194. key_out <= 0;
  195. end
  196. else if(state==7) begin
  197. key_out <= {wreg0,wreg1,wreg2,wreg3};
  198. end
  199. end
  200. always @(posedge clk or negedge rst_n) begin
  201. if(!rst_n) begin
  202. ready_o <= 0;
  203. end
  204. else begin
  205. ready_o <= state==7;
  206. end
  207. end
  208. endmodule

三、轮密钥加

        此部分比较简单,直接密钥与密文异或即可。代码如下

  1. module addroundkey(
  2. input clk,
  3. input rst_n,
  4. input start_i,
  5. input [127:0] data,
  6. input [127:0] key,
  7. output [127:0] data_o,
  8. output reg ready_o
  9. );
  10. assign data_o = data ^ key ;
  11. always@(posedge clk or negedge rst_n) begin
  12. if(!rst_n) begin
  13. ready_o <= 0;
  14. end
  15. else begin
  16. ready_o <= start_i ;
  17. end
  18. end
  19. endmodule

四、字节代换

        此部分分为2个模块,1.对128bit数据进行32bit一组划分,2.对每组32bit数据通过S盒、逆S盒进行查找,完成字节代换。有兴趣的朋友可以自己写一下直接代码实现的S盒与逆S盒。代码如下:

  1. /*
  2. 128bit数据进行32bit一组分化,通过状态机实现计数
  3. */
  4. module aes_sbox(
  5. input clk,
  6. input rst_n,
  7. input start_i,
  8. input decrypt_i,
  9. input [127:0]data_i,
  10. output reg[127:0]data_o,
  11. output reg ready_o
  12. );
  13. localparam STATE0=5'b0000_1 ,
  14. STATE1=5'b0001_0 ,
  15. STATE2=5'b0010_0 ,
  16. STATE3=5'b0100_0 ,
  17. STATE4=5'b1000_0 ;
  18. reg [4:0] state;
  19. reg [4:0] next_state;
  20. wire s0_s1;
  21. wire s1_s2;
  22. wire s2_s3;
  23. wire s3_s4;
  24. wire s4_s0;
  25. reg [31:0] sbox_word;
  26. reg [127:0] data_i_var;
  27. reg work_en;
  28. reg ready_o_r0;
  29. wire done;
  30. reg start;
  31. wire [31:0] sboxout;
  32. sbox_word u_sbox_word(
  33. .clk (clk ) ,
  34. .rst_n (rst_n ) ,
  35. .start_i (work_en ) ,
  36. .decrypt_i (decrypt_i ) ,
  37. .data_i (sbox_word ) ,
  38. .data_o (sboxout ) ,
  39. .ready_o (done )
  40. );
  41. //***********************fsm********************************//
  42. always@(posedge clk or negedge rst_n ) begin
  43. if(!rst_n) begin
  44. state <= STATE0;
  45. end
  46. else begin
  47. state <= next_state;
  48. end
  49. end
  50. always @(*) begin
  51. case(state)
  52. STATE0:begin
  53. if(s0_s1) begin
  54. next_state = STATE1;
  55. end
  56. else begin
  57. next_state = STATE0;
  58. end
  59. end
  60. STATE1:begin
  61. if(s1_s2) begin
  62. next_state = STATE2;
  63. end
  64. else begin
  65. next_state = STATE1;
  66. end
  67. end
  68. STATE2:begin
  69. if(s2_s3) begin
  70. next_state = STATE3;
  71. end
  72. else begin
  73. next_state = STATE2;
  74. end
  75. end
  76. STATE3:begin
  77. if(s3_s4) begin
  78. next_state = STATE4;
  79. end
  80. else begin
  81. next_state = STATE3;
  82. end
  83. end
  84. STATE4:begin
  85. if(s4_s0) begin
  86. next_state = STATE0;
  87. end
  88. else begin
  89. next_state = STATE4;
  90. end
  91. end
  92. default:next_state =STATE0;
  93. endcase
  94. end
  95. assign s0_s1= state==STATE0 && (start ) ;
  96. assign s1_s2= state==STATE1 && (done ) ;
  97. assign s2_s3= state==STATE2 && (done ) ;
  98. assign s3_s4= state==STATE3 && (done ) ;
  99. assign s4_s0= state==STATE4 && (done ) ;
  100. always @(posedge clk or negedge rst_n) begin
  101. if(!rst_n) begin
  102. start <= 0;
  103. end
  104. else begin
  105. start <= start_i;
  106. end
  107. end
  108. //
  109. always @(posedge clk or negedge rst_n) begin
  110. if(!rst_n) begin
  111. data_i_var <= 0;
  112. end
  113. else if(start_i) begin
  114. data_i_var <= data_i;
  115. end
  116. end
  117. //sbox_word
  118. always @(posedge clk or negedge rst_n) begin
  119. if(!rst_n) begin
  120. sbox_word <= 0;
  121. end
  122. else if(s0_s1) begin
  123. sbox_word <= data_i_var[127:96];
  124. end
  125. else if(s1_s2) begin
  126. sbox_word <= data_i_var[95:64];
  127. end
  128. else if(s2_s3) begin
  129. sbox_word <= data_i_var[63:32];
  130. end
  131. else if(s3_s4) begin
  132. sbox_word <= data_i_var[31:0];
  133. end
  134. end
  135. // work_en
  136. always @(posedge clk or negedge rst_n) begin
  137. if(!rst_n) begin
  138. work_en <= 0;
  139. end
  140. else if(s0_s1 | s1_s2 | s2_s3 | s3_s4) begin
  141. work_en <= 1'b1;
  142. end
  143. else begin
  144. work_en <= 0;
  145. end
  146. end
  147. always @(posedge clk or negedge rst_n) begin
  148. if(!rst_n) begin
  149. data_o <= 0;
  150. end
  151. else if(s1_s2) begin
  152. data_o[127:96] <= sboxout;
  153. end
  154. else if(s2_s3) begin
  155. data_o[95:64] <= sboxout;
  156. end
  157. else if(s3_s4) begin
  158. data_o[63:32] <= sboxout;
  159. end
  160. else if(s4_s0) begin
  161. data_o[31:0] <= sboxout;
  162. end
  163. end
  164. //ready_o
  165. always @(posedge clk or negedge rst_n) begin
  166. if(!rst_n) begin
  167. ready_o <= 0;
  168. ready_o_r0 <=0;
  169. end
  170. else begin
  171. ready_o_r0 <= s4_s0 ;
  172. ready_o <= ready_o_r0;
  173. end
  174. end
  175. endmodule
  1. /*
  2. 字节代换,
  3. */
  4. module sbox_word(
  5. input clk,
  6. input rst_n,
  7. input start_i,
  8. input decrypt_i,
  9. input [31:0] data_i,
  10. output reg [31:0] data_o,
  11. output reg ready_o
  12. );
  13. reg [2:0] state;
  14. reg [2:0] state_next;
  15. reg [7:0] byte_0;
  16. reg [7:0] byte_1;
  17. reg [7:0] byte_2;
  18. reg [7:0] byte_3;
  19. reg [7:0] dout_0;
  20. reg [7:0] dout_1;
  21. reg [7:0] dout_2;
  22. reg [7:0] dout_3;
  23. reg [7:0] addr_s;
  24. reg [7:0] addr_sinv;
  25. wire [7:0] mem_out_s;
  26. wire [7:0] mem_out_sinv;
  27. //逆S盒
  28. memory_S_inv u_Sinv(.clk(clk),.rst_n(rst_n), .addr(addr_sinv) , .mem_out(mem_out_sinv));
  29. //S盒
  30. memory_S u_S(.clk(clk),.rst_n(rst_n), .addr(addr_s) , .mem_out(mem_out_s));
  31. always@(posedge clk or negedge rst_n) begin
  32. if(!rst_n) begin
  33. byte_0 <= 0;
  34. byte_1 <= 0;
  35. byte_2 <= 0;
  36. byte_3 <= 0;
  37. end
  38. else begin
  39. byte_0 <= data_i[7:0];
  40. byte_1 <= data_i[15:8];
  41. byte_2 <= data_i[23:16];
  42. byte_3 <= data_i[31:24];
  43. end
  44. end
  45. always@(posedge clk or negedge rst_n) begin
  46. if(!rst_n) begin
  47. state <= 0;
  48. end
  49. else begin
  50. state <= state_next;
  51. end
  52. end
  53. always @(*) begin
  54. case (state)
  55. 0:
  56. if(start_i) begin
  57. state_next =1;
  58. end
  59. else begin
  60. state_next=0;
  61. end
  62. 1: begin
  63. state_next =2;
  64. end
  65. 2: begin
  66. state_next =3;
  67. end
  68. 3: begin
  69. state_next =4;
  70. end
  71. 4: begin
  72. state_next =5;
  73. end
  74. 5:begin
  75. state_next =6;
  76. end
  77. 6:begin
  78. state_next =0;
  79. end
  80. default:state_next =0;
  81. endcase
  82. end
  83. always @(*) begin
  84. case (state)
  85. 1: begin
  86. if(decrypt_i) begin
  87. addr_sinv=byte_0 ;
  88. addr_s = 0;
  89. end
  90. else begin
  91. addr_s=byte_0 ;
  92. addr_sinv =0;
  93. end
  94. end
  95. 2: begin
  96. if(decrypt_i) begin
  97. addr_sinv=byte_1 ;
  98. addr_s = 0;
  99. end
  100. else begin
  101. addr_s=byte_1 ;
  102. addr_sinv =0;
  103. end
  104. end
  105. 3: begin
  106. if(decrypt_i) begin
  107. addr_sinv=byte_2;
  108. addr_s = 0;
  109. end
  110. else begin
  111. addr_s=byte_2 ;
  112. addr_sinv =0;
  113. end
  114. end
  115. 4: begin
  116. if(decrypt_i) begin
  117. addr_sinv=byte_3 ;
  118. addr_s = 0;
  119. end
  120. else begin
  121. addr_s=byte_3 ;
  122. addr_sinv =0;
  123. end
  124. end
  125. default: begin
  126. addr_s=0 ;
  127. addr_sinv =0;
  128. end
  129. endcase
  130. end
  131. always @(*) begin
  132. case (state)
  133. 2: begin
  134. if(decrypt_i) begin
  135. dout_0=mem_out_sinv ;
  136. dout_3 =data_o[31:24];
  137. dout_2 =data_o[23:16];
  138. dout_1 =data_o[15:8] ;
  139. end
  140. else begin
  141. dout_0=mem_out_s ;
  142. dout_3 =data_o[31:24];
  143. dout_2 =data_o[23:16];
  144. dout_1 =data_o[15:8] ;
  145. end
  146. end
  147. 3: begin
  148. if(decrypt_i) begin
  149. dout_1=mem_out_sinv ;
  150. dout_3 =data_o[31:24];
  151. dout_2 =data_o[23:16];
  152. dout_0 =data_o[7:0] ;
  153. end
  154. else begin
  155. dout_1=mem_out_s ;
  156. dout_3 =data_o[31:24];
  157. dout_2 =data_o[23:16];
  158. dout_0 =data_o[7:0] ;
  159. end
  160. end
  161. 4: begin
  162. if(decrypt_i) begin
  163. dout_2=mem_out_sinv ;
  164. dout_3 =data_o[31:24];
  165. dout_1 =data_o[15:8] ;
  166. dout_0 =data_o[7:0] ;
  167. end
  168. else begin
  169. dout_2=mem_out_s ;
  170. dout_3 =data_o[31:24];
  171. dout_1 =data_o[15:8] ;
  172. dout_0 =data_o[7:0] ;
  173. end
  174. end
  175. 5: begin
  176. if(decrypt_i) begin
  177. dout_3=mem_out_sinv ;
  178. dout_2 =data_o[23:16];
  179. dout_1 =data_o[15:8] ;
  180. dout_0 =data_o[7:0] ;
  181. end
  182. else begin
  183. dout_3=mem_out_s ;
  184. dout_2 =data_o[23:16];
  185. dout_1 =data_o[15:8] ;
  186. dout_0 =data_o[7:0] ;
  187. end
  188. end
  189. default: begin
  190. dout_3 =data_o[31:24];
  191. dout_2 =data_o[23:16];
  192. dout_1 =data_o[15:8] ;
  193. dout_0 =data_o[7:0] ;
  194. end
  195. endcase
  196. end
  197. always@(posedge clk or negedge rst_n) begin
  198. if(!rst_n) begin
  199. data_o <= 0;
  200. end
  201. else begin
  202. data_o <= {dout_3,dout_2,dout_1,dout_0};
  203. end
  204. end
  205. always@(posedge clk or negedge rst_n) begin
  206. if(!rst_n) begin
  207. ready_o <= 0;
  208. end
  209. else begin
  210. ready_o <= state==6;
  211. end
  212. end
  213. endmodule

五、行移位

        如果你的明文加密后的密文,与标准的密文不一样,但是你的密文又能正常的通过密钥解密,那么你多半是在行移位这里出问题了。

行移位转换图如下:

行移位代码如下:

  1. /*
  2. 行移位
  3. */
  4. module invshiftrow(
  5. input clk,
  6. input rst_n,
  7. input start_i,
  8. input decrypt_i,
  9. input [127:0] data_i,
  10. output reg[127:0]data_o,
  11. output reg ready_o
  12. );
  13. reg [31:0] a;
  14. reg [31:0] b;
  15. reg [31:0] c;
  16. reg [31:0] d;
  17. wire [31:0] a_r;
  18. wire [31:0] b_r;
  19. wire [31:0] c_r;
  20. wire [31:0] d_r;
  21. //reg [127:0] data_o_r;
  22. reg ready_r0;
  23. reg ready_r1;
  24. always@(posedge clk or negedge rst_n) begin
  25. if(!rst_n) begin
  26. a <= 0;
  27. b <= 0;
  28. c <= 0;
  29. d <= 0;
  30. end
  31. else if(start_i) begin
  32. a <= data_i[31:0];
  33. b <= data_i[63:32];
  34. c <= data_i[95:64];
  35. d <= data_i[127:96];
  36. end
  37. end
  38. assign a_r=decrypt_i ? {a[31:24],b[23:16],c[15:8],d[7:0]} : {a[31:24],d[23:16],c[15:8],b[7:0]};
  39. assign b_r=decrypt_i ? {b[31:24],c[23:16],d[15:8],a[7:0]} : {b[31:24],a[23:16],d[15:8],c[7:0]};
  40. assign c_r=decrypt_i ? {c[31:24],d[23:16],a[15:8],b[7:0]} : {c[31:24],b[23:16],a[15:8],d[7:0]};
  41. assign d_r=decrypt_i ? {d[31:24],a[23:16],b[15:8],c[7:0]} : {d[31:24],c[23:16],b[15:8],a[7:0]};
  42. always@(posedge clk or negedge rst_n) begin
  43. if(!rst_n) begin
  44. // data_o_r <= 0;
  45. data_o <= 0;
  46. end
  47. else begin
  48. data_o <= {d_r,c_r,b_r,a_r};
  49. //data_o <= data_o_r;
  50. end
  51. end
  52. always@(posedge clk or negedge rst_n) begin
  53. if(!rst_n) begin
  54. ready_o <= 0;
  55. ready_r0 <= 0;
  56. ready_r1 <= 0;
  57. end
  58. else begin
  59. ready_r0 <= start_i;
  60. ready_r1 <= ready_r0;
  61. ready_o <= ready_r1;
  62. end
  63. end
  64. endmodule

六、列混合

        列混合运算需要在G F ( 2 ^8 )域上作运算。具体运算关系,本人不在详述, 代码中调用的2个函数即完成了列混合的运算。代码如下:

  1. /*
  2. 列混合
  3. */
  4. module mixcolum(
  5. input clk,
  6. input rst_n,
  7. input start_i,
  8. input decrypt_i,
  9. input [127:0] data_i,
  10. output reg[127:0] data_o,
  11. output reg ready_o
  12. );
  13. reg [2:0] cnt;
  14. wire add_cnt;
  15. wire end_cnt;
  16. reg flag;
  17. integer i=0 ;
  18. //
  19. reg [7:0] a;
  20. reg [7:0] b;
  21. reg [7:0] c;
  22. reg [7:0] d;
  23. wire [7:0] b0;
  24. wire [7:0] b1;
  25. wire [7:0] b2;
  26. wire [7:0] b3;
  27. function [7:0] mul_02;
  28. input [7:0] in;
  29. reg [7:0] reg_in;
  30. reg [8:0] shift_in;
  31. begin
  32. reg_in = in;
  33. shift_in= ( reg_in<<1 );
  34. mul_02= shift_in[8] ? shift_in[7:0]^8'h1b : shift_in[7:0] ;
  35. end
  36. endfunction
  37. function [7:0] mbyte;
  38. input [7:0] in0,in1,in2,in3;
  39. reg [7:0] w1,w2,w3,w4,w5,w6,w7,w8,outx_var;
  40. begin
  41. w1 = in0 ^in1;
  42. w2 = in0 ^in2;
  43. w3 = in2 ^in3;
  44. w4 = mul_02(w1);
  45. w5 = mul_02(w3);
  46. w6 = w2 ^w4 ^w5;
  47. w7 = mul_02(w6);
  48. w8 = mul_02(w7);
  49. outx_var = in1^w3^w4;
  50. if(decrypt_i) begin
  51. mbyte=outx_var^w8;
  52. end
  53. else begin
  54. mbyte=outx_var;
  55. end
  56. end
  57. endfunction
  58. always @(posedge clk or negedge rst_n) begin
  59. if(!rst_n) begin
  60. flag <= 0;
  61. end
  62. else if(cnt ==4 ) begin
  63. flag <= 0;
  64. end
  65. else if(start_i) begin
  66. flag <= 1'b1;
  67. end
  68. end
  69. always @(posedge clk or negedge rst_n) begin
  70. if(!rst_n) begin
  71. cnt <= 0;
  72. end
  73. else if(add_cnt) begin
  74. if(end_cnt) begin
  75. cnt <= 0;
  76. end
  77. else begin
  78. cnt <= cnt+1'b1;
  79. end
  80. end
  81. end
  82. assign add_cnt=flag;
  83. assign end_cnt=add_cnt && cnt==4;
  84. assign b0 = mbyte (a,b,c,d);
  85. assign b1 = mbyte (b,c,d,a);
  86. assign b2 = mbyte (c,d,a,b);
  87. assign b3 = mbyte (d,a,b,c);
  88. always @(posedge clk or negedge rst_n) begin
  89. if(!rst_n) begin
  90. /*for(i=0;i<16;i=i+1) begin
  91. memory_r[i] <= 0;
  92. end*/
  93. data_o <= 0;
  94. end
  95. else if(cnt==0)begin
  96. //第0行
  97. data_o[127:120] <= b0 ;
  98. data_o[119:112] <= b1 ;
  99. data_o[111:104] <= b2 ;
  100. data_o[103:96] <= b3 ;
  101. end
  102. else if(cnt==1)begin
  103. //第1行
  104. data_o[95:88] <= b0 ;
  105. data_o[87:80] <= b1 ;
  106. data_o[79:72] <= b2 ;
  107. data_o[71:64] <= b3 ;
  108. end
  109. else if(cnt==2)begin
  110. //第2行
  111. data_o[63:56] <= b0 ;
  112. data_o[55:48] <= b1 ;
  113. data_o[47:40] <= b2 ;
  114. data_o[39:32] <= b3 ;
  115. end
  116. else if(cnt==3)begin
  117. //第3行
  118. data_o[31:24] <= b0 ;
  119. data_o[23:16] <= b1 ;
  120. data_o[15:8] <= b2 ;
  121. data_o[7:0] <= b3 ;
  122. end
  123. end
  124. always @(* ) begin
  125. if(cnt==0)begin
  126. //第0行
  127. a = data_i[127:120];
  128. b = data_i[119:112];
  129. c = data_i[111:104];
  130. d = data_i[103:96] ;
  131. end
  132. else if(cnt==1)begin
  133. //第1行
  134. a = data_i[95:88] ;
  135. b = data_i[87:80] ;
  136. c = data_i[79:72] ;
  137. d = data_i[71:64] ;
  138. end
  139. else if(cnt==2)begin
  140. //第2行
  141. a = data_i[63:56] ;
  142. b = data_i[55:48] ;
  143. c = data_i[47:40] ;
  144. d = data_i[39:32] ;
  145. end
  146. else if(cnt==3)begin
  147. //第3行
  148. a = data_i[31:24] ;
  149. b = data_i[23:16] ;
  150. c = data_i[15:8] ;
  151. d = data_i[7:0] ;
  152. end
  153. else begin
  154. //第3行
  155. a = 0 ;
  156. b = 0 ;
  157. c = 0 ;
  158. d = 0 ;
  159. end
  160. end
  161. always @(posedge clk or negedge rst_n) begin
  162. if(!rst_n) begin
  163. ready_o <= 0;
  164. end
  165. else begin
  166. ready_o <= end_cnt ;
  167. end
  168. end
  169. endmodule

七、S盒

         S查找表与逆S盒查找表,如下:

  1. //S盒
  2. module memory_S(
  3. input clk,
  4. input rst_n,
  5. input [7:0] addr ,
  6. output reg[7:0] mem_out
  7. );
  8. (* ramstyle = "M9K" *) reg [7:0] int_mem_i [255:0]; //S盒
  9. always@(posedge clk or negedge rst_n ) begin
  10. if(!rst_n) begin
  11. int_mem_i [8'h00] <= 8'h63 ;
  12. int_mem_i [8'h01] <= 8'h7c ;
  13. int_mem_i [8'h02] <= 8'h77 ;
  14. int_mem_i [8'h03] <= 8'h7b ;
  15. int_mem_i [8'h04] <= 8'hf2 ;
  16. int_mem_i [8'h05] <= 8'h6b ;
  17. int_mem_i [8'h06] <= 8'h6f ;
  18. int_mem_i [8'h07] <= 8'hc5 ;
  19. int_mem_i [8'h08] <= 8'h30 ;
  20. int_mem_i [8'h09] <= 8'h01 ;
  21. int_mem_i [8'h0a] <= 8'h67 ;
  22. int_mem_i [8'h0b] <= 8'h2b ;
  23. int_mem_i [8'h0c] <= 8'hfe ;
  24. int_mem_i [8'h0d] <= 8'hd7 ;
  25. int_mem_i [8'h0e] <= 8'hab ;
  26. int_mem_i [8'h0f] <= 8'h76 ;
  27. int_mem_i [8'h10] <= 8'hca ;
  28. int_mem_i [8'h11] <= 8'h82 ;
  29. int_mem_i [8'h12] <= 8'hc9 ;
  30. int_mem_i [8'h13] <= 8'h7d ;
  31. int_mem_i [8'h14] <= 8'hfa ;
  32. int_mem_i [8'h15] <= 8'h59 ;
  33. int_mem_i [8'h16] <= 8'h47 ;
  34. int_mem_i [8'h17] <= 8'hf0 ;
  35. int_mem_i [8'h18] <= 8'had ;
  36. int_mem_i [8'h19] <= 8'hd4 ;
  37. int_mem_i [8'h1a] <= 8'ha2 ;
  38. int_mem_i [8'h1b] <= 8'haf ;
  39. int_mem_i [8'h1c] <= 8'h9c ;
  40. int_mem_i [8'h1d] <= 8'ha4 ;
  41. int_mem_i [8'h1e] <= 8'h72 ;
  42. int_mem_i [8'h1f] <= 8'hc0 ;
  43. int_mem_i [8'h20] <= 8'hb7 ;
  44. int_mem_i [8'h21] <= 8'hfd ;
  45. int_mem_i [8'h22] <= 8'h93 ;
  46. int_mem_i [8'h23] <= 8'h26 ;
  47. int_mem_i [8'h24] <= 8'h36 ;
  48. int_mem_i [8'h25] <= 8'h3f ;
  49. int_mem_i [8'h26] <= 8'hf7 ;
  50. int_mem_i [8'h27] <= 8'hcc ;
  51. int_mem_i [8'h28] <= 8'h34 ;
  52. int_mem_i [8'h29] <= 8'ha5 ;
  53. int_mem_i [8'h2a] <= 8'he5 ;
  54. int_mem_i [8'h2b] <= 8'hf1 ;
  55. int_mem_i [8'h2c] <= 8'h71 ;
  56. int_mem_i [8'h2d] <= 8'hd8 ;
  57. int_mem_i [8'h2e] <= 8'h31 ;
  58. int_mem_i [8'h2f] <= 8'h15 ;
  59. int_mem_i [8'h30] <= 8'h04 ;
  60. int_mem_i [8'h31] <= 8'hc7 ;
  61. int_mem_i [8'h32] <= 8'h23 ;
  62. int_mem_i [8'h33] <= 8'hc3 ;
  63. int_mem_i [8'h34] <= 8'h18 ;
  64. int_mem_i [8'h35] <= 8'h96 ;
  65. int_mem_i [8'h36] <= 8'h05 ;
  66. int_mem_i [8'h37] <= 8'h9a ;
  67. int_mem_i [8'h38] <= 8'h07 ;
  68. int_mem_i [8'h39] <= 8'h12 ;
  69. int_mem_i [8'h3a] <= 8'h80 ;
  70. int_mem_i [8'h3b] <= 8'he2 ;
  71. int_mem_i [8'h3c] <= 8'heb ;
  72. int_mem_i [8'h3d] <= 8'h27 ;
  73. int_mem_i [8'h3e] <= 8'hb2 ;
  74. int_mem_i [8'h3f] <= 8'h75 ;
  75. int_mem_i [8'h40] <= 8'h09 ;
  76. int_mem_i [8'h41] <= 8'h83 ;
  77. int_mem_i [8'h42] <= 8'h2c ;
  78. int_mem_i [8'h43] <= 8'h1a ;
  79. int_mem_i [8'h44] <= 8'h1b ;
  80. int_mem_i [8'h45] <= 8'h6e ;
  81. int_mem_i [8'h46] <= 8'h5a ;
  82. int_mem_i [8'h47] <= 8'ha0 ;
  83. int_mem_i [8'h48] <= 8'h52 ;
  84. int_mem_i [8'h49] <= 8'h3b ;
  85. int_mem_i [8'h4a] <= 8'hd6 ;
  86. int_mem_i [8'h4b] <= 8'hb3 ;
  87. int_mem_i [8'h4c] <= 8'h29 ;
  88. int_mem_i [8'h4d] <= 8'he3 ;
  89. int_mem_i [8'h4e] <= 8'h2f ;
  90. int_mem_i [8'h4f] <= 8'h84 ;
  91. int_mem_i [8'h50] <= 8'h53 ;
  92. int_mem_i [8'h51] <= 8'hd1 ;
  93. int_mem_i [8'h52] <= 8'h00 ;
  94. int_mem_i [8'h53] <= 8'hed ;
  95. int_mem_i [8'h54] <= 8'h20 ;
  96. int_mem_i [8'h55] <= 8'hfc ;
  97. int_mem_i [8'h56] <= 8'hb1 ;
  98. int_mem_i [8'h57] <= 8'h5b ;
  99. int_mem_i [8'h58] <= 8'h6a ;
  100. int_mem_i [8'h59] <= 8'hcb ;
  101. int_mem_i [8'h5a] <= 8'hbe ;
  102. int_mem_i [8'h5b] <= 8'h39 ;
  103. int_mem_i [8'h5c] <= 8'h4a ;
  104. int_mem_i [8'h5d] <= 8'h4c ;
  105. int_mem_i [8'h5e] <= 8'h58 ;
  106. int_mem_i [8'h5f] <= 8'hcf ;
  107. int_mem_i [8'h60] <= 8'hd0 ;
  108. int_mem_i [8'h61] <= 8'hef ;
  109. int_mem_i [8'h62] <= 8'haa ;
  110. int_mem_i [8'h63] <= 8'hfb ;
  111. int_mem_i [8'h64] <= 8'h43 ;
  112. int_mem_i [8'h65] <= 8'h4d ;
  113. int_mem_i [8'h66] <= 8'h33 ;
  114. int_mem_i [8'h67] <= 8'h85 ;
  115. int_mem_i [8'h68] <= 8'h45 ;
  116. int_mem_i [8'h69] <= 8'hf9 ;
  117. int_mem_i [8'h6a] <= 8'h02 ;
  118. int_mem_i [8'h6b] <= 8'h7f ;
  119. int_mem_i [8'h6c] <= 8'h50 ;
  120. int_mem_i [8'h6d] <= 8'h3c ;
  121. int_mem_i [8'h6e] <= 8'h9f ;
  122. int_mem_i [8'h6f] <= 8'ha8 ;
  123. int_mem_i [8'h70] <= 8'h51 ;
  124. int_mem_i [8'h71] <= 8'ha3 ;
  125. int_mem_i [8'h72] <= 8'h40 ;
  126. int_mem_i [8'h73] <= 8'h8f ;
  127. int_mem_i [8'h74] <= 8'h92 ;
  128. int_mem_i [8'h75] <= 8'h9d ;
  129. int_mem_i [8'h76] <= 8'h38 ;
  130. int_mem_i [8'h77] <= 8'hf5 ;
  131. int_mem_i [8'h78] <= 8'hbc ;
  132. int_mem_i [8'h79] <= 8'hb6 ;
  133. int_mem_i [8'h7a] <= 8'hda ;
  134. int_mem_i [8'h7b] <= 8'h21 ;
  135. int_mem_i [8'h7c] <= 8'h10 ;
  136. int_mem_i [8'h7d] <= 8'hff ;
  137. int_mem_i [8'h7e] <= 8'hf3 ;
  138. int_mem_i [8'h7f] <= 8'hd2 ;
  139. int_mem_i [8'h80] <= 8'hcd ;
  140. int_mem_i [8'h81] <= 8'h0c ;
  141. int_mem_i [8'h82] <= 8'h13 ;
  142. int_mem_i [8'h83] <= 8'hec ;
  143. int_mem_i [8'h84] <= 8'h5f ;
  144. int_mem_i [8'h85] <= 8'h97 ;
  145. int_mem_i [8'h86] <= 8'h44 ;
  146. int_mem_i [8'h87] <= 8'h17 ;
  147. int_mem_i [8'h88] <= 8'hc4 ;
  148. int_mem_i [8'h89] <= 8'ha7 ;
  149. int_mem_i [8'h8a] <= 8'h7e ;
  150. int_mem_i [8'h8b] <= 8'h3d ;
  151. int_mem_i [8'h8c] <= 8'h64 ;
  152. int_mem_i [8'h8d] <= 8'h5d ;
  153. int_mem_i [8'h8e] <= 8'h19 ;
  154. int_mem_i [8'h8f] <= 8'h73 ;
  155. int_mem_i [8'h90] <= 8'h60 ;
  156. int_mem_i [8'h91] <= 8'h81 ;
  157. int_mem_i [8'h92] <= 8'h4f ;
  158. int_mem_i [8'h93] <= 8'hdc ;
  159. int_mem_i [8'h94] <= 8'h22 ;
  160. int_mem_i [8'h95] <= 8'h2a ;
  161. int_mem_i [8'h96] <= 8'h90 ;
  162. int_mem_i [8'h97] <= 8'h88 ;
  163. int_mem_i [8'h98] <= 8'h46 ;
  164. int_mem_i [8'h99] <= 8'hee ;
  165. int_mem_i [8'h9a] <= 8'hb8 ;
  166. int_mem_i [8'h9b] <= 8'h14 ;
  167. int_mem_i [8'h9c] <= 8'hde ;
  168. int_mem_i [8'h9d] <= 8'h5e ;
  169. int_mem_i [8'h9e] <= 8'h0b ;
  170. int_mem_i [8'h9f] <= 8'hdb ;
  171. int_mem_i [8'ha0] <= 8'he0 ;
  172. int_mem_i [8'ha1] <= 8'h32 ;
  173. int_mem_i [8'ha2] <= 8'h3a ;
  174. int_mem_i [8'ha3] <= 8'h0a ;
  175. int_mem_i [8'ha4] <= 8'h49 ;
  176. int_mem_i [8'ha5] <= 8'h06 ;
  177. int_mem_i [8'ha6] <= 8'h24 ;
  178. int_mem_i [8'ha7] <= 8'h5c ;
  179. int_mem_i [8'ha8] <= 8'hc2 ;
  180. int_mem_i [8'ha9] <= 8'hd3 ;
  181. int_mem_i [8'haa] <= 8'hac ;
  182. int_mem_i [8'hab] <= 8'h62 ;
  183. int_mem_i [8'hac] <= 8'h91 ;
  184. int_mem_i [8'had] <= 8'h95 ;
  185. int_mem_i [8'hae] <= 8'he4 ;
  186. int_mem_i [8'haf] <= 8'h79 ;
  187. int_mem_i [8'hb0] <= 8'he7 ;
  188. int_mem_i [8'hb1] <= 8'hc8 ;
  189. int_mem_i [8'hb2] <= 8'h37 ;
  190. int_mem_i [8'hb3] <= 8'h6d ;
  191. int_mem_i [8'hb4] <= 8'h8d ;
  192. int_mem_i [8'hb5] <= 8'hd5 ;
  193. int_mem_i [8'hb6] <= 8'h4e ;
  194. int_mem_i [8'hb7] <= 8'ha9 ;
  195. int_mem_i [8'hb8] <= 8'h6c ;
  196. int_mem_i [8'hb9] <= 8'h56 ;
  197. int_mem_i [8'hba] <= 8'hf4 ;
  198. int_mem_i [8'hbb] <= 8'hea ;
  199. int_mem_i [8'hbc] <= 8'h65 ;
  200. int_mem_i [8'hbd] <= 8'h7a ;
  201. int_mem_i [8'hbe] <= 8'hae ;
  202. int_mem_i [8'hbf] <= 8'h08 ;
  203. int_mem_i [8'hc0] <= 8'hba ;
  204. int_mem_i [8'hc1] <= 8'h78 ;
  205. int_mem_i [8'hc2] <= 8'h25 ;
  206. int_mem_i [8'hc3] <= 8'h2e ;
  207. int_mem_i [8'hc4] <= 8'h1c ;
  208. int_mem_i [8'hc5] <= 8'ha6 ;
  209. int_mem_i [8'hc6] <= 8'hb4 ;
  210. int_mem_i [8'hc7] <= 8'hc6 ;
  211. int_mem_i [8'hc8] <= 8'he8 ;
  212. int_mem_i [8'hc9] <= 8'hdd ;
  213. int_mem_i [8'hca] <= 8'h74 ;
  214. int_mem_i [8'hcb] <= 8'h1f ;
  215. int_mem_i [8'hcc] <= 8'h4b ;
  216. int_mem_i [8'hcd] <= 8'hbd ;
  217. int_mem_i [8'hce] <= 8'h8b ;
  218. int_mem_i [8'hcf] <= 8'h8a ;
  219. int_mem_i [8'hd0] <= 8'h70 ;
  220. int_mem_i [8'hd1] <= 8'h3e ;
  221. int_mem_i [8'hd2] <= 8'hb5 ;
  222. int_mem_i [8'hd3] <= 8'h66 ;
  223. int_mem_i [8'hd4] <= 8'h48 ;
  224. int_mem_i [8'hd5] <= 8'h03 ;
  225. int_mem_i [8'hd6] <= 8'hf6 ;
  226. int_mem_i [8'hd7] <= 8'h0e ;
  227. int_mem_i [8'hd8] <= 8'h61 ;
  228. int_mem_i [8'hd9] <= 8'h35 ;
  229. int_mem_i [8'hda] <= 8'h57 ;
  230. int_mem_i [8'hdb] <= 8'hb9 ;
  231. int_mem_i [8'hdc] <= 8'h86 ;
  232. int_mem_i [8'hdd] <= 8'hc1 ;
  233. int_mem_i [8'hde] <= 8'h1d ;
  234. int_mem_i [8'hdf] <= 8'h9e ;
  235. int_mem_i [8'he0] <= 8'he1 ;
  236. int_mem_i [8'he1] <= 8'hf8 ;
  237. int_mem_i [8'he2] <= 8'h98 ;
  238. int_mem_i [8'he3] <= 8'h11 ;
  239. int_mem_i [8'he4] <= 8'h69 ;
  240. int_mem_i [8'he5] <= 8'hd9 ;
  241. int_mem_i [8'he6] <= 8'h8e ;
  242. int_mem_i [8'he7] <= 8'h94 ;
  243. int_mem_i [8'he8] <= 8'h9b ;
  244. int_mem_i [8'he9] <= 8'h1e ;
  245. int_mem_i [8'hea] <= 8'h87 ;
  246. int_mem_i [8'heb] <= 8'he9 ;
  247. int_mem_i [8'hec] <= 8'hce ;
  248. int_mem_i [8'hed] <= 8'h55 ;
  249. int_mem_i [8'hee] <= 8'h28 ;
  250. int_mem_i [8'hef] <= 8'hdf ;
  251. int_mem_i [8'hf0] <= 8'h8c ;
  252. int_mem_i [8'hf1] <= 8'ha1 ;
  253. int_mem_i [8'hf2] <= 8'h89 ;
  254. int_mem_i [8'hf3] <= 8'h0d ;
  255. int_mem_i [8'hf4] <= 8'hbf ;
  256. int_mem_i [8'hf5] <= 8'he6 ;
  257. int_mem_i [8'hf6] <= 8'h42 ;
  258. int_mem_i [8'hf7] <= 8'h68 ;
  259. int_mem_i [8'hf8] <= 8'h41 ;
  260. int_mem_i [8'hf9] <= 8'h99 ;
  261. int_mem_i [8'hfa] <= 8'h2d ;
  262. int_mem_i [8'hfb] <= 8'h0f ;
  263. int_mem_i [8'hfc] <= 8'hb0 ;
  264. int_mem_i [8'hfd] <= 8'h54 ;
  265. int_mem_i [8'hfe] <= 8'hbb ;
  266. int_mem_i [8'hff] <= 8'h16 ;
  267. end
  268. else begin
  269. mem_out= int_mem_i[addr];
  270. end
  271. end
  272. endmodule

  1. //逆S盒
  2. module memory_S_inv(
  3. input clk,
  4. input rst_n,
  5. input [7:0] addr ,
  6. output reg[7:0] mem_out
  7. );
  8. (* ramstyle = "M9K" *) reg [7:0] int_mem_o [255:0]; //S盒
  9. always@(posedge clk or negedge rst_n ) begin
  10. if(!rst_n) begin
  11. int_mem_o [8'h00] <= 8'h52 ;
  12. int_mem_o [8'h01] <= 8'h09 ;
  13. int_mem_o [8'h02] <= 8'h6a ;
  14. int_mem_o [8'h03] <= 8'hd5 ;
  15. int_mem_o [8'h04] <= 8'h30 ;
  16. int_mem_o [8'h05] <= 8'h36 ;
  17. int_mem_o [8'h06] <= 8'ha5 ;
  18. int_mem_o [8'h07] <= 8'h38 ;
  19. int_mem_o [8'h08] <= 8'hbf ;
  20. int_mem_o [8'h09] <= 8'h40 ;
  21. int_mem_o [8'h0a] <= 8'ha3 ;
  22. int_mem_o [8'h0b] <= 8'h9e ;
  23. int_mem_o [8'h0c] <= 8'h81 ;
  24. int_mem_o [8'h0d] <= 8'hf3 ;
  25. int_mem_o [8'h0e] <= 8'hd7 ;
  26. int_mem_o [8'h0f] <= 8'hfb ;
  27. int_mem_o [8'h10] <= 8'h7c ;
  28. int_mem_o [8'h11] <= 8'he3 ;
  29. int_mem_o [8'h12] <= 8'h39 ;
  30. int_mem_o [8'h13] <= 8'h82 ;
  31. int_mem_o [8'h14] <= 8'h9b ;
  32. int_mem_o [8'h15] <= 8'h2f ;
  33. int_mem_o [8'h16] <= 8'hff ;
  34. int_mem_o [8'h17] <= 8'h87 ;
  35. int_mem_o [8'h18] <= 8'h34 ;
  36. int_mem_o [8'h19] <= 8'h8e ;
  37. int_mem_o [8'h1a] <= 8'h43 ;
  38. int_mem_o [8'h1b] <= 8'h44 ;
  39. int_mem_o [8'h1c] <= 8'hc4 ;
  40. int_mem_o [8'h1d] <= 8'hde ;
  41. int_mem_o [8'h1e] <= 8'he9 ;
  42. int_mem_o [8'h1f] <= 8'hcb ;
  43. int_mem_o [8'h20] <= 8'h54 ;
  44. int_mem_o [8'h21] <= 8'h7b ;
  45. int_mem_o [8'h22] <= 8'h94 ;
  46. int_mem_o [8'h23] <= 8'h32 ;
  47. int_mem_o [8'h24] <= 8'ha6 ;
  48. int_mem_o [8'h25] <= 8'hc2 ;
  49. int_mem_o [8'h26] <= 8'h23 ;
  50. int_mem_o [8'h27] <= 8'h3d ;
  51. int_mem_o [8'h28] <= 8'hee ;
  52. int_mem_o [8'h29] <= 8'h4c ;
  53. int_mem_o [8'h2a] <= 8'h95 ;
  54. int_mem_o [8'h2b] <= 8'h0b ;
  55. int_mem_o [8'h2c] <= 8'h42 ;
  56. int_mem_o [8'h2d] <= 8'hfa ;
  57. int_mem_o [8'h2e] <= 8'hc3 ;
  58. int_mem_o [8'h2f] <= 8'h4e ;
  59. int_mem_o [8'h30] <= 8'h08 ;
  60. int_mem_o [8'h31] <= 8'h2e ;
  61. int_mem_o [8'h32] <= 8'ha1 ;
  62. int_mem_o [8'h33] <= 8'h66 ;
  63. int_mem_o [8'h34] <= 8'h28 ;
  64. int_mem_o [8'h35] <= 8'hd9 ;
  65. int_mem_o [8'h36] <= 8'h24 ;
  66. int_mem_o [8'h37] <= 8'hb2 ;
  67. int_mem_o [8'h38] <= 8'h76 ;
  68. int_mem_o [8'h39] <= 8'h5b ;
  69. int_mem_o [8'h3a] <= 8'ha2 ;
  70. int_mem_o [8'h3b] <= 8'h49 ;
  71. int_mem_o [8'h3c] <= 8'h6d ;
  72. int_mem_o [8'h3d] <= 8'h8b ;
  73. int_mem_o [8'h3e] <= 8'hd1 ;
  74. int_mem_o [8'h3f] <= 8'h25 ;
  75. int_mem_o [8'h40] <= 8'h72 ;
  76. int_mem_o [8'h41] <= 8'hf8 ;
  77. int_mem_o [8'h42] <= 8'hf6 ;
  78. int_mem_o [8'h43] <= 8'h64 ;
  79. int_mem_o [8'h44] <= 8'h86 ;
  80. int_mem_o [8'h45] <= 8'h68 ;
  81. int_mem_o [8'h46] <= 8'h98 ;
  82. int_mem_o [8'h47] <= 8'h16 ;
  83. int_mem_o [8'h48] <= 8'hd4 ;
  84. int_mem_o [8'h49] <= 8'ha4 ;
  85. int_mem_o [8'h4a] <= 8'h5c ;
  86. int_mem_o [8'h4b] <= 8'hcc ;
  87. int_mem_o [8'h4c] <= 8'h5d ;
  88. int_mem_o [8'h4d] <= 8'h65 ;
  89. int_mem_o [8'h4e] <= 8'hb6 ;
  90. int_mem_o [8'h4f] <= 8'h92 ;
  91. int_mem_o [8'h50] <= 8'h6c ;
  92. int_mem_o [8'h51] <= 8'h70 ;
  93. int_mem_o [8'h52] <= 8'h48 ;
  94. int_mem_o [8'h53] <= 8'h50 ;
  95. int_mem_o [8'h54] <= 8'hfd ;
  96. int_mem_o [8'h55] <= 8'hed ;
  97. int_mem_o [8'h56] <= 8'hb9 ;
  98. int_mem_o [8'h57] <= 8'hda ;
  99. int_mem_o [8'h58] <= 8'h5e ;
  100. int_mem_o [8'h59] <= 8'h15 ;
  101. int_mem_o [8'h5a] <= 8'h46 ;
  102. int_mem_o [8'h5b] <= 8'h57 ;
  103. int_mem_o [8'h5c] <= 8'ha7 ;
  104. int_mem_o [8'h5d] <= 8'h8d ;
  105. int_mem_o [8'h5e] <= 8'h9d ;
  106. int_mem_o [8'h5f] <= 8'h84 ;
  107. int_mem_o [8'h60] <= 8'h90 ;
  108. int_mem_o [8'h61] <= 8'hd8 ;
  109. int_mem_o [8'h62] <= 8'hab ;
  110. int_mem_o [8'h63] <= 8'h00 ;
  111. int_mem_o [8'h64] <= 8'h8c ;
  112. int_mem_o [8'h65] <= 8'hbc ;
  113. int_mem_o [8'h66] <= 8'hd3 ;
  114. int_mem_o [8'h67] <= 8'h0a ;
  115. int_mem_o [8'h68] <= 8'hf7 ;
  116. int_mem_o [8'h69] <= 8'he4 ;
  117. int_mem_o [8'h6a] <= 8'h58 ;
  118. int_mem_o [8'h6b] <= 8'h05 ;
  119. int_mem_o [8'h6c] <= 8'hb8 ;
  120. int_mem_o [8'h6d] <= 8'hb3 ;
  121. int_mem_o [8'h6e] <= 8'h45 ;
  122. int_mem_o [8'h6f] <= 8'h06 ;
  123. int_mem_o [8'h70] <= 8'hd0 ;
  124. int_mem_o [8'h71] <= 8'h2c ;
  125. int_mem_o [8'h72] <= 8'h1e ;
  126. int_mem_o [8'h73] <= 8'h8f ;
  127. int_mem_o [8'h74] <= 8'hca ;
  128. int_mem_o [8'h75] <= 8'h3f ;
  129. int_mem_o [8'h76] <= 8'h0f ;
  130. int_mem_o [8'h77] <= 8'h02 ;
  131. int_mem_o [8'h78] <= 8'hc1 ;
  132. int_mem_o [8'h79] <= 8'haf ;
  133. int_mem_o [8'h7a] <= 8'hbd ;
  134. int_mem_o [8'h7b] <= 8'h03 ;
  135. int_mem_o [8'h7c] <= 8'h01 ;
  136. int_mem_o [8'h7d] <= 8'h13 ;
  137. int_mem_o [8'h7e] <= 8'h8a ;
  138. int_mem_o [8'h7f] <= 8'h6b ;
  139. int_mem_o [8'h80] <= 8'h3a ;
  140. int_mem_o [8'h81] <= 8'h91 ;
  141. int_mem_o [8'h82] <= 8'h11 ;
  142. int_mem_o [8'h83] <= 8'h41 ;
  143. int_mem_o [8'h84] <= 8'h4f ;
  144. int_mem_o [8'h85] <= 8'h67 ;
  145. int_mem_o [8'h86] <= 8'hdc ;
  146. int_mem_o [8'h87] <= 8'hea ;
  147. int_mem_o [8'h88] <= 8'h97 ;
  148. int_mem_o [8'h89] <= 8'hf2 ;
  149. int_mem_o [8'h8a] <= 8'hcf ;
  150. int_mem_o [8'h8b] <= 8'hce ;
  151. int_mem_o [8'h8c] <= 8'hf0 ;
  152. int_mem_o [8'h8d] <= 8'hb4 ;
  153. int_mem_o [8'h8e] <= 8'he6 ;
  154. int_mem_o [8'h8f] <= 8'h73 ;
  155. int_mem_o [8'h90] <= 8'h96 ;
  156. int_mem_o [8'h91] <= 8'hac ;
  157. int_mem_o [8'h92] <= 8'h74 ;
  158. int_mem_o [8'h93] <= 8'h22 ;
  159. int_mem_o [8'h94] <= 8'he7 ;
  160. int_mem_o [8'h95] <= 8'had ;
  161. int_mem_o [8'h96] <= 8'h35 ;
  162. int_mem_o [8'h97] <= 8'h85 ;
  163. int_mem_o [8'h98] <= 8'he2 ;
  164. int_mem_o [8'h99] <= 8'hf9 ;
  165. int_mem_o [8'h9a] <= 8'h37 ;
  166. int_mem_o [8'h9b] <= 8'he8 ;
  167. int_mem_o [8'h9c] <= 8'h1c ;
  168. int_mem_o [8'h9d] <= 8'h75 ;
  169. int_mem_o [8'h9e] <= 8'hdf ;
  170. int_mem_o [8'h9f] <= 8'h6e ;
  171. int_mem_o [8'ha0] <= 8'h47 ;
  172. int_mem_o [8'ha1] <= 8'hf1 ;
  173. int_mem_o [8'ha2] <= 8'h1a ;
  174. int_mem_o [8'ha3] <= 8'h71 ;
  175. int_mem_o [8'ha4] <= 8'h1d ;
  176. int_mem_o [8'ha5] <= 8'h29 ;
  177. int_mem_o [8'ha6] <= 8'hc5 ;
  178. int_mem_o [8'ha7] <= 8'h89 ;
  179. int_mem_o [8'ha8] <= 8'h6f ;
  180. int_mem_o [8'ha9] <= 8'hb7 ;
  181. int_mem_o [8'haa] <= 8'h62 ;
  182. int_mem_o [8'hab] <= 8'h0e ;
  183. int_mem_o [8'hac] <= 8'haa ;
  184. int_mem_o [8'had] <= 8'h18 ;
  185. int_mem_o [8'hae] <= 8'hbe ;
  186. int_mem_o [8'haf] <= 8'h1b ;
  187. int_mem_o [8'hb0] <= 8'hfc ;
  188. int_mem_o [8'hb1] <= 8'h56 ;
  189. int_mem_o [8'hb2] <= 8'h3e ;
  190. int_mem_o [8'hb3] <= 8'h4b ;
  191. int_mem_o [8'hb4] <= 8'hc6 ;
  192. int_mem_o [8'hb5] <= 8'hd2 ;
  193. int_mem_o [8'hb6] <= 8'h79 ;
  194. int_mem_o [8'hb7] <= 8'h20 ;
  195. int_mem_o [8'hb8] <= 8'h9a ;
  196. int_mem_o [8'hb9] <= 8'hdb ;
  197. int_mem_o [8'hba] <= 8'hc0 ;
  198. int_mem_o [8'hbb] <= 8'hfe ;
  199. int_mem_o [8'hbc] <= 8'h78 ;
  200. int_mem_o [8'hbd] <= 8'hcd ;
  201. int_mem_o [8'hbe] <= 8'h5a ;
  202. int_mem_o [8'hbf] <= 8'hf4 ;
  203. int_mem_o [8'hc0] <= 8'h1f ;
  204. int_mem_o [8'hc1] <= 8'hdd ;
  205. int_mem_o [8'hc2] <= 8'ha8 ;
  206. int_mem_o [8'hc3] <= 8'h33 ;
  207. int_mem_o [8'hc4] <= 8'h88 ;
  208. int_mem_o [8'hc5] <= 8'h07 ;
  209. int_mem_o [8'hc6] <= 8'hc7 ;
  210. int_mem_o [8'hc7] <= 8'h31 ;
  211. int_mem_o [8'hc8] <= 8'hb1 ;
  212. int_mem_o [8'hc9] <= 8'h12 ;
  213. int_mem_o [8'hca] <= 8'h10 ;
  214. int_mem_o [8'hcb] <= 8'h59 ;
  215. int_mem_o [8'hcc] <= 8'h27 ;
  216. int_mem_o [8'hcd] <= 8'h80 ;
  217. int_mem_o [8'hce] <= 8'hec ;
  218. int_mem_o [8'hcf] <= 8'h5f ;
  219. int_mem_o [8'hd0] <= 8'h60 ;
  220. int_mem_o [8'hd1] <= 8'h51 ;
  221. int_mem_o [8'hd2] <= 8'h7f ;
  222. int_mem_o [8'hd3] <= 8'ha9 ;
  223. int_mem_o [8'hd4] <= 8'h19 ;
  224. int_mem_o [8'hd5] <= 8'hb5 ;
  225. int_mem_o [8'hd6] <= 8'h4a ;
  226. int_mem_o [8'hd7] <= 8'h0d ;
  227. int_mem_o [8'hd8] <= 8'h2d ;
  228. int_mem_o [8'hd9] <= 8'he5 ;
  229. int_mem_o [8'hda] <= 8'h7a ;
  230. int_mem_o [8'hdb] <= 8'h9f ;
  231. int_mem_o [8'hdc] <= 8'h93 ;
  232. int_mem_o [8'hdd] <= 8'hc9 ;
  233. int_mem_o [8'hde] <= 8'h9c ;
  234. int_mem_o [8'hdf] <= 8'hef ;
  235. int_mem_o [8'he0] <= 8'ha0 ;
  236. int_mem_o [8'he1] <= 8'he0 ;
  237. int_mem_o [8'he2] <= 8'h3b ;
  238. int_mem_o [8'he3] <= 8'h4d ;
  239. int_mem_o [8'he4] <= 8'hae ;
  240. int_mem_o [8'he5] <= 8'h2a ;
  241. int_mem_o [8'he6] <= 8'hf5 ;
  242. int_mem_o [8'he7] <= 8'hb0 ;
  243. int_mem_o [8'he8] <= 8'hc8 ;
  244. int_mem_o [8'he9] <= 8'heb ;
  245. int_mem_o [8'hea] <= 8'hbb ;
  246. int_mem_o [8'heb] <= 8'h3c ;
  247. int_mem_o [8'hec] <= 8'h83 ;
  248. int_mem_o [8'hed] <= 8'h53 ;
  249. int_mem_o [8'hee] <= 8'h99 ;
  250. int_mem_o [8'hef] <= 8'h61 ;
  251. int_mem_o [8'hf0] <= 8'h17 ;
  252. int_mem_o [8'hf1] <= 8'h2b ;
  253. int_mem_o [8'hf2] <= 8'h04 ;
  254. int_mem_o [8'hf3] <= 8'h7e ;
  255. int_mem_o [8'hf4] <= 8'hba ;
  256. int_mem_o [8'hf5] <= 8'h77 ;
  257. int_mem_o [8'hf6] <= 8'hd6 ;
  258. int_mem_o [8'hf7] <= 8'h26 ;
  259. int_mem_o [8'hf8] <= 8'he1 ;
  260. int_mem_o [8'hf9] <= 8'h69 ;
  261. int_mem_o [8'hfa] <= 8'h14 ;
  262. int_mem_o [8'hfb] <= 8'h63 ;
  263. int_mem_o [8'hfc] <= 8'h55 ;
  264. int_mem_o [8'hfd] <= 8'h21 ;
  265. int_mem_o [8'hfe] <= 8'h0c ;
  266. int_mem_o [8'hff] <= 8'h7d ;
  267. end
  268. else begin
  269. mem_out= int_mem_o[addr];
  270. end
  271. end
  272. endmodule

最后,代码已全部上传完,全部拷贝下去,可以直接跑的。由于此代码多数都是时序逻辑,从开始加密到结束加密可能会有上千个时钟周期的延迟。如有不理解的欢迎留言咨询。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/856610
推荐阅读
相关标签
  

闽ICP备14008679号