2025年3月10日 星期一

CGD_100_IO 的實體腳位約束檔設定,以及測試檔

 CGD_100_IO


以下有兩個檔案 CGD_100_IO.v  和腳位檔


CGD_100_IO.v

  1. module CDG_100_IO (
  2.     input           clk_50M,
  3.     input   [8:1]   iKEY_n,
  4.     input   [4:1]   iSW,
  5.     output  [8:1]   oLED,    // blue LED
  6.     output  [2:0]   oGYR1_n, oGYR2_n, oGYR3_n, oGYR4_n, // GYR color LED
  7.     output  [7:0]   oSEG,   // drive  7 segment display
  8.     output  [3:0]   oSEG_s  // select 7 segment display
  9. );

  10. reg [25:0]  cn;


  11. always @(posedge clk_50M)
  12. begin
  13.     cn <= cn+1;
  14. end

  15. // input [8:1]     key;
  16. // output [8:1]    led;

  17. // assign oLED = ~iKEY_n;
  18. assign oLED = {iSW[4],iSW[4],iSW[3],iSW[3],iSW[2],iSW[2],iSW[1],iSW[1]};

  19. assign oGYR1_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};
  20. assign oGYR2_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};
  21. assign oGYR3_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};
  22. assign oGYR4_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};

  23. assign  oSEG_s = {~iSW[4], ~iSW[3], ~iSW[2], ~iSW[1]};
  24. assign  oSEG = iKEY_n;

  25. endmodule


實體腳位約束檔

CGD_100.cst

  • // clock 50MHz
  •  IO_LOC "clk_50M" 11;
  •  IO_PORT "clk_50M" IO_TYPE=LVCMOS33;

  • // ==== INPUT ====
  • // iKEY: push button, normal = 1, press = 0

  •  IO_LOC "iKEY_n[1]" 58;  //k1
  •  IO_LOC "iKEY_n[2]" 59;  //k2
  •  IO_LOC "iKEY_n[3]" 60;  //k3
  •  IO_LOC "iKEY_n[4]" 61;  //k4
  •  IO_LOC "iKEY_n[5]" 62;  //k5
  •  IO_LOC "iKEY_n[6]" 63;  //k6
  •  IO_LOC "iKEY_n[7]" 64;  //k7
  •  IO_LOC "iKEY_n[8]" 65;  //k8

  •  IO_PORT "iKEY_n[1]" IO_TYPE=LVCMOS33;
  •  IO_PORT "iKEY_n[2]" IO_TYPE=LVCMOS33;
  •  IO_PORT "iKEY_n[3]" IO_TYPE=LVCMOS33;
  •  IO_PORT "iKEY_n[4]" IO_TYPE=LVCMOS33;
  •  IO_PORT "iKEY_n[5]" IO_TYPE=LVCMOS33;
  •  IO_PORT "iKEY_n[6]" IO_TYPE=LVCMOS33;
  •  IO_PORT "iKEY_n[7]" IO_TYPE=LVCMOS33;
  •  IO_PORT "iKEY_n[8]" IO_TYPE=LVCMOS33;

  • // iSW: switch button, up = ON = 1, low = OFF = 0;
  •  IO_LOC "iSW[1]" 75;
  •  IO_LOC "iSW[2]" 76;
  •  IO_LOC "iSW[3]" 78;
  •  IO_LOC "iSW[4]" 79;
  •  IO_PORT "iSW[1]" IO_TYPE=LVCMOS33 PULL_MODE=DOWN BANK_VCCIO=3.3;
  •  IO_PORT "iSW[2]" IO_TYPE=LVCMOS33 PULL_MODE=DOWN BANK_VCCIO=3.3;
  •  IO_PORT "iSW[3]" IO_TYPE=LVCMOS33 PULL_MODE=DOWN BANK_VCCIO=3.3;
  •  IO_PORT "iSW[4]" IO_TYPE=LVCMOS33 PULL_MODE=DOWN BANK_VCCIO=3.3;

  • // ==== OUTPUT ==== 
  • // oLED: blue LED, 1 = turn on, 0 = turn off
  •  IO_LOC "oLED[1]" 23;    //D1
  •  IO_LOC "oLED[2]" 24;    //D2
  •  IO_LOC "oLED[3]" 25;    //D3
  •  IO_LOC "oLED[4]" 26;    //D4
  •  IO_LOC "oLED[5]" 27;    //D5
  •  IO_LOC "oLED[6]" 28;    //D6
  •  IO_LOC "oLED[7]" 29;    //D7
  •  IO_LOC "oLED[8]" 30;    //D8
  •  IO_PORT "oLED[1]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oLED[2]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oLED[3]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oLED[4]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oLED[5]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oLED[6]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oLED[7]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oLED[8]" IO_TYPE=LVCMOS33;

  • //  GYR1, GYR2, GYR3, GYR4: 0 = turn on, 1 = turn off;

  •  IO_LOC "oRYG1R_n" 112;
  •  IO_LOC "oRYG1Y_n" 113;
  •  IO_LOC "oRYG1G_n" 114;
  •  IO_LOC "oRYG2R_n" 106;
  •  IO_LOC "oRYG2Y_n" 110;
  •  IO_LOC "oRYG2G_n" 111;
  •  IO_LOC "oRYG3R_n" 101;
  •  IO_LOC "oRYG3Y_n" 102;
  •  IO_LOC "oRYG3G_n" 104;
  •  IO_LOC "oRYG4R_n"  98;
  •  IO_LOC "oRYG4Y_n"  99;
  •  IO_LOC "oRYG4G_n" 100;

  •  IO_PORT "oRYG1R_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG1Y_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG1G_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG2R_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG2Y_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG2G_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG3R_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG3Y_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG3G_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG4R_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG4Y_n" IO_TYPE=LVCMOS33;
  •  IO_PORT "oRYG4G_n" IO_TYPE=LVCMOS33;

  • // four oSEGment display, common positive
  •  IO_LOC "oSEG_s[3]" 137;
  •  IO_LOC "oSEG_s[2]" 140;
  •  IO_LOC "oSEG_s[1]" 141;
  •  IO_LOC "oSEG_s[0]" 3;
  •  IO_LOC "oSEG[0]" 138;
  •  IO_LOC "oSEG[1]" 142;
  •  IO_LOC "oSEG[2]" 9;
  •  IO_LOC "oSEG[3]" 7;
  •  IO_LOC "oSEG[4]" 12;
  •  IO_LOC "oSEG[5]" 139;
  •  IO_LOC "oSEG[6]" 8;
  •  IO_LOC "oSEG[7]" 10;

  •  IO_PORT "oSEG_s[0]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oSEG_s[1]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oSEG_s[2]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oSEG_s[3]" IO_TYPE=LVCMOS33;
  •  IO_PORT "oSEG[0]" IO_TYPE=LVCMOS33;    //a
  •  IO_PORT "oSEG[1]" IO_TYPE=LVCMOS33;    //b
  •  IO_PORT "oSEG[2]" IO_TYPE=LVCMOS33;    //c
  •  IO_PORT "oSEG[3]" IO_TYPE=LVCMOS33;    //d
  •  IO_PORT "oSEG[4]" IO_TYPE=LVCMOS33;    //e
  •  IO_PORT "oSEG[5]" IO_TYPE=LVCMOS33;    //f
  •  IO_PORT "oSEG[6]" IO_TYPE=LVCMOS33;    //g
  •  IO_PORT "oSEG[7]" IO_TYPE=LVCMOS33;    //dot

  • /*
  •  IO_LOC "beep" 6;
  •  IO_PORT "beep" IO_TYPE=LVCMOS33;
  •  IO_LOC "rs232_rec" 49;
  •  IO_LOC "rs232_txd" 48;
  •  IO_PORT "rs232_rec" IO_TYPE=LVCMOS33;
  •  IO_PORT "rs232_txd" IO_TYPE=LVCMOS33;
  • */





2024年11月18日 星期一

Google Driver 檔案讀取

 在Google Driver中,更新檔案(需檔案權限)或上傳檔案(需目錄權限)較為複雜,目前先針對下載檔案說明。

































2024年5月28日 星期二

生成verilog Look-Up Table (case) module 的matlab程式

 matlab程式如下,ibright為Look-Up Table變數輸入,obright為Look-Up Table變數輸出

11~14行為LUT,xy對應的方程式在第12行

  1. % 開啟檔案以寫入
  2. fileID = fopen('contrast.v', 'w');

  3. % 寫入檔案內容
  4. fprintf(fileID, 'module contrast(\n\tibright,\n\tobright\n);\n\n');
  5. fprintf(fileID, 'input\t\t\t[7:0]\tibright;\n');
  6. fprintf(fileID, 'output reg\t[7:0]\tobright;\n\n');
  7. fprintf(fileID, 'always @(ibright)\n\tbegin\n\t\tcase(ibright)\n');

  8. % 生成從 0 到 255 的數值和對應的 nn 值
  9. for x = 0:255
  10.     y = floor(96*( (x-128)/128)^3 + 96 );  % equation
  11.     fprintf(fileID, '\t\t8''d%03d: obright = %03d;\t//\n', x, y);
  12. end

  13. % 完成 case 和模組結束部分
  14. fprintf(fileID, '\t\tendcase\n\tend\nendmodule\n');

  15. % 關閉檔案
  16. fclose(fileID);

  17. disp('檔案 contrast.v 已生成');


生成module結果附在下方,可用下面方式呼叫
為減少延遲,本例未使用clock
  1. contrast u(
  2. .ibright(gray),
  3. .obright(gray_contrast)
  4. );

module的verilog檔
  1. module contrast(
  2. ibright,
  3. obright
  4. );

  5. input [7:0] ibright;
  6. output reg [7:0] obright;

  7. always @(ibright)
  8. begin
  9. case(ibright)
  10. 8'd000: obright = 000; //
  11. 8'd001: obright = 002; //
  12. 8'd002: obright = 004; //
  13. 8'd003: obright = 006; //
  14. 8'd004: obright = 008; //
  15. 8'd005: obright = 010; //
  16. 8'd006: obright = 012; //
  17. 8'd007: obright = 014; //
  18. 8'd008: obright = 016; //
  19. 8'd009: obright = 018; //
  20. 8'd010: obright = 020; //
  21. 8'd011: obright = 022; //
  22. 8'd012: obright = 024; //
  23. 8'd013: obright = 026; //
  24. 8'd014: obright = 028; //
  25. 8'd015: obright = 029; //
  26. 8'd016: obright = 031; //
  27. 8'd017: obright = 033; //
  28. 8'd018: obright = 035; //
  29. 8'd019: obright = 036; //
  30. 8'd020: obright = 038; //
  31. 8'd021: obright = 039; //
  32. 8'd022: obright = 041; //
  33. 8'd023: obright = 043; //
  34. 8'd024: obright = 044; //
  35. 8'd025: obright = 045; //
  36. 8'd026: obright = 047; //
  37. 8'd027: obright = 048; //
  38. 8'd028: obright = 050; //
  39. 8'd029: obright = 051; //
  40. 8'd030: obright = 052; //
  41. 8'd031: obright = 054; //
  42. 8'd032: obright = 055; //
  43. 8'd033: obright = 056; //
  44. 8'd034: obright = 057; //
  45. 8'd035: obright = 059; //
  46. 8'd036: obright = 060; //
  47. 8'd037: obright = 061; //
  48. 8'd038: obright = 062; //
  49. 8'd039: obright = 063; //
  50. 8'd040: obright = 064; //
  51. 8'd041: obright = 065; //
  52. 8'd042: obright = 066; //
  53. 8'd043: obright = 067; //
  54. 8'd044: obright = 068; //
  55. 8'd045: obright = 069; //
  56. 8'd046: obright = 070; //
  57. 8'd047: obright = 071; //
  58. 8'd048: obright = 072; //
  59. 8'd049: obright = 073; //
  60. 8'd050: obright = 074; //
  61. 8'd051: obright = 075; //
  62. 8'd052: obright = 075; //
  63. 8'd053: obright = 076; //
  64. 8'd054: obright = 077; //
  65. 8'd055: obright = 078; //
  66. 8'd056: obright = 078; //
  67. 8'd057: obright = 079; //
  68. 8'd058: obright = 080; //
  69. 8'd059: obright = 080; //
  70. 8'd060: obright = 081; //
  71. 8'd061: obright = 082; //
  72. 8'd062: obright = 082; //
  73. 8'd063: obright = 083; //
  74. 8'd064: obright = 084; //
  75. 8'd065: obright = 084; //
  76. 8'd066: obright = 085; //
  77. 8'd067: obright = 085; //
  78. 8'd068: obright = 086; //
  79. 8'd069: obright = 086; //
  80. 8'd070: obright = 087; //
  81. 8'd071: obright = 087; //
  82. 8'd072: obright = 087; //
  83. 8'd073: obright = 088; //
  84. 8'd074: obright = 088; //
  85. 8'd075: obright = 089; //
  86. 8'd076: obright = 089; //
  87. 8'd077: obright = 089; //
  88. 8'd078: obright = 090; //
  89. 8'd079: obright = 090; //
  90. 8'd080: obright = 090; //
  91. 8'd081: obright = 091; //
  92. 8'd082: obright = 091; //
  93. 8'd083: obright = 091; //
  94. 8'd084: obright = 092; //
  95. 8'd085: obright = 092; //
  96. 8'd086: obright = 092; //
  97. 8'd087: obright = 092; //
  98. 8'd088: obright = 093; //
  99. 8'd089: obright = 093; //
  100. 8'd090: obright = 093; //
  101. 8'd091: obright = 093; //
  102. 8'd092: obright = 093; //
  103. 8'd093: obright = 094; //
  104. 8'd094: obright = 094; //
  105. 8'd095: obright = 094; //
  106. 8'd096: obright = 094; //
  107. 8'd097: obright = 094; //
  108. 8'd098: obright = 094; //
  109. 8'd099: obright = 094; //
  110. 8'd100: obright = 094; //
  111. 8'd101: obright = 095; //
  112. 8'd102: obright = 095; //
  113. 8'd103: obright = 095; //
  114. 8'd104: obright = 095; //
  115. 8'd105: obright = 095; //
  116. 8'd106: obright = 095; //
  117. 8'd107: obright = 095; //
  118. 8'd108: obright = 095; //
  119. 8'd109: obright = 095; //
  120. 8'd110: obright = 095; //
  121. 8'd111: obright = 095; //
  122. 8'd112: obright = 095; //
  123. 8'd113: obright = 095; //
  124. 8'd114: obright = 095; //
  125. 8'd115: obright = 095; //
  126. 8'd116: obright = 095; //
  127. 8'd117: obright = 095; //
  128. 8'd118: obright = 095; //
  129. 8'd119: obright = 095; //
  130. 8'd120: obright = 095; //
  131. 8'd121: obright = 095; //
  132. 8'd122: obright = 095; //
  133. 8'd123: obright = 095; //
  134. 8'd124: obright = 095; //
  135. 8'd125: obright = 095; //
  136. 8'd126: obright = 095; //
  137. 8'd127: obright = 095; //
  138. 8'd128: obright = 096; //
  139. 8'd129: obright = 096; //
  140. 8'd130: obright = 096; //
  141. 8'd131: obright = 096; //
  142. 8'd132: obright = 096; //
  143. 8'd133: obright = 096; //
  144. 8'd134: obright = 096; //
  145. 8'd135: obright = 096; //
  146. 8'd136: obright = 096; //
  147. 8'd137: obright = 096; //
  148. 8'd138: obright = 096; //
  149. 8'd139: obright = 096; //
  150. 8'd140: obright = 096; //
  151. 8'd141: obright = 096; //
  152. 8'd142: obright = 096; //
  153. 8'd143: obright = 096; //
  154. 8'd144: obright = 096; //
  155. 8'd145: obright = 096; //
  156. 8'd146: obright = 096; //
  157. 8'd147: obright = 096; //
  158. 8'd148: obright = 096; //
  159. 8'd149: obright = 096; //
  160. 8'd150: obright = 096; //
  161. 8'd151: obright = 096; //
  162. 8'd152: obright = 096; //
  163. 8'd153: obright = 096; //
  164. 8'd154: obright = 096; //
  165. 8'd155: obright = 096; //
  166. 8'd156: obright = 097; //
  167. 8'd157: obright = 097; //
  168. 8'd158: obright = 097; //
  169. 8'd159: obright = 097; //
  170. 8'd160: obright = 097; //
  171. 8'd161: obright = 097; //
  172. 8'd162: obright = 097; //
  173. 8'd163: obright = 097; //
  174. 8'd164: obright = 098; //
  175. 8'd165: obright = 098; //
  176. 8'd166: obright = 098; //
  177. 8'd167: obright = 098; //
  178. 8'd168: obright = 098; //
  179. 8'd169: obright = 099; //
  180. 8'd170: obright = 099; //
  181. 8'd171: obright = 099; //
  182. 8'd172: obright = 099; //
  183. 8'd173: obright = 100; //
  184. 8'd174: obright = 100; //
  185. 8'd175: obright = 100; //
  186. 8'd176: obright = 101; //
  187. 8'd177: obright = 101; //
  188. 8'd178: obright = 101; //
  189. 8'd179: obright = 102; //
  190. 8'd180: obright = 102; //
  191. 8'd181: obright = 102; //
  192. 8'd182: obright = 103; //
  193. 8'd183: obright = 103; //
  194. 8'd184: obright = 104; //
  195. 8'd185: obright = 104; //
  196. 8'd186: obright = 104; //
  197. 8'd187: obright = 105; //
  198. 8'd188: obright = 105; //
  199. 8'd189: obright = 106; //
  200. 8'd190: obright = 106; //
  201. 8'd191: obright = 107; //
  202. 8'd192: obright = 108; //
  203. 8'd193: obright = 108; //
  204. 8'd194: obright = 109; //
  205. 8'd195: obright = 109; //
  206. 8'd196: obright = 110; //
  207. 8'd197: obright = 111; //
  208. 8'd198: obright = 111; //
  209. 8'd199: obright = 112; //
  210. 8'd200: obright = 113; //
  211. 8'd201: obright = 113; //
  212. 8'd202: obright = 114; //
  213. 8'd203: obright = 115; //
  214. 8'd204: obright = 116; //
  215. 8'd205: obright = 116; //
  216. 8'd206: obright = 117; //
  217. 8'd207: obright = 118; //
  218. 8'd208: obright = 119; //
  219. 8'd209: obright = 120; //
  220. 8'd210: obright = 121; //
  221. 8'd211: obright = 122; //
  222. 8'd212: obright = 123; //
  223. 8'd213: obright = 124; //
  224. 8'd214: obright = 125; //
  225. 8'd215: obright = 126; //
  226. 8'd216: obright = 127; //
  227. 8'd217: obright = 128; //
  228. 8'd218: obright = 129; //
  229. 8'd219: obright = 130; //
  230. 8'd220: obright = 131; //
  231. 8'd221: obright = 132; //
  232. 8'd222: obright = 134; //
  233. 8'd223: obright = 135; //
  234. 8'd224: obright = 136; //
  235. 8'd225: obright = 137; //
  236. 8'd226: obright = 139; //
  237. 8'd227: obright = 140; //
  238. 8'd228: obright = 141; //
  239. 8'd229: obright = 143; //
  240. 8'd230: obright = 144; //
  241. 8'd231: obright = 146; //
  242. 8'd232: obright = 147; //
  243. 8'd233: obright = 148; //
  244. 8'd234: obright = 150; //
  245. 8'd235: obright = 152; //
  246. 8'd236: obright = 153; //
  247. 8'd237: obright = 155; //
  248. 8'd238: obright = 156; //
  249. 8'd239: obright = 158; //
  250. 8'd240: obright = 160; //
  251. 8'd241: obright = 162; //
  252. 8'd242: obright = 163; //
  253. 8'd243: obright = 165; //
  254. 8'd244: obright = 167; //
  255. 8'd245: obright = 169; //
  256. 8'd246: obright = 171; //
  257. 8'd247: obright = 173; //
  258. 8'd248: obright = 175; //
  259. 8'd249: obright = 177; //
  260. 8'd250: obright = 179; //
  261. 8'd251: obright = 181; //
  262. 8'd252: obright = 183; //
  263. 8'd253: obright = 185; //
  264. 8'd254: obright = 187; //
  265. 8'd255: obright = 189; //
  266. endcase
  267. end
  268. endmodule






2023年9月6日 星期三

RGB to YCbCr

 轉換公式很多,以下取轉換後為0~255的一種,小數部分無條件捨去。

此公式較為對稱,且符合原始YCbCr定義



但稍微修改係數,可避免RGB出現負數,簡化轉換程式

R = 1*Y +                               + 1.398*(Cr-128)

G = 1*Y - 0.34414*(Cb-128) - 0.71414*(Cr-128)

B = 1*Y + 1.749*(Cb-128)

移8位元,計算完除256,以下列係數,值在0~255

Y   =   77*R + 150*G +  29*B

Cb =  -43*R -   84*G + 128*B + 128*256

Cr  = 128*R - 107*G -   21*B + 128*256

R = 256*Y                         + 357*(Cr-128)

G = 256*Y -    88*(Cb-128) -183*(Cr-128)

B = 256*Y + 447*(Cb-128)



以下使用matlab程式,首先驗證YCbCr444以及YCbCr422的正確性。從中間列可看出,YCbCr422一次取Cb一次取Cr。

由YCbCr444轉換回RGB後與原圖幾乎無差異,由YCbCr422轉回RGB後圖形顏色有差,但可解釋。



改為Lena人像圖測試,由YCbCr444或YCbCr422轉回幾乎無差異。



加密時,把角度0~360對應0~255,採用加法把數字加上。
因色彩取8 bits,故解密時亦採加法,加上 256-x,利用溢位的方式,即可用加法替代原先的減法解密。
加密且還原的程式如下:

%%%%% YCbCr encoder parameter
tic

Y_theta_angle  =  180;  % 0 ~ 359 
CbCr_phi_angle = 305;  % 0 ~ 359

Y_en    = round(Y_theta_angle/360*255);
CbCr_en = round(Y_theta_angle/360*255);

Y_dec    = 256 - Y_en;
CbCr_dec = 256 - CbCr_en;


R = [   0   0   0   0 255 255 255 255];
G = [   0   0 255 255   0   0 255 255];
B = [   0 255   0 255   0 255   0 255];

% RGB = cat(3, R, G, B);

 RGB = imread('lena.jpg');
% RGB = imread('baboon.png');
 
R = single(RGB(:, :, 1));
G = single(RGB(:, :, 2));
B = single(RGB(:, :, 3));


%%%% generate YCbCr444

Y_444  = floor((( 77*R + 150*G +  29*B))/256)      ;
Cb_444 = floor(((-43*R -  84*G + 128*B))/256) + 128;
Cr_444 = floor(((128*R - 107*G -  21*B))/256) + 128;

%%%% restore from YCbCr444

R_444 = Y_444 + floor((                   357*(Cr_444-128))/256);
G_444 = Y_444 + floor((-88*(Cb_444-128) - 183*(Cr_444-128))/256);
B_444 = Y_444 + floor((447*(Cb_444-128)                   )/256);

%{
%%%% generate YCbCr422
Y_422 = Y_444;
[M, N] = size(Y_422);
CbCr_422 = [];

for i = 1: 2: N
  CbCr_422 = [CbCr_422 Cb_444(:, i)];
  CbCr_422 = [CbCr_422 Cr_444(:, i+1)];
end

%%%% restore from YCbCr422

Cb_422 = [];
Cr_422 = [];

for i = 1: 2: N
  Cb_422 = [Cb_422 CbCr_422(:, i)   CbCr_422(:, i)  ];
  Cr_422 = [Cr_422 CbCr_422(:, i+1) CbCr_422(:, i+1)];
end

R_422 = Y_422 + floor((                   357*(Cr_422-128))/256);
G_422 = Y_422 + floor((-88*(Cb_422-128) - 183*(Cr_422-128))/256);
B_422 = Y_422 + floor((447*(Cb_422-128)                   )/256);

%}

%%%% generate YCbCr422
[M, N] = size(Y_444);
Y_422    = zeros(M,N);
CbCr_422 = zeros(M,N);

for i = 1: M
  for j = 1: N
    
    Y_422(i,j) = Y_444(i,j) + Y_en;
    if (Y_422(i,j)>255)
      Y_422(i,j) = Y_422(i,j) - 256;
    endif

    if ( mod(j,2)==1)
      CbCr_422(i,j) = Cb_444(i,j) + CbCr_en;
    else
      CbCr_422(i,j) = Cr_444(i,j) + CbCr_en;
    endif

    if (CbCr_422(i,j)>255)
      CbCr_422(i,j) = CbCr_422(i,j) - 256;
    endif    
    
  endfor
endfor

%%%% restore from YCbCr422

Cb_422 = [];
Cr_422 = [];

for i = 1: 2: N
  Cb_422 = [Cb_422 CbCr_422(:, i)   CbCr_422(:, i)  ];
  Cr_422 = [Cr_422 CbCr_422(:, i+1) CbCr_422(:, i+1)];
end

Y_422d  = Y_422;
Cb_422d = Cb_422;
Cr_422d = Cr_422;

for i = 1: M
  for j = 1: N
    
    Y_422d(i,j) = Y_422(i,j) + Y_dec;
    if (Y_422d(i,j)>255)
      Y_422d(i,j) = Y_422d(i,j) - 256;
    endif

    Cb_422d(i,j) = Cb_422(i,j) + CbCr_dec;
    if (Cb_422d(i,j)>255)
      Cb_422d(i,j) = Cb_422d(i,j) - 256;
    endif
    
    Cr_422d(i,j) = Cr_422(i,j) + CbCr_dec;
    if (Cr_422d(i,j)>255)
      Cr_422d(i,j) = Cr_422d(i,j) - 256;
    endif
   
  endfor
endfor



R_422d = Y_422d + floor((                    357*(Cr_422d-128))/256);
G_422d = Y_422d + floor((-88*(Cb_422d-128) - 183*(Cr_422d-128))/256);
B_422d = Y_422d + floor((447*(Cb_422d-128)                    )/256);

R_422 = Y_422 + floor((                    357*(Cr_422-128))/256);
G_422 = Y_422 + floor((-88*(Cb_422-128) - 183*(Cr_422-128))/256);
B_422 = Y_422 + floor((447*(Cb_422-128)                    )/256);



subplot(3, 3, 1);
imshow(RGB);
title('oringal')

subplot(3, 3, 2);
imshow(cat(3, uint8(Y_444), uint8(Cb_444), uint8(Cr_444)))
title('YCbCr444')

subplot(3, 3, 5);
imshow( [uint8(Y_444); uint8(Cb_444); uint8(Cr_444)])
title('YCbCr444')

subplot(3, 3, 8);
imshow(cat(3, uint8(R_444), uint8(G_444), uint8(B_444)))
title('YCbCr444 => RGB')

subplot(3, 3, 3);
imshow(cat(3, uint8(Y_422), uint8(Cb_422), uint8(Cr_422)))
title('YCbCr422')

subplot(3, 3, 6);
imshow( cat(3, uint8(R_422), uint8(G_422), uint8(B_422)))
title('YCbCr422')

subplot(3, 3, 9);
imshow(cat(3, uint8(R_422d), uint8(G_422d), uint8(B_422d)))
title('YCbCr422 => RGB')

toc

結果如下:



圖 左上為正確YCbCr444,左下為還原圖;右上為加密的YCbCr422,右中為加密還原的RGB,右下為正確解密還原的RGB

圖 左上為正確YCbCr444,左下為還原圖;右上為加密的YCbCr422,右中為加密還原的RGB,右下為正確解密還原的RGB。不同參數的結果

圖 左上為正確YCbCr444,左下為還原圖;右上為加密的YCbCr422,右中為加密還原的RGB,右下為正確解密還原的RGB








2023年8月10日 星期四

Lichee Tang Nano 4K FPGA 開發板

開發板介紹 Gowin網頁
http://www.gowinsemi.com.cn/clients_view.aspx?TypeId=21&Id=957&FId=t19:21:19

WiKi網頁 (原廠?)
https://wiki.sipeed.com/hardware/zh/tang/Tang-Nano-4K/Nano-4K.html

軟體下載
http://www.gowinsemi.com.cn/faq.aspx

有FPGA和MCU兩個軟體需下載,參考下面安裝指南

安裝指南
https://blog.51cto.com/u_15468736/5926584

教破解license的方法
http://bbs.eeworld.com.cn/thread-1188683-1-1.html

FPGA編譯燒錄基本操作
https://blog.51cto.com/u_15468736/5807065?articleABtest=1

高雲IP使用,以及使用這些IP時的ModelSim模擬方式
https://blog.51cto.com/u_15468736/5979151?articleABtest=1

內建邏輯分析儀(類似SignalTap)
https://blog.51cto.com/u_15468736/5807063?articleABtest=1 

軟硬整合:ARM Cortex-M3的呼叫與使用
https://blog.51cto.com/u_15468736/5807064

FPGA硬核與軟核區別
https://mp.weixin.qq.com/s/Y2cHZ6VYFngVPwO9upr69g

2023年7月15日 星期六

量子邏輯閘 模擬 數位邏輯閘

Hadamard Gate:若是由0|>或1|>開始,經過Hadamard Gate後可用來產生0和1位元,機率各為1/2;原則上等效於由+|>或-|>開始

AND: 可利用CNOT的糾纏態

OR: 在同一位元的所有輸出即為OR,相當於wired or的功能

1 bit

NOT: CNOT + X




2 bit
AND: CCNOT









NAND: CCNOT+X








OR: NAND的反相

 or q[2] = q[0] or q[1] or q[1]q[0]





NOR:



or





XOR:






XNOR: