module sreg_sipo #(parameter N = 8)( input sys_clk, input sys_rst_n, input sin, input rd, output [N - 1 : 0] sout ); // 请在下面添加代码,完成8位串入并出移位寄存器(左移)的建模 // 代码量预计6行 /****** Begin ******/ /****** End ******/ endmodule
时间: 2023-06-29 12:08:46 浏览: 98
module sreg_sipo #(parameter N = 8)(
input sys_clk,
input sys_rst_n,
input sin,
input rd,
output [N - 1 : 0] sout
);
reg [N-1:0] reg_data; // 定义一个N位宽的寄存器
always @(posedge sys_clk or negedge sys_rst_n) begin
if (~sys_rst_n) begin
reg_data <= 0; // 复位时清零
end else if (rd == 1) begin
reg_data <= {reg_data[N-2:0], sin}; // 向左移位
end
end
assign sout = reg_data; // 将寄存器数据输出
endmodule
// 代码量为5行,完整代码如下:
相关问题
module sreg_sipo #(parameter N = 8)( input sys_clk, input sys_rst_n, input sin, input rd, output [N - 1 : 0] sout ); // 请在下面添加代码,完成8位串入并出移位寄存器(左移)的建模 // 代码量预计6行 /****** Begin / / End ******/ endmodule预期输出: VCD info: dumpfile waveform.vcd opened for output. At time 0ns: sys_rst_n = 0, sin = 0, rd = 0, sout = 00000000 At time 20ns: sys_rst_n = 1, sin = 0, rd = 0, sout = 00000000 At time 35ns: sys_rst_n = 1, sin = 1, rd = 0, sout = 00000000 At time 95ns: sys_rst_n = 1, sin = 0, rd = 1, sout = 00111111
module sreg_sipo #(parameter N = 8)(
input sys_clk,
input sys_rst_n,
input sin,
input rd,
output [N - 1 : 0] sout
);
reg [N - 1 : 0] shift_reg;
always @(posedge sys_clk) begin
if (!sys_rst_n) begin
shift_reg <= 0;
end else begin
shift_reg <= {shift_reg[N-2:0], sin};
end
end
assign sout = rd ? shift_reg : {N{1'b0}}; //当rd为1时,输出移位寄存器的值,否则输出0
endmodule
//测试模块
module testbench();
reg sys_clk, sys_rst_n, sin, rd;
wire [7:0] sout;
sreg_sipo #(.N(8)) uut(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.sin(sin),
.rd(rd),
.sout(sout)
);
initial begin
$dumpfile("waveform.vcd");
$dumpvars(0, testbench);
sys_rst_n <= 0;
sys_clk <= 0;
sin <= 0;
rd <= 0;
#20 sys_rst_n <= 1;
#15 sin <= 1;
#60 rd <= 1;
#10 $finish;
end
always #10 sys_clk <= ~sys_clk;
endmodule
module sreg_piso #(parameter N = 8)( input sys_clk, input sys_rst_n, input load, input [N - 1 : 0] D, output sout ); // 请在下面添加代码,完成8位并入串出移位寄存器(左移)的建模 // 代码量预计7行 /****** Begin ******/ /****** End ******/ endmodule
module sreg_piso #(parameter N = 8)(
input sys_clk,
input sys_rst_n,
input load,
input [N - 1 : 0] D,
output sout
);
reg [N-1:0] shift_reg;
assign sout = shift_reg[N-1];
always @(posedge sys_clk or negedge sys_rst_n) begin
if (~sys_rst_n) begin
shift_reg <= 0;
end else begin
if (load) begin
shift_reg <= D;
end else begin
shift_reg <= {shift_reg[N-2:0], 1'b0};
end
end
end
endmodule
注:以上代码实现的是并入串出移位寄存器(左移),即每当 sys_clk 上升沿到来,数据都会向左移动一位,最高位被新输入的数据所替换。同时,如果 load 信号为 1,那么 shift_reg 将被加载为输入的数据 D。
阅读全文