LRC
2025年4月6日 星期日
2025年3月10日 星期一
CGD_100_IO 的實體腳位約束檔設定,以及測試檔
CGD_100_IO
以下有兩個檔案 CGD_100_IO.v 和腳位檔
CGD_100_IO.v
- module CDG_100_IO (
- input clk_50M,
- input [8:1] iKEY_n,
- input [4:1] iSW,
- output [8:1] oLED, // blue LED
- output [2:0] oGYR1_n, oGYR2_n, oGYR3_n, oGYR4_n, // GYR color LED
- output [7:0] oSEG, // drive 7 segment display
- output [3:0] oSEG_s // select 7 segment display
- );
- reg [25:0] cn;
- always @(posedge clk_50M)
- begin
- cn <= cn+1;
- end
- // input [8:1] key;
- // output [8:1] led;
- // assign oLED = ~iKEY_n;
- assign oLED = {iSW[4],iSW[4],iSW[3],iSW[3],iSW[2],iSW[2],iSW[1],iSW[1]};
- assign oGYR1_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};
- assign oGYR2_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};
- assign oGYR3_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};
- assign oGYR4_n = {iKEY_n[3],iKEY_n[2],iKEY_n[1]};
- assign oSEG_s = {~iSW[4], ~iSW[3], ~iSW[2], ~iSW[1]};
- assign oSEG = iKEY_n;
- 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日 星期一
2024年5月28日 星期二
生成verilog Look-Up Table (case) module 的matlab程式
matlab程式如下,ibright為Look-Up Table變數輸入,obright為Look-Up Table變數輸出
11~14行為LUT,xy對應的方程式在第12行
- % 開啟檔案以寫入
- fileID = fopen('contrast.v', 'w');
- % 寫入檔案內容
- fprintf(fileID, 'module contrast(\n\tibright,\n\tobright\n);\n\n');
- fprintf(fileID, 'input\t\t\t[7:0]\tibright;\n');
- fprintf(fileID, 'output reg\t[7:0]\tobright;\n\n');
- fprintf(fileID, 'always @(ibright)\n\tbegin\n\t\tcase(ibright)\n');
- % 生成從 0 到 255 的數值和對應的 nn 值
- for x = 0:255
- y = floor(96*( (x-128)/128)^3 + 96 ); % equation
- fprintf(fileID, '\t\t8''d%03d: obright = %03d;\t//\n', x, y);
- end
- % 完成 case 和模組結束部分
- fprintf(fileID, '\t\tendcase\n\tend\nendmodule\n');
- % 關閉檔案
- fclose(fileID);
- disp('檔案 contrast.v 已生成');
為減少延遲,本例未使用clock
- contrast u(
- .ibright(gray),
- .obright(gray_contrast)
- );
- module contrast(
- ibright,
- obright
- );
- input [7:0] ibright;
- output reg [7:0] obright;
- always @(ibright)
- begin
- case(ibright)
- 8'd000: obright = 000; //
- 8'd001: obright = 002; //
- 8'd002: obright = 004; //
- 8'd003: obright = 006; //
- 8'd004: obright = 008; //
- 8'd005: obright = 010; //
- 8'd006: obright = 012; //
- 8'd007: obright = 014; //
- 8'd008: obright = 016; //
- 8'd009: obright = 018; //
- 8'd010: obright = 020; //
- 8'd011: obright = 022; //
- 8'd012: obright = 024; //
- 8'd013: obright = 026; //
- 8'd014: obright = 028; //
- 8'd015: obright = 029; //
- 8'd016: obright = 031; //
- 8'd017: obright = 033; //
- 8'd018: obright = 035; //
- 8'd019: obright = 036; //
- 8'd020: obright = 038; //
- 8'd021: obright = 039; //
- 8'd022: obright = 041; //
- 8'd023: obright = 043; //
- 8'd024: obright = 044; //
- 8'd025: obright = 045; //
- 8'd026: obright = 047; //
- 8'd027: obright = 048; //
- 8'd028: obright = 050; //
- 8'd029: obright = 051; //
- 8'd030: obright = 052; //
- 8'd031: obright = 054; //
- 8'd032: obright = 055; //
- 8'd033: obright = 056; //
- 8'd034: obright = 057; //
- 8'd035: obright = 059; //
- 8'd036: obright = 060; //
- 8'd037: obright = 061; //
- 8'd038: obright = 062; //
- 8'd039: obright = 063; //
- 8'd040: obright = 064; //
- 8'd041: obright = 065; //
- 8'd042: obright = 066; //
- 8'd043: obright = 067; //
- 8'd044: obright = 068; //
- 8'd045: obright = 069; //
- 8'd046: obright = 070; //
- 8'd047: obright = 071; //
- 8'd048: obright = 072; //
- 8'd049: obright = 073; //
- 8'd050: obright = 074; //
- 8'd051: obright = 075; //
- 8'd052: obright = 075; //
- 8'd053: obright = 076; //
- 8'd054: obright = 077; //
- 8'd055: obright = 078; //
- 8'd056: obright = 078; //
- 8'd057: obright = 079; //
- 8'd058: obright = 080; //
- 8'd059: obright = 080; //
- 8'd060: obright = 081; //
- 8'd061: obright = 082; //
- 8'd062: obright = 082; //
- 8'd063: obright = 083; //
- 8'd064: obright = 084; //
- 8'd065: obright = 084; //
- 8'd066: obright = 085; //
- 8'd067: obright = 085; //
- 8'd068: obright = 086; //
- 8'd069: obright = 086; //
- 8'd070: obright = 087; //
- 8'd071: obright = 087; //
- 8'd072: obright = 087; //
- 8'd073: obright = 088; //
- 8'd074: obright = 088; //
- 8'd075: obright = 089; //
- 8'd076: obright = 089; //
- 8'd077: obright = 089; //
- 8'd078: obright = 090; //
- 8'd079: obright = 090; //
- 8'd080: obright = 090; //
- 8'd081: obright = 091; //
- 8'd082: obright = 091; //
- 8'd083: obright = 091; //
- 8'd084: obright = 092; //
- 8'd085: obright = 092; //
- 8'd086: obright = 092; //
- 8'd087: obright = 092; //
- 8'd088: obright = 093; //
- 8'd089: obright = 093; //
- 8'd090: obright = 093; //
- 8'd091: obright = 093; //
- 8'd092: obright = 093; //
- 8'd093: obright = 094; //
- 8'd094: obright = 094; //
- 8'd095: obright = 094; //
- 8'd096: obright = 094; //
- 8'd097: obright = 094; //
- 8'd098: obright = 094; //
- 8'd099: obright = 094; //
- 8'd100: obright = 094; //
- 8'd101: obright = 095; //
- 8'd102: obright = 095; //
- 8'd103: obright = 095; //
- 8'd104: obright = 095; //
- 8'd105: obright = 095; //
- 8'd106: obright = 095; //
- 8'd107: obright = 095; //
- 8'd108: obright = 095; //
- 8'd109: obright = 095; //
- 8'd110: obright = 095; //
- 8'd111: obright = 095; //
- 8'd112: obright = 095; //
- 8'd113: obright = 095; //
- 8'd114: obright = 095; //
- 8'd115: obright = 095; //
- 8'd116: obright = 095; //
- 8'd117: obright = 095; //
- 8'd118: obright = 095; //
- 8'd119: obright = 095; //
- 8'd120: obright = 095; //
- 8'd121: obright = 095; //
- 8'd122: obright = 095; //
- 8'd123: obright = 095; //
- 8'd124: obright = 095; //
- 8'd125: obright = 095; //
- 8'd126: obright = 095; //
- 8'd127: obright = 095; //
- 8'd128: obright = 096; //
- 8'd129: obright = 096; //
- 8'd130: obright = 096; //
- 8'd131: obright = 096; //
- 8'd132: obright = 096; //
- 8'd133: obright = 096; //
- 8'd134: obright = 096; //
- 8'd135: obright = 096; //
- 8'd136: obright = 096; //
- 8'd137: obright = 096; //
- 8'd138: obright = 096; //
- 8'd139: obright = 096; //
- 8'd140: obright = 096; //
- 8'd141: obright = 096; //
- 8'd142: obright = 096; //
- 8'd143: obright = 096; //
- 8'd144: obright = 096; //
- 8'd145: obright = 096; //
- 8'd146: obright = 096; //
- 8'd147: obright = 096; //
- 8'd148: obright = 096; //
- 8'd149: obright = 096; //
- 8'd150: obright = 096; //
- 8'd151: obright = 096; //
- 8'd152: obright = 096; //
- 8'd153: obright = 096; //
- 8'd154: obright = 096; //
- 8'd155: obright = 096; //
- 8'd156: obright = 097; //
- 8'd157: obright = 097; //
- 8'd158: obright = 097; //
- 8'd159: obright = 097; //
- 8'd160: obright = 097; //
- 8'd161: obright = 097; //
- 8'd162: obright = 097; //
- 8'd163: obright = 097; //
- 8'd164: obright = 098; //
- 8'd165: obright = 098; //
- 8'd166: obright = 098; //
- 8'd167: obright = 098; //
- 8'd168: obright = 098; //
- 8'd169: obright = 099; //
- 8'd170: obright = 099; //
- 8'd171: obright = 099; //
- 8'd172: obright = 099; //
- 8'd173: obright = 100; //
- 8'd174: obright = 100; //
- 8'd175: obright = 100; //
- 8'd176: obright = 101; //
- 8'd177: obright = 101; //
- 8'd178: obright = 101; //
- 8'd179: obright = 102; //
- 8'd180: obright = 102; //
- 8'd181: obright = 102; //
- 8'd182: obright = 103; //
- 8'd183: obright = 103; //
- 8'd184: obright = 104; //
- 8'd185: obright = 104; //
- 8'd186: obright = 104; //
- 8'd187: obright = 105; //
- 8'd188: obright = 105; //
- 8'd189: obright = 106; //
- 8'd190: obright = 106; //
- 8'd191: obright = 107; //
- 8'd192: obright = 108; //
- 8'd193: obright = 108; //
- 8'd194: obright = 109; //
- 8'd195: obright = 109; //
- 8'd196: obright = 110; //
- 8'd197: obright = 111; //
- 8'd198: obright = 111; //
- 8'd199: obright = 112; //
- 8'd200: obright = 113; //
- 8'd201: obright = 113; //
- 8'd202: obright = 114; //
- 8'd203: obright = 115; //
- 8'd204: obright = 116; //
- 8'd205: obright = 116; //
- 8'd206: obright = 117; //
- 8'd207: obright = 118; //
- 8'd208: obright = 119; //
- 8'd209: obright = 120; //
- 8'd210: obright = 121; //
- 8'd211: obright = 122; //
- 8'd212: obright = 123; //
- 8'd213: obright = 124; //
- 8'd214: obright = 125; //
- 8'd215: obright = 126; //
- 8'd216: obright = 127; //
- 8'd217: obright = 128; //
- 8'd218: obright = 129; //
- 8'd219: obright = 130; //
- 8'd220: obright = 131; //
- 8'd221: obright = 132; //
- 8'd222: obright = 134; //
- 8'd223: obright = 135; //
- 8'd224: obright = 136; //
- 8'd225: obright = 137; //
- 8'd226: obright = 139; //
- 8'd227: obright = 140; //
- 8'd228: obright = 141; //
- 8'd229: obright = 143; //
- 8'd230: obright = 144; //
- 8'd231: obright = 146; //
- 8'd232: obright = 147; //
- 8'd233: obright = 148; //
- 8'd234: obright = 150; //
- 8'd235: obright = 152; //
- 8'd236: obright = 153; //
- 8'd237: obright = 155; //
- 8'd238: obright = 156; //
- 8'd239: obright = 158; //
- 8'd240: obright = 160; //
- 8'd241: obright = 162; //
- 8'd242: obright = 163; //
- 8'd243: obright = 165; //
- 8'd244: obright = 167; //
- 8'd245: obright = 169; //
- 8'd246: obright = 171; //
- 8'd247: obright = 173; //
- 8'd248: obright = 175; //
- 8'd249: obright = 177; //
- 8'd250: obright = 179; //
- 8'd251: obright = 181; //
- 8'd252: obright = 183; //
- 8'd253: obright = 185; //
- 8'd254: obright = 187; //
- 8'd255: obright = 189; //
- endcase
- end
- 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後圖形顏色有差,但可解釋。
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