add shift_register
This commit is contained in:
@@ -349,7 +349,7 @@ gtkwave modulo.vcd
|
||||
- [x] Fase 1.5 — Decoder / Encoder
|
||||
- [x] Fase 2.1 — Flip-Flop D y registro
|
||||
- [x] Fase 2.2 — Contador
|
||||
- [ ] Fase 2.3 — Shift Register
|
||||
- [x] Fase 2.3 — Shift Register
|
||||
- [ ] Fase 2.4 — Register File
|
||||
- [ ] Fase 3.1 — RAM sincrona
|
||||
- [ ] Fase 3.2 — ROM
|
||||
|
||||
24
shift_register/shift_register.v
Normal file
24
shift_register/shift_register.v
Normal file
@@ -0,0 +1,24 @@
|
||||
module shift_register #(parameter N = 8) (
|
||||
input clk,
|
||||
input rst,
|
||||
input load,
|
||||
input shift_en,
|
||||
input dir,
|
||||
input serial_in,
|
||||
input [N-1:0] parallel_in,
|
||||
output reg [N-1:0] q,
|
||||
output serial_out
|
||||
);
|
||||
|
||||
assign serial_out = dir ? q[0] : q[N-1];
|
||||
|
||||
always @(posedge clk or posedge rst) begin
|
||||
if (rst) q <= 0;
|
||||
else if (load) q <= parallel_in;
|
||||
else if (shift_en) begin
|
||||
if (dir == 0) q <= {q[N-2:0], serial_in};
|
||||
else q <= {serial_in, q[N-1:1]};
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
48
shift_register/shift_register_tb.v
Normal file
48
shift_register/shift_register_tb.v
Normal file
@@ -0,0 +1,48 @@
|
||||
`include "./shift_register/shift_register.v"
|
||||
|
||||
module shift_register_tb;
|
||||
reg clk, rst, load, shift_en, dir, serial_in;
|
||||
reg [7:0] parallel_in;
|
||||
wire [7:0] q;
|
||||
wire serial_out;
|
||||
|
||||
shift_register register(
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
.load(load),
|
||||
.shift_en(shift_en),
|
||||
.dir(dir),
|
||||
.serial_in(serial_in),
|
||||
.parallel_in(parallel_in),
|
||||
.q(q),
|
||||
.serial_out(serial_out)
|
||||
);
|
||||
|
||||
initial clk = 0;
|
||||
always #5 clk = ~clk;
|
||||
|
||||
initial begin
|
||||
$dumpfile("./shift_register/shift_register.vcd");
|
||||
$dumpvars(0, shift_register_tb);
|
||||
|
||||
rst = 1; load = 0; shift_en = 1; dir = 0; serial_in = 0;
|
||||
@(posedge clk);
|
||||
|
||||
$display("rst=%b, load=%b, shift_en=%b, dir=%b, serial_in=%b, q=%b", rst, load, shift_en, dir, serial_in, q);
|
||||
|
||||
rst = 0; load = 1; parallel_in = 64;
|
||||
@(posedge clk);
|
||||
|
||||
$display("rst=%b, load=%b, shift_en=%b, dir=%b, serial_in=%b, q=%b", rst, load, shift_en, dir, serial_in, q);
|
||||
|
||||
load = 0; serial_in = 1;
|
||||
@(posedge clk);
|
||||
$display("rst=%b, load=%b, shift_en=%b, dir=%b, serial_in=%b, q=%b", rst, load, shift_en, dir, serial_in, q);
|
||||
|
||||
repeat(10) @(posedge clk);
|
||||
$display("rst=%b, load=%b, shift_en=%b, dir=%b, serial_in=%b, q=%b", rst, load, shift_en, dir, serial_in, q);
|
||||
|
||||
$finish;
|
||||
end
|
||||
|
||||
endmodule
|
||||
Reference in New Issue
Block a user