mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Перевод Verilog-кода на SystemVerilog
This commit is contained in:
93
Labs/12. Peripheral units/PS2Receiver.sv
Normal file
93
Labs/12. Peripheral units/PS2Receiver.sv
Normal file
@@ -0,0 +1,93 @@
|
||||
module PS2Receiver(
|
||||
input logic clk,
|
||||
input logic kclk,
|
||||
input logic kdata,
|
||||
output logic [15:0] keycodeout,
|
||||
output keycode_valid
|
||||
);
|
||||
|
||||
logic flag;
|
||||
logic [3:0] flag_shift;
|
||||
logic kclkf, kdataf;
|
||||
logic [3:0] cnt;
|
||||
|
||||
assign keycode_valid = flag_shift[0] && !flag_shift[2];
|
||||
|
||||
initial begin //for tb
|
||||
cnt = 0;
|
||||
keycodeout = 0;
|
||||
flag_shift = 0;
|
||||
flag = 0;
|
||||
end
|
||||
|
||||
debouncer debounce(
|
||||
.clk(clk),
|
||||
.I0(kclk),
|
||||
.I1(kdata),
|
||||
.O0(kclkf),
|
||||
.O1(kdataf)
|
||||
);
|
||||
always@(posedge clk) begin
|
||||
flag_shift <= (flag_shift << 1) + flag;
|
||||
end
|
||||
|
||||
always_ff @(negedge(kclkf))begin
|
||||
case(cnt)
|
||||
0:if(keycodeout != 16'hE000)keycodeout <= 0;//Start bit
|
||||
1:keycodeout[0]<=kdataf;
|
||||
2:keycodeout[1]<=kdataf;
|
||||
3:keycodeout[2]<=kdataf;
|
||||
4:keycodeout[3]<=kdataf;
|
||||
5:keycodeout[4]<=kdataf;
|
||||
6:keycodeout[5]<=kdataf;
|
||||
7:keycodeout[6]<=kdataf;
|
||||
8:keycodeout[7]<=kdataf;
|
||||
//TODO ADD PARITY CHECK
|
||||
9:begin
|
||||
flag<=1'b1;
|
||||
if(keycodeout[7:0] == 8'hE0) begin
|
||||
keycodeout <= {keycodeout[7:0], 8'd0};
|
||||
end
|
||||
end
|
||||
10:flag<=1'b0;
|
||||
default: cnt <= 0;
|
||||
endcase
|
||||
if(cnt<=9) cnt<=cnt+1;
|
||||
else if(cnt==10) cnt<=0;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
module debouncer(
|
||||
input logic clk,
|
||||
input logic I0,
|
||||
input logic I1,
|
||||
output logic O0,
|
||||
output logic O1
|
||||
);
|
||||
|
||||
logic [4:0]cnt0, cnt1;
|
||||
logi Iv0=0,Iv1=0;
|
||||
logi out0, out1;
|
||||
|
||||
always_ff @(posedge(clk))begin
|
||||
if (I0==Iv0) begin
|
||||
if (cnt0==19)O0<=I0;
|
||||
else cnt0<=cnt0+1;
|
||||
end
|
||||
else begin
|
||||
cnt0<="00000";
|
||||
Iv0<=I0;
|
||||
end
|
||||
if (I1==Iv1)begin
|
||||
if (cnt1==19)O1<=I1;
|
||||
else cnt1<=cnt1+1;
|
||||
end
|
||||
else begin
|
||||
cnt1<="00000";
|
||||
Iv1<=I1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
@@ -1,93 +0,0 @@
|
||||
module PS2Receiver(
|
||||
input clk,
|
||||
input kclk,
|
||||
input kdata,
|
||||
output reg [15:0] keycodeout,
|
||||
output keycode_valid
|
||||
);
|
||||
|
||||
reg flag;
|
||||
reg [3:0] flag_shift;
|
||||
wire kclkf, kdataf;
|
||||
reg [3:0]cnt;
|
||||
|
||||
assign keycode_valid = flag_shift[0] && !flag_shift[2];
|
||||
|
||||
initial begin //for tb
|
||||
cnt = 0;
|
||||
keycodeout = 0;
|
||||
flag_shift = 0;
|
||||
flag = 0;
|
||||
end
|
||||
|
||||
debouncer debounce(
|
||||
.clk(clk),
|
||||
.I0(kclk),
|
||||
.I1(kdata),
|
||||
.O0(kclkf),
|
||||
.O1(kdataf)
|
||||
);
|
||||
always@(posedge clk) begin
|
||||
flag_shift <= (flag_shift << 1) + flag;
|
||||
end
|
||||
|
||||
always@(negedge(kclkf))begin
|
||||
case(cnt)
|
||||
0:if(keycodeout != 16'hE000)keycodeout <= 0;//Start bit
|
||||
1:keycodeout[0]<=kdataf;
|
||||
2:keycodeout[1]<=kdataf;
|
||||
3:keycodeout[2]<=kdataf;
|
||||
4:keycodeout[3]<=kdataf;
|
||||
5:keycodeout[4]<=kdataf;
|
||||
6:keycodeout[5]<=kdataf;
|
||||
7:keycodeout[6]<=kdataf;
|
||||
8:keycodeout[7]<=kdataf;
|
||||
//TODO ADD PARITY CHECK
|
||||
9:begin
|
||||
flag<=1'b1;
|
||||
if(keycodeout[7:0] == 8'hE0) begin
|
||||
keycodeout <= {keycodeout[7:0], 8'd0};
|
||||
end
|
||||
end
|
||||
10:flag<=1'b0;
|
||||
default: cnt <= 0;
|
||||
endcase
|
||||
if(cnt<=9) cnt<=cnt+1;
|
||||
else if(cnt==10) cnt<=0;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
module debouncer(
|
||||
input clk,
|
||||
input I0,
|
||||
input I1,
|
||||
output reg O0,
|
||||
output reg O1
|
||||
);
|
||||
|
||||
reg [4:0]cnt0, cnt1;
|
||||
reg Iv0=0,Iv1=0;
|
||||
reg out0, out1;
|
||||
|
||||
always@(posedge(clk))begin
|
||||
if (I0==Iv0)begin
|
||||
if (cnt0==19)O0<=I0;
|
||||
else cnt0<=cnt0+1;
|
||||
end
|
||||
else begin
|
||||
cnt0<="00000";
|
||||
Iv0<=I0;
|
||||
end
|
||||
if (I1==Iv1)begin
|
||||
if (cnt1==19)O1<=I1;
|
||||
else cnt1<=cnt1+1;
|
||||
end
|
||||
else begin
|
||||
cnt1<="00000";
|
||||
Iv1<=I1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
76
Labs/12. Peripheral units/hex_digits.sv
Normal file
76
Labs/12. Peripheral units/hex_digits.sv
Normal file
@@ -0,0 +1,76 @@
|
||||
module hex_digits(
|
||||
input logic clk_i, rst_i,
|
||||
input logic [4:0] hex0, // Входной сигнал со значением цифры, выводимой на нулевой (самый правый) индикатор
|
||||
input logic [4:0] hex1, // Входной сигнал со значением цифры, выводимой на первый индикатор
|
||||
input logic [4:0] hex2, // Входной сигнал со значением цифры, выводимой на второй индикатор
|
||||
input logic [4:0] hex3, // Входной сигнал со значением цифры, выводимой на третий индикатор
|
||||
input logic [4:0] hex4, // Входной сигнал со значением цифры, выводимой на четвертый индикатор
|
||||
input logic [4:0] hex5, // Входной сигнал со значением цифры, выводимой на пятый индикатор
|
||||
input logic [4:0] hex6, // Входной сигнал со значением цифры, выводимой на шестой индикатор
|
||||
input logic [4:0] hex7, // Входной сигнал со значением цифры, выводимой на седьмой индикатор
|
||||
|
||||
output logic [6:0] hex_led, // Выходной сигнал, контролирующий каждый отдельный светодиод индикатора
|
||||
output logic [7:0] hex_sel // Выходной сигнал, указывающий на какой индикатор выставляется hex_led
|
||||
);
|
||||
localparam pwm 1000 //шим сегментов
|
||||
|
||||
logic [9:0] counter;
|
||||
logic [4:0] semseg;
|
||||
logic [7:0] ANreg;
|
||||
logic [6:0] hex_ledr;
|
||||
|
||||
assign hex_sel = ANreg;
|
||||
assign hex_led = hex_ledr;
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if (rst_i) begin
|
||||
counter <= 'b0;
|
||||
ANreg[7:0] <= 8'b11111111;
|
||||
hex_ledr <= 7'b1111111;
|
||||
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
|
||||
case (1'b0)
|
||||
ANreg[0]: semseg <= hex0;
|
||||
ANreg[1]: semseg <= hex1;
|
||||
ANreg[2]: semseg <= hex2;
|
||||
ANreg[3]: semseg <= hex3;
|
||||
ANreg[4]: semseg <= hex4;
|
||||
ANreg[5]: semseg <= hex5;
|
||||
ANreg[6]: semseg <= hex6;
|
||||
ANreg[7]: semseg <= hex7;
|
||||
endcase
|
||||
case (semseg)
|
||||
5'h10: hex_ledr <= 7'b0000001;
|
||||
5'h11: hex_ledr <= 7'b1001111;
|
||||
5'h12: hex_ledr <= 7'b0010010;
|
||||
5'h13: hex_ledr <= 7'b0000110;
|
||||
5'h14: hex_ledr <= 7'b1001100;
|
||||
5'h15: hex_ledr <= 7'b0100100;
|
||||
5'h16: hex_ledr <= 7'b0100000;
|
||||
5'h17: hex_ledr <= 7'b0001111;
|
||||
5'h18: hex_ledr <= 7'b0000000;
|
||||
5'h19: hex_ledr <= 7'b0000100;
|
||||
5'h1A: hex_ledr <= 7'b0001000;
|
||||
5'h1B: hex_ledr <= 7'b1100000;
|
||||
5'h1C: hex_ledr <= 7'b0110001;
|
||||
5'h1D: hex_ledr <= 7'b1000010;
|
||||
5'h1E: hex_ledr <= 7'b0110000;
|
||||
5'h1F: hex_ledr <= 7'b0111000;
|
||||
default: hex_ledr <= 7'b1111111;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
@@ -1,76 +0,0 @@
|
||||
module hex_digits(
|
||||
input clk_i, rst_i,
|
||||
input [4:0] hex0, // Входной сигнал со значением цифры, выводимой на нулевой (самый правый) индикатор
|
||||
input [4:0] hex1, // Входной сигнал со значением цифры, выводимой на первый индикатор
|
||||
input [4:0] hex2, // Входной сигнал со значением цифры, выводимой на второй индикатор
|
||||
input [4:0] hex3, // Входной сигнал со значением цифры, выводимой на третий индикатор
|
||||
input [4:0] hex4, // Входной сигнал со значением цифры, выводимой на четвертый индикатор
|
||||
input [4:0] hex5, // Входной сигнал со значением цифры, выводимой на пятый индикатор
|
||||
input [4:0] hex6, // Входной сигнал со значением цифры, выводимой на шестой индикатор
|
||||
input [4:0] hex7, // Входной сигнал со значением цифры, выводимой на седьмой индикатор
|
||||
|
||||
output [6:0] hex_led, // Выходной сигнал, контролирующий каждый отдельный светодиод индикатора
|
||||
output [7:0] hex_sel // Выходной сигнал, указывающий на какой индикатор выставляется hex_led
|
||||
);
|
||||
`define pwm 1000 //шим сегментов
|
||||
|
||||
reg [9:0] counter;
|
||||
reg [4:0] semseg;
|
||||
reg [7:0] ANreg;
|
||||
reg [6:0] hex_ledr;
|
||||
|
||||
assign hex_sel = ANreg;
|
||||
assign hex_led = hex_ledr;
|
||||
|
||||
always @(posedge clk_i) begin
|
||||
if (rst_i) begin
|
||||
counter <= 'b0;
|
||||
ANreg[7:0] <= 8'b11111111;
|
||||
hex_ledr <= 7'b1111111;
|
||||
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
|
||||
case (1'b0)
|
||||
ANreg[0]: semseg <= hex0;
|
||||
ANreg[1]: semseg <= hex1;
|
||||
ANreg[2]: semseg <= hex2;
|
||||
ANreg[3]: semseg <= hex3;
|
||||
ANreg[4]: semseg <= hex4;
|
||||
ANreg[5]: semseg <= hex5;
|
||||
ANreg[6]: semseg <= hex6;
|
||||
ANreg[7]: semseg <= hex7;
|
||||
endcase
|
||||
case (semseg)
|
||||
5'h10: hex_ledr <= 7'b0000001;
|
||||
5'h11: hex_ledr <= 7'b1001111;
|
||||
5'h12: hex_ledr <= 7'b0010010;
|
||||
5'h13: hex_ledr <= 7'b0000110;
|
||||
5'h14: hex_ledr <= 7'b1001100;
|
||||
5'h15: hex_ledr <= 7'b0100100;
|
||||
5'h16: hex_ledr <= 7'b0100000;
|
||||
5'h17: hex_ledr <= 7'b0001111;
|
||||
5'h18: hex_ledr <= 7'b0000000;
|
||||
5'h19: hex_ledr <= 7'b0000100;
|
||||
5'h1A: hex_ledr <= 7'b0001000;
|
||||
5'h1B: hex_ledr <= 7'b1100000;
|
||||
5'h1C: hex_ledr <= 7'b0110001;
|
||||
5'h1D: hex_ledr <= 7'b1000010;
|
||||
5'h1E: hex_ledr <= 7'b0110000;
|
||||
5'h1F: hex_ledr <= 7'b0111000;
|
||||
default: hex_ledr <= 7'b1111111;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
Reference in New Issue
Block a user