USTC-RVSoC/FPGA-Nexys4/Nexys4_USTCRVSoC_top.sv
WangXuan95 7b3af4c460 update
2022-04-07 17:12:33 +08:00

96 lines
3.5 KiB
Systemverilog

module Nexys4_USTCRVSoC_top(
input logic CLK100MHZ,
output logic [2:0] LED,
output logic UART_TX,
input logic UART_RX,
output logic VGA_HS, VGA_VS,
output logic [3:0] VGA_R, VGA_G, VGA_B
);
logic clk; // 50MHz, SoC driving clock, generated by MMCM
// Show UART on LED2, LED1
assign LED[2:1] = ~{UART_RX, UART_TX};
// VGA assignment
logic vga_red, vga_green, vga_blue;
assign VGA_R = {4{vga_red}};
assign VGA_G = {4{vga_green}};
assign VGA_B = {4{vga_blue}};
//------------------------------------------------------------------------------------------------------
// SoC
//------------------------------------------------------------------------------------------------------
soc_top #(
.UART_RX_CLK_DIV ( 108 ), // 50MHz/4/115200 = 108
.UART_TX_CLK_DIV ( 434 ), // 50MHz/1/115200 = 434
.VGA_CLK_DIV ( 1 )
) soc_i (
.clk ( clk ),
.isp_uart_rx ( UART_RX ),
.isp_uart_tx ( UART_TX ),
.vga_hsync ( VGA_HS ),
.vga_vsync ( VGA_VS ),
.vga_red ( vga_red ),
.vga_green ( vga_green ),
.vga_blue ( vga_blue )
);
//------------------------------------------------------------------------------------------------------
// MMCM primitive, generate SoC driving clock, equivalent to clock wizard IP
//------------------------------------------------------------------------------------------------------
wire clkin_buf, clkfb, clkfb_buf, clkout_unbuf;
BUFG bufg_clkin ( .O(clkin_buf), .I(CLK100MHZ) );
BUFG bufg_clkfb ( .O(clkfb_buf), .I(clkfb) );
BUFG bufg_clkout ( .O(clk), .I(clkout_unbuf) );
MMCME2_ADV #(
.BANDWIDTH ( "HIGH" ),
.CLKOUT4_CASCADE ( "FALSE" ),
.COMPENSATION ( "ZHOLD" ),
.STARTUP_WAIT ( "FALSE" ),
.DIVCLK_DIVIDE ( 1 ),
.CLKFBOUT_MULT_F ( 8.000 ), // f(clkfb) = f(clkin) * 8
.CLKFBOUT_PHASE ( 0.000 ),
.CLKFBOUT_USE_FINE_PS( "FALSE" ),
.CLKOUT0_DIVIDE_F ( 16.000 ), // f(clkout) = f(clkfb) / 16
.CLKOUT0_PHASE ( 0.000 ),
.CLKOUT0_DUTY_CYCLE ( 0.500 ),
.CLKOUT0_USE_FINE_PS ( "FALSE" ),
.CLKIN1_PERIOD ( 10.000 ) // T=10ns, f=100MHz
) mmcm_adv_i (
.CLKFBOUT ( clkfb ),
.CLKFBOUTB ( ),
.CLKOUT0 ( clkout_unbuf ),
.CLKOUT0B(), .CLKOUT1(), .CLKOUT1B(), .CLKOUT2(), .CLKOUT2B(), .CLKOUT3(), .CLKOUT3B(), .CLKOUT4(), .CLKOUT5(), .CLKOUT6(),
.CLKFBIN ( clkfb_buf ),
.CLKIN1 ( clkin_buf ),
.CLKIN2 ( 1'b0 ),
.CLKINSEL ( 1'b1 ),
.DADDR ( 7'h0 ),
.DCLK ( 1'b0 ),
.DEN ( 1'b0 ),
.DI ( 16'h0 ),
.DO ( ),
.DRDY ( ),
.DWE ( 1'b0 ),
.PSCLK ( 1'b0 ),
.PSEN ( 1'b0 ),
.PSINCDEC ( 1'b0 ),
.PSDONE ( ),
.LOCKED ( LED[0] ),
.CLKINSTOPPED ( ),
.CLKFBSTOPPED ( ),
.PWRDWN ( 1'b0 ),
.RST ( 1'b0 )
);
endmodule