# Purely handwritten Verilog Risc-V MM-SoC on cheap FPGAs with verification
有些東西先用中文更新...
## datasheet
目標:lite版本可以啟動最基礎的linux,200T版本可以執行片上影像辨識。
CPU部分通過VCS+Verdi仿真後,需要用
### IP & PORTS:
- UART :accept:
- SPI :name_badge:
- ETH:name_badge:
- HDMI:accept:
- CPU(ver 3_stages and ver 5_stages) :accept:
- AXI BUS :name_badge:
### Lite ver & Pro ver platfrom
- Main : GoWin 20K
- Pro : ARTY A7 200T(with out_of_order_SoC)
## [UART](https://github.com/Chiwawachiwawa/NCKUES_MMSoC_Class_UART)(RS232_loop)
I use CH340 to turn USB signals from PC to my UART IP on FPGA.
#### how to solve CDC issue on UART?
let student know more about CDC issues
![UART_SCH](https://hackmd.io/_uploads/B1zIQtDnp.png)
## HDMI(without audio)
![HD](https://hackmd.io/_uploads/rJSrXlqcT.png)
### IP structure
#### HDMI_IP_1280*720_60fps
(you can select colorbar_mode , USB_mode , mipi_mode)
HDMI_TOP structure
![hdmi_structer](https://hackmd.io/_uploads/H19vz0jip.png)
HDMI_CTRL_STRUCTURE with TMDS_encoders
![hdmi_encoder](https://hackmd.io/_uploads/HJQvf0js6.png)
- serializer_10_to_1
![Oserdise](https://hackmd.io/_uploads/SkBBLmTsT.png)
codes:
```
module serializer_10_to_1(
input paralell_clk,
input serial_clk_5x,
input [9:0] paralell_data,
input reset,
output serial_data
);
//*****************************************************
//** main code
//*****************************************************
OSER10 u_OSER10(
.Q(serial_data),
.D0(paralell_data[0]),
.D1(paralell_data[1]),
.D2(paralell_data[2]),
.D3(paralell_data[3]),
.D4(paralell_data[4]),
.D5(paralell_data[5]),
.D6(paralell_data[6]),
.D7(paralell_data[7]),
.D8(paralell_data[8]),
.D9(paralell_data[9]),
.PCLK(paralell_clk),
.FCLK(serial_clk_5x),
.RESET(reset)
);
defparam u_OSER10.GSREN="false";
defparam u_OSER10.LSREN ="true";
endmodule
```
- GoWin Primitive codes
example
```
Verilog 例化:
TLVDS_OBUF uut(
.O(O),
.OB(OB),
.I(I)
);
```
in my case:
I want to let my 10 bit tmds data turn to
```
serializer_10_to_1 serializer_clk(
.paralell_clk (pclk),
.serial_clk_5x (pclk_x5),
.paralell_data (clk_10bit),
.reset (reset),
.serial_data (tmds_clk)
);
TLVDS_OBUF u_TLVDS_CLK(
.O (tmds_clk_p),
.OB (tmds_clk_n),
.I (tmds_clk)
);
```
![TMDS](https://hackmd.io/_uploads/rJsUQgq9a.png)
### encoderTMDS演算法實現
```
```
- driver
this IP support 2 mode if we got a cam data source,we can use this IP to display on monitor,if no,we can just use colorbar_mode.
IP final work:
![S__37945346](https://hackmd.io/_uploads/BJw4pH6jT.jpg)
little tips:why div clock to 5x but 10x?
because serializer_10_to_1 used OSER10,it got some functions like DDR,
that's whywe only div clk to 5x(5*2 = 10)!
## DDR R&W
剛開始想學主要是研究如何透過DDR來跟兩個設備進行資料的交互傳輸,這樣在後期各個 PORT 之間的通信才知道如何處理。
本次實驗採用:
NT5CC128M16JR-EKI
這款型號的晶片,因為ARTY 200T 跟我範例的晶片不同,因此這邊展示的是高雲 FPGA 的實作。
- NCKU_ES_DDR3_RW IP實驗範例:
![DDR](https://hackmd.io/_uploads/B1tXOvq3T.png)
首先我們來講一下 DDR3 IP 的參數調整(目前用的是高雲的IP),本次實驗圍繞著高雲自帶的DDR3_interface IP 來進行實作,進行封裝並達到讀寫的功能,為將來的實作所用
![DDR_interface_type](https://hackmd.io/_uploads/BJw3EZfap.png)
![DDR3_op](https://hackmd.io/_uploads/HkxaV-G66.png)
![DDR3_TM](https://hackmd.io/_uploads/SJDaEbzpp.png)
![DDR_FSM](https://hackmd.io/_uploads/r1dKrsXaa.png)
PS:高雲似乎換過DDR3的顆粒,導致規格書上的教學有問題,目前先採 xc7a200T 的平台,
NCKUES_DDR3_controller_7A200T IP
```
```
## CPU(5 and 2 stage)
#### Risc-V 5-stage CPU
![CPu](https://hackmd.io/_uploads/Sk05IqG26.png)
POWER
CPU verdi + VCS 仿真
![CPU_SIM_Done](https://hackmd.io/_uploads/HyUtQPjaT.png)
覆蓋率
![CPU_COV](https://hackmd.io/_uploads/S10F7Diap.png)
## Dual & One port ram
let student know more about CDC issues
## SD card R&W
## SD card BMP reader to HDMI
IP:SPI
EDA tools: