1. 程式人生 > >移位暫存器之右移位暫存器(Verilog HDL語言描述)

移位暫存器之右移位暫存器(Verilog HDL語言描述)

目錄

背景

測試一

測試程式碼

模擬波形圖

測試二

測試程式碼

模擬圖

ISE綜合

測試三

測試程式碼

模擬波形圖

ISE綜合

背景

之所以單獨把這個簡單的東西拿出來,就是因為這個東西我可能要用到,不能眼高手低,以為簡單就一眼帶過,之後,用的時候就不能快速地拿出來,處於這個簡單的目的,這個知識點貼出來遛遛。

之所以強調非環形移位,很簡單,我不想讓它具有環形移位的功能唄,我不需要,需要的時候直接改一行程式碼即可。

測試一

這種移位暫存器,給一個輸入資料之後,在一個時鐘上升沿到來時,輸出等於輸入右移1位,高位補零,然後如果沒有輸入資料的話,輸出就不在變化了,直到又給一個輸入,然後時鐘上升沿到來時,輸入訊號右移1位作為輸出,如此下去。

Verilog HDL語言描述

//10 bit right shift register
module register(clk, din, dout);

input clk;
input [9:0] din;
output [9:0] dout;
reg [9:0] dout;

[email protected](posedge clk)
begin
	dout <= {1'b0, din[9:1]};
end


endmodule

測試程式碼

//testbench file for 10 bit right shift register
`timescale 1ns/1ps
module register_tb;

reg clk;
reg [9:0] din;
wire [9:0] dout;

//clock generation of period 20 ns
always
begin
	#10 clk = ~clk;
end

//initialization
initial
begin
	clk = 1'b0;
	din = 10'b0010110110;
	#200 din = 10'b1110001010;
end

register u1(.clk(clk),.din(din), .dout(dout));


endmodule

模擬波形圖

測試二

如果需要右移3位,則

Verilog HDL語言描述

//10 bit right shift register
module a(clk, din, dout);

input clk;
input [9:0] din;
output [9:0] dout;
reg [9:0] dout;

[email protected](posedge clk)
begin
	dout <= {3'b000, din[9:3]};
end


endmodule

測試程式碼

//testbench file for 10 bit right shift register
`timescale 1ns/1ps
module register_tb;

reg clk;
reg [9:0] din;
wire [9:0] dout;

//clock generation of period 20 ns
always
begin
	#10 clk = ~clk;
end

//initialization
initial
begin
	clk = 1'b0;
	din = 10'b0010110110;
	#200 din = 10'b1110001010;
end

register u1(.clk(clk),.din(din), .dout(dout));


endmodule

模擬圖

ISE綜合

RTL Schematic

測試三

環形移位暫存器(右移)

Verilog HDL描述

//10 bit right shift register
module register(clk, din, dout);

input clk;
input [9:0] din;
output [9:0] dout;
reg [9:0] dout;

[email protected](posedge clk)
begin
	dout <= {din[0], din[9:1]};
end


endmodule

測試程式碼

//testbench file for 10 bit right shift register
`timescale 1ns/1ps
module register_tb;

reg clk;
reg [9:0] din;
wire [9:0] dout;

//clock generation of period 20 ns
always
begin
	#10 clk = ~clk;
end

//initialization
initial
begin
	clk = 1'b0;
	din = 10'b0010110110;
	#200 din = 10'b1110001010;
end

register u1(.clk(clk),.din(din), .dout(dout));


endmodule

模擬波形圖

ISE綜合

RTL Schematic

事實上,我以前做過移位暫存器的總結:移位暫存器專題