mirror of
https://github.com/MPSU/APS.git
synced 2025-09-16 09:40:10 +00:00
Feat(labs/03/board):Переписывание топа
This commit is contained in:
@@ -9,140 +9,156 @@ See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
|
||||
* ------------------------------------------------------------------------------
|
||||
*/
|
||||
module nexys_rf_riscv(
|
||||
input CLK100,
|
||||
input resetn,
|
||||
input BTND, BTNU, BTNL, BTNR, BTNC,
|
||||
input [15:0] SW,
|
||||
output [15:0] LED,
|
||||
output CA, CB, CC, CD, CE, CF, CG, DP,
|
||||
output [7:0] AN,
|
||||
output LED16_B, LED16_G, LED16_R, LED17_B, LED17_G, LED17_R
|
||||
);
|
||||
|
||||
wire [31:0] WD3;
|
||||
wire WE;
|
||||
wire [31:0] RD1;
|
||||
wire [31:0] RD2;
|
||||
|
||||
localparam pwm = 1000;
|
||||
reg [9:0] counter;
|
||||
reg [3:0] semseg;
|
||||
reg [7:0] ANreg;
|
||||
reg CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr;
|
||||
reg [15:0] LEDr;
|
||||
|
||||
reg [4:0] a1;
|
||||
reg [4:0] a2;
|
||||
reg [4:0] a3;
|
||||
reg [31:0] rd1;
|
||||
reg [31:0] rd2;
|
||||
|
||||
rf_riscv DUT
|
||||
(
|
||||
.clk_i (CLK100 ),
|
||||
.read_addr1_i (a1 ),
|
||||
.read_addr2_i (a2 ),
|
||||
.write_addr_i (a3 ),
|
||||
.write_data_i (WD3 ),
|
||||
.write_enable_i (WE ),
|
||||
.read_data1_o (RD1 ),
|
||||
.read_data2_o (RD2 )
|
||||
input logic clk_i,
|
||||
input logic arstn_i,
|
||||
input logic [15:0] sw_i,
|
||||
input logic btnd_i,
|
||||
input logic btnr_i,
|
||||
output logic [15:0] led_o,
|
||||
output logic ca_o,
|
||||
output logic cb_o,
|
||||
output logic cc_o,
|
||||
output logic cd_o,
|
||||
output logic ce_o,
|
||||
output logic cf_o,
|
||||
output logic cg_o,
|
||||
output logic dp_o,
|
||||
output logic [ 7:0] an_o
|
||||
);
|
||||
|
||||
assign LED = {1'b0, a1, a2, a3};
|
||||
assign AN[7:0] = ANreg[7:0];
|
||||
assign {CA, CB, CC, CD, CE, CF, CG, DP} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr};
|
||||
assign LED16_G = BTNC | BTNR;
|
||||
assign LED17_G = BTNL | BTNR;
|
||||
assign {LED16_R, LED17_R} = {2{BTND}};
|
||||
assign {LED16_B, LED17_B} = {2{BTNU}};
|
||||
logic [ 4:0] ra1;
|
||||
logic [ 4:0] ra2;
|
||||
logic [ 4:0] wa;
|
||||
logic [31:0] wd;
|
||||
logic we;
|
||||
logic [7:0][3:0] rd1;
|
||||
logic [7:0][3:0] rd2;
|
||||
|
||||
assign WD3 = 32'b0 | SW[15:0];
|
||||
assign WE = BTND;
|
||||
rf_riscv rf_riscv (
|
||||
.clk_i (clk_i),
|
||||
.read_addr1_i (ra1 ),
|
||||
.read_addr2_i (ra2 ),
|
||||
.write_addr_i (wa ),
|
||||
.write_data_i (wd ),
|
||||
.write_enable_i (we ),
|
||||
.read_data1_o (rd1 ),
|
||||
.read_data2_o (rd2 )
|
||||
);
|
||||
|
||||
function automatic logic [6:0] hex2semseg(input logic [3:0] hex);
|
||||
unique case (hex)
|
||||
4'h0: return 7'b0000001;
|
||||
4'h1: return 7'b1001111;
|
||||
4'h2: return 7'b0010010;
|
||||
4'h3: return 7'b0000110;
|
||||
4'h4: return 7'b1001100;
|
||||
4'h5: return 7'b0100100;
|
||||
4'h6: return 7'b0100000;
|
||||
4'h7: return 7'b0001111;
|
||||
4'h8: return 7'b0000000;
|
||||
4'h9: return 7'b0000100;
|
||||
4'hA: return 7'b0001000;
|
||||
4'hB: return 7'b1100000;
|
||||
4'hC: return 7'b0110001;
|
||||
4'hD: return 7'b1000010;
|
||||
4'hE: return 7'b0110000;
|
||||
4'hF: return 7'b0111000;
|
||||
endcase
|
||||
endfunction
|
||||
|
||||
always @(posedge CLK100) begin
|
||||
if (!resetn) begin
|
||||
counter <= 'b0;
|
||||
ANreg[7:0] <= 8'b11111111;
|
||||
{CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr} <= 8'b11111111;
|
||||
{a1, a2, a3} <= 'b0;
|
||||
{rd1, rd2} <= 'b0;
|
||||
end
|
||||
else begin
|
||||
if (counter < pwm) counter = counter + 'b1;
|
||||
else begin
|
||||
counter = 'b0;
|
||||
ANreg[1] <= ANreg[0];
|
||||
ANreg[2] <= ANreg[1];
|
||||
ANreg[3] <= ANreg[2];
|
||||
ANreg[4] <= ANreg[3];
|
||||
ANreg[5] <= ANreg[4];
|
||||
ANreg[6] <= ANreg[5];
|
||||
ANreg[7] <= ANreg[6];
|
||||
ANreg[0] <= !(ANreg[6:0] == 7'b1111111);
|
||||
end
|
||||
a1 <= BTNL? SW[4:0]: a1;
|
||||
a2 <= BTNC? SW[4:0]: a2;
|
||||
a3 <= BTNR? SW[4:0]: a3;
|
||||
|
||||
rd1 <= BTNU? RD1: rd1;
|
||||
rd2 <= BTNU? RD2: rd2;
|
||||
|
||||
case (1'b0)
|
||||
ANreg[0]: begin
|
||||
semseg <= (rd2) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
ANreg[1]: begin
|
||||
semseg <= (rd2 / 'h10) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
ANreg[2]: begin
|
||||
semseg <= (rd2 / 'h100) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
ANreg[3]: begin
|
||||
semseg <= (rd2 / 'h1000) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
ANreg[4]: begin
|
||||
semseg <= (rd1) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
ANreg[5]: begin
|
||||
semseg <= (rd1 / 'h10) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
ANreg[6]: begin
|
||||
semseg <= (rd1 / 'h100) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
ANreg[7]: begin
|
||||
semseg <= (rd1 / 'h1000) % 5'h10;
|
||||
//DPr <= 1'b1;
|
||||
end
|
||||
endcase
|
||||
case (semseg)
|
||||
4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001;
|
||||
4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111;
|
||||
4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010;
|
||||
4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110;
|
||||
4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100;
|
||||
4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100;
|
||||
4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000;
|
||||
4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111;
|
||||
4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000;
|
||||
4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100;
|
||||
4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000;
|
||||
4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000;
|
||||
4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001;
|
||||
4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010;
|
||||
4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000;
|
||||
4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000;
|
||||
default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111;
|
||||
endcase
|
||||
end
|
||||
localparam int COUNTER_WIDTH = 10;
|
||||
logic [COUNTER_WIDTH-1:0] counter_next;
|
||||
logic [COUNTER_WIDTH-1:0] counter_ff;
|
||||
assign counter_next = counter_ff + COUNTER_WIDTH'('b1);
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) counter_ff <= '0;
|
||||
else counter_ff <= counter_next;
|
||||
end
|
||||
|
||||
logic [7:0] an_ff;
|
||||
logic [7:0] an_next;
|
||||
logic an_en;
|
||||
assign an_next = {an_ff[$left(an_ff)-1:0], an_ff[$left(an_ff)]};
|
||||
assign an_en = ~|counter_ff;
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) an_ff <= ~8'b1;
|
||||
else if (an_en) an_ff <= an_next;
|
||||
end
|
||||
|
||||
localparam bit [6:0] BLANK = 7'b1111111;
|
||||
|
||||
logic [6:0] semseg;
|
||||
always_comb begin
|
||||
semseg = BLANK;
|
||||
|
||||
unique case (1'b0)
|
||||
an_ff[0]: semseg = hex2semseg(rd2[0]);
|
||||
an_ff[1]: semseg = hex2semseg(rd2[1]);
|
||||
an_ff[2]: semseg = hex2semseg(rd2[2]);
|
||||
an_ff[3]: semseg = hex2semseg(rd2[3]);
|
||||
an_ff[4]: semseg = hex2semseg(rd1[0]);
|
||||
an_ff[5]: semseg = hex2semseg(rd1[1]);
|
||||
an_ff[6]: semseg = hex2semseg(rd1[2]);
|
||||
an_ff[7]: semseg = hex2semseg(rd1[3]);
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [2:0][4:0] addresses_next;
|
||||
assign addresses_next = sw_i[14:0];
|
||||
logic [4:0] wa_ff;
|
||||
logic [4:0] ra1_ff;
|
||||
logic [4:0] ra2_ff;
|
||||
logic [4:0] wa_next;
|
||||
assign wa_next = addresses_next[0];
|
||||
logic [4:0] ra1_next;
|
||||
assign ra1_next = addresses_next[2];
|
||||
logic [4:0] ra2_next;
|
||||
assign ra2_next = addresses_next[1];
|
||||
logic addresses_en;
|
||||
assign addresses_en = btnr_i;
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) begin
|
||||
wa_ff <= '0;
|
||||
ra1_ff <= '0;
|
||||
ra2_ff <= '0;
|
||||
end else if (addresses_en) begin
|
||||
wa_ff <= wa_next;
|
||||
ra1_ff <= ra1_next;
|
||||
ra2_ff <= ra2_next;
|
||||
end
|
||||
end
|
||||
assign wa = wa_ff;
|
||||
assign ra1 = ra1_ff;
|
||||
assign ra2 = ra2_ff;
|
||||
|
||||
logic [15:0] wd_ff;
|
||||
logic wd_en;
|
||||
assign wd_en = btnd_i;
|
||||
logic [15:0] wd_next;
|
||||
assign wd_next = sw_i;
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) begin
|
||||
wd_ff <= '0;
|
||||
end else if (wd_en) begin
|
||||
wd_ff <= wd_next;
|
||||
end
|
||||
end
|
||||
assign wd = {16'b0, wd_ff};
|
||||
|
||||
logic we_ff;
|
||||
logic we_next;
|
||||
assign we_next = wd_en ? 1'b1 : 1'b0;
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) we_ff <= 1'b0;
|
||||
else we_ff <= we_next;
|
||||
end
|
||||
assign we = we_ff;
|
||||
|
||||
assign {ca_o, cb_o, cc_o, cd_o, ce_o, cf_o, cg_o} = semseg;
|
||||
assign dp_o = 1'b1;
|
||||
|
||||
assign led_o = {1'b0, ra1, ra2, wa};;
|
||||
|
||||
assign an_o = an_ff;
|
||||
|
||||
endmodule
|
||||
|
Reference in New Issue
Block a user