用verilog编程方式实现4位串行输入、并行输出的同步右移寄存器。 (2)要求用阻塞赋值(正向及反向顺序)和非阻塞赋值 (正向及反向顺序)4种赋值方式
时间: 2024-03-15 22:44:25 浏览: 8
以下是4种不同赋值方式实现的4位串行输入、并行输出的同步右移寄存器的Verilog代码:
```verilog
// 阻塞赋值,正向顺序
module shift_register_BZ(
input clk, //时钟信号
input reset, //复位信号
input [3:0] in, //串行输入信号
output reg [3:0] out //并行输出信号
);
reg [3:0] reg = 4'b0000; //寄存器存储串行输入信号
always @(posedge clk) begin
if(reset) begin //复位信号为1时,将寄存器清零
reg <= 4'b0000;
end else begin
reg <= {in, reg[3]}; //串行输入信号加入寄存器,最高位右移出
out <= reg; //并行输出信号为寄存器内容
end
end
endmodule
// 阻塞赋值,反向顺序
module shift_register_BZ_reverse(
input clk, //时钟信号
input reset, //复位信号
input [3:0] in, //串行输入信号
output reg [3:0] out //并行输出信号
);
reg [3:0] reg = 4'b0000; //寄存器存储串行输入信号
always @(posedge clk) begin
if(reset) begin //复位信号为1时,将寄存器清零
reg <= 4'b0000;
end else begin
out <= reg; //并行输出信号为寄存器内容
reg <= {in, reg[3]}; //串行输入信号加入寄存器,最高位右移出
end
end
endmodule
// 非阻塞赋值,正向顺序
module shift_register_NBZ(
input clk, //时钟信号
input reset, //复位信号
input [3:0] in, //串行输入信号
output reg [3:0] out //并行输出信号
);
reg [3:0] reg = 4'b0000; //寄存器存储串行输入信号
always @(posedge clk) begin
if(reset) begin //复位信号为1时,将寄存器清零
reg <= 4'b0000;
end else begin
reg <= {in, reg[3]}; //串行输入信号加入寄存器,最高位右移出
out <= reg; //并行输出信号为寄存器内容
end
end
endmodule
// 非阻塞赋值,反向顺序
module shift_register_NBZ_reverse(
input clk, //时钟信号
input reset, //复位信号
input [3:0] in, //串行输入信号
output reg [3:0] out //并行输出信号
);
reg [3:0] reg = 4'b0000; //寄存器存储串行输入信号
always @(posedge clk) begin
if(reset) begin //复位信号为1时,将寄存器清零
reg <= 4'b0000;
end else begin
out <= reg; //并行输出信号为寄存器内容
reg <= {in, reg[3]}; //串行输入信号加入寄存器,最高位右移出
end
end
endmodule
```
这里分别使用了阻塞赋值和非阻塞赋值两种不同的赋值方式,并且分别使用了正向顺序和反向顺序。当然,这四个模块的功能都是相同的。