Untitled
unknown
plain_text
3 years ago
3.8 kB
8
Indexable
`timescale 1ns / 1ps
`default_nettype none
module top_level( input wire clk_100mhz,
input wire btnd,btnc,
input wire ps2_clk,
input wire ps2_data,
output logic [15:0] led,
output logic ca, cb, cc, cd, ce, cf, cg,
output logic [7:0] an
);
/* have btnd control system reset */
logic sys_rst;
assign sys_rst = btnd;
/* TODO: you will write this in
* part 3 of the lab from scratch@
*/
logic [7:0] ps2_buffer [3:0];
logic [7:0] ps2_code;
logic ps2_valid;
/* how many button presses have we seen so far?
* wire this up to the LED display
*/
logic [15:0] btn_count;
//assign led = btn_count; //uncomment to display btn_count on led
assign led = {ps2_buffer[1], ps2_buffer[0]}; //for test bench purposes
/* this should go high for one cycle on the
* rising edge of the (debounced) button output
*/
logic btn_pulse;
/* debouncer for the button. we wrote this
* in lecture together.
* TODO: make a variable for the debounced
* button output, and feed it into your edge
* detector
*/
logic btnc_out;
debouncer btnc_db(.clk_in(clk_100mhz),
.rst_in(sys_rst),
.dirty_in(btnc),
.clean_out(btnc_out));
/* TODO: write your edge detector for part 1 of the
* lab here!
*/
edge_detector edge_1 (.clk_in(clk_100mhz),
.evt_in(btnc_out),
.evt_out(btn_pulse));
/* the button-press counter.
* TODO: finish this during part 1 of the lab
*/
simple_counter msc( .clk_in(clk_100mhz),
.rst_in(sys_rst),
.evt_in(btn_pulse),
.count_out(btn_count));
/* TODO: you'll finish this in part 2 of the lab. this will
* render the button count and the four PS/2 buffer
* values in parts 2 and 3 respectively
*/
/* For part 1 of the lab, you won't use this yet! So leave
* this commented out unless you want errors hehe
*/
seven_segment_controller mssc(.clk_in(clk_100mhz),
.rst_in(sys_rst),
.val_in({ps2_buffer[3], ps2_buffer[2], ps2_buffer[1], ps2_buffer[0]}),
//.val_in(btn_count),
.cat_out({cg, cf, ce, cd, cc, cb, ca}),
.an_out(an));
/* Delete this once you're done with part 2 of the lab */
// assign {cg, cf, ce, cd, cc, cb, ca} = 8'b0;
// assign an = 8'b1111_1111;
/* pull inputs from the ~15KHz PS/2 domain
* our FPGA's 100 MHz clock domain. this code
* acts as a 'synchronizer' - we will talk more
* about this later. for now, don't change it
*/
logic [1:0] ps2b_c;
logic [1:0] ps2b_d;
always_ff @(posedge clk_100mhz)begin
ps2b_c[0] <= ps2_clk;
ps2b_d[0] <= ps2_data;
ps2b_c[1] <= ps2b_c[0];
ps2b_d[1] <= ps2b_d[0];
end
always_ff @(posedge clk_100mhz) begin
if (ps2b_c[0] == 1'b0 && ps2b_c[1] == 1'b1) begin
if (ps2_valid == 1'b1 || ps2_code == 8'h00) begin
ps2_buffer[0] <= ps2_code;
ps2_buffer[1] <= ps2_buffer[0];
ps2_buffer[2] <= ps2_buffer[1];
ps2_buffer[3] <= ps2_buffer[2];
end else begin
end
end else begin
end
end
/* Leave this commented out until you get to part 3
* unless you would like to see more errors...
*/
ps2_decoder mpd (.clk_in(clk_100mhz),
.rst_in(sys_rst),
.ps_data_in(ps2b_d[1]),
.ps_clk_in(ps2b_c[1]),
.code_out(ps2_code),
.code_valid_out(ps2_valid));
endmodule
`default_nettype noneEditor is loading...