aboutsummaryrefslogtreecommitdiff
path: root/lab7bonus_top.sv
diff options
context:
space:
mode:
Diffstat (limited to 'lab7bonus_top.sv')
-rw-r--r--lab7bonus_top.sv90
1 files changed, 90 insertions, 0 deletions
diff --git a/lab7bonus_top.sv b/lab7bonus_top.sv
new file mode 100644
index 0000000..d76cf7c
--- /dev/null
+++ b/lab7bonus_top.sv
@@ -0,0 +1,90 @@
+`define MNONE 2'b00
+`define MREAD 2'b01
+`define MWRITE 2'b10
+
+module lab7bonus_top(KEY,SW,LEDR,HEX0,HEX1,HEX2,HEX3,HEX4,HEX5);
+ input [3:0] KEY;
+ input [9:0] SW;
+ output reg [9:0] LEDR;
+ output [6:0] HEX0, HEX1, HEX2, HEX3, HEX4, HEX5;
+
+ reg [8:0] mem_addr;
+ reg [7:0] read_address, write_address, next_LEDR, onto_LEDR;
+ reg write, enable;
+ reg [15:0] dout, din, read_data, write_data, ir;
+ wire [1:0] mem_cmd;
+ reg msel;
+ wire N, V, Z;
+
+
+ RAM MEM(.clk (~KEY[0]),
+ .read_address (read_address),
+ .write_address (write_address),
+ .write (write),
+ .din (din),
+ .dout (dout)
+ );
+
+ cpu CPU(.clk (~KEY[0]),
+ .reset (~KEY[1]),
+ .read_data (read_data),
+ .write_data(write_data),
+ .mem_addr(mem_addr),
+ .mem_cmd(mem_cmd),
+ .N(N),
+ .V(V),
+ .Z(Z)
+ );
+
+
+ always_comb begin
+
+ msel = mem_addr[8]; //checks the last bit to check the indicated address. 0 would mean below 255 and 1 would mean abouve 256
+ write = ({mem_cmd, msel} == {`MWRITE, 1'b0}); //write choosing
+ enable = ({mem_cmd, msel} == {`MREAD, 1'b0}); //the and gates and stuff
+
+ write_address = mem_addr[7:0];
+ read_address = mem_addr[7:0];
+ din = write_data;
+
+ read_data = enable ? dout : {16{1'bz}}; //tri-state driver
+
+ if ({mem_addr, mem_cmd} == {9'h140, `MREAD}) read_data = {8'b0, SW[7:0]}; //desing own logic this reads the switches if mem_cmd and addr are according
+ else read_data = read_data;
+
+ if ({mem_addr, mem_cmd} == {9'h100, `MWRITE}) next_LEDR = write_data[7:0]; //design own logic this writes to the switches if mem_cmd and addr are according
+ else next_LEDR = 8'bx;;
+
+ end
+
+ always_ff @(posedge ~KEY[0]) begin
+ LEDR[7:0] = next_LEDR;
+ end
+
+endmodule
+
+
+// Ram block obtained form slide set 11
+module RAM(clk,read_address,write_address,write,din,dout);
+ parameter data_width = 16;
+ parameter addr_width = 8;
+ parameter filename = "data.txt";
+
+ input clk;
+ input [addr_width-1:0] read_address, write_address;
+ input write;
+ input [data_width-1:0] din;
+ output [data_width-1:0] dout;
+ reg [data_width-1:0] dout;
+
+ reg [data_width-1:0] mem [2**addr_width-1:0];
+
+ initial $readmemb(filename, mem);
+
+ always @ (posedge clk) begin
+ if (write)
+ mem[write_address] <= din;
+ dout <= mem[read_address]; // dout doesn't get din in this clock cycle
+ // (this is due to Verilog non-blocking assignment "<=")
+ end
+endmodule