135 lines
3.1 KiB
Coq
135 lines
3.1 KiB
Coq
![]() |
module ram0(
|
||
|
// Write port
|
||
|
input wrclk,
|
||
|
input [15:0] di,
|
||
|
input wren,
|
||
|
input [9:0] wraddr,
|
||
|
// Read port
|
||
|
input rdclk,
|
||
|
input rden,
|
||
|
input [9:0] rdaddr,
|
||
|
output reg [15:0] do);
|
||
|
|
||
|
(* ram_style = "block" *) reg [15:0] ram[0:1023];
|
||
|
|
||
|
initial begin
|
||
|
ram[0] = 16'b00000000_00000001;
|
||
|
ram[1] = 16'b10101010_10101010;
|
||
|
ram[2] = 16'b01010101_01010101;
|
||
|
ram[3] = 16'b11111111_11111111;
|
||
|
ram[4] = 16'b11110000_11110000;
|
||
|
ram[5] = 16'b00001111_00001111;
|
||
|
ram[6] = 16'b11001100_11001100;
|
||
|
ram[7] = 16'b00110011_00110011;
|
||
|
ram[8] = 16'b00000000_00000010;
|
||
|
ram[9] = 16'b00000000_00000100;
|
||
|
end
|
||
|
|
||
|
always @ (posedge wrclk) begin
|
||
|
if(wren == 1) begin
|
||
|
ram[wraddr] <= di;
|
||
|
end
|
||
|
end
|
||
|
|
||
|
always @ (posedge rdclk) begin
|
||
|
if(rden == 1) begin
|
||
|
do <= ram[rdaddr];
|
||
|
end
|
||
|
end
|
||
|
|
||
|
endmodule
|
||
|
|
||
|
module top (
|
||
|
input wire clk,
|
||
|
|
||
|
input wire rx,
|
||
|
output wire tx,
|
||
|
|
||
|
input wire [15:0] sw,
|
||
|
output wire [15:0] led
|
||
|
);
|
||
|
wire rden;
|
||
|
reg wren;
|
||
|
wire [9:0] rdaddr;
|
||
|
wire [9:0] wraddr;
|
||
|
wire [15:0] di;
|
||
|
wire [15:0] do;
|
||
|
ram0 ram(
|
||
|
.wrclk(clk),
|
||
|
.di(di),
|
||
|
.wren(wren),
|
||
|
.wraddr(wraddr),
|
||
|
.rdclk(clk),
|
||
|
.rden(rden),
|
||
|
.rdaddr(rdaddr),
|
||
|
.do(do)
|
||
|
);
|
||
|
|
||
|
reg [9:0] address_reg;
|
||
|
reg [15:0] data_reg;
|
||
|
reg [15:0] out_reg;
|
||
|
|
||
|
assign rdaddr = address_reg;
|
||
|
assign wraddr = address_reg;
|
||
|
|
||
|
// display_mode == 00 -> ram[address_reg]
|
||
|
// display_mode == 01 -> address_reg
|
||
|
// display_mode == 10 -> data_reg
|
||
|
wire [1:0] display_mode;
|
||
|
|
||
|
// input_mode == 00 -> in[9:0] -> address_reg
|
||
|
// input_mode == 01 -> in[7:0] -> data_reg[7:0]
|
||
|
// input_mode == 10 -> in[7:0] -> data_reg[15:8]
|
||
|
// input_mode == 11 -> data_reg -> ram[address_reg]
|
||
|
wire [1:0] input_mode;
|
||
|
|
||
|
// WE == 0 -> address_reg and data_reg unchanged.
|
||
|
// WE == 1 -> address_reg or data_reg is updated because on input_mode.
|
||
|
wire we;
|
||
|
|
||
|
assign display_mode[0] = sw[14];
|
||
|
assign display_mode[1] = sw[15];
|
||
|
|
||
|
assign input_mode[0] = sw[12];
|
||
|
assign input_mode[1] = sw[13];
|
||
|
|
||
|
assign we = sw[11];
|
||
|
assign led = out_reg;
|
||
|
assign di = data_reg;
|
||
|
assign rden = 1;
|
||
|
|
||
|
initial begin
|
||
|
address_reg = 10'b0;
|
||
|
data_reg = 16'b0;
|
||
|
out_reg = 16'b0;
|
||
|
end
|
||
|
|
||
|
always @ (posedge clk) begin
|
||
|
if(display_mode == 0) begin
|
||
|
out_reg <= do;
|
||
|
end else if(display_mode == 1) begin
|
||
|
out_reg <= address_reg;
|
||
|
end else if(display_mode == 2) begin
|
||
|
out_reg <= data_reg;
|
||
|
end
|
||
|
|
||
|
if(we == 1) begin
|
||
|
if(input_mode == 0) begin
|
||
|
address_reg <= sw[9:0];
|
||
|
wren <= 0;
|
||
|
end else if(input_mode == 1) begin
|
||
|
data_reg[7:0] <= sw[7:0];
|
||
|
wren <= 0;
|
||
|
end else if(input_mode == 2) begin
|
||
|
data_reg[15:8] <= sw[7:0];
|
||
|
wren <= 0;
|
||
|
end else if(input_mode == 3) begin
|
||
|
wren <= 1;
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
// Uart loopback
|
||
|
assign tx = rx;
|
||
|
endmodule
|