Хочу реализовать следующую временную диаграмму (цифры здесь произвольные, главное общий принцип). В моей задаче последовательность 4-битных данных. Эту последовательность необходимо записать в регистры А, В и С и сдвинуть в каждом соответствующем регистре на 1 такт относительно предыдущего.
Вот мой код на Verilog:
module shift4bit(clock, data, out, outRegA, outRegB, outRegC);
input clock;
input [3:0] data;
output [3:0] out;
output [3:0] outRegA;
output [3:0] outRegB;
output [3:0] outRegC;
reg [3:0] RegA;
reg [3:0] RegB;
reg [3:0] RegC;
always @(posedge clock) begin
RegA <= data;
RegB <= RegA;
RegC <= RegB;
end
assign out = data;
assign outRegA = RegA;
assign outRegB = RegB;
assign outRegC = RegC;
endmodule
И тестовый стенд:
`timescale 1ns / 1ps
module shift4bit_tb;
// Inputs
reg [3:0] data;
reg clock;
// Outputs
wire [3:0] out;
wire [3:0] outRegA;
wire [3:0] outRegB;
wire [3:0] outRegC;
// Instantiate the Unit Under Test (UUT)
shift4bit uut (.clock(clock),.data(data),.out(out),.outRegA(outRegA),.outRegB(outRegB),.outRegC(outRegC));
initial begin
// Initialize Inputs
data = 4'b1111;
clock = 1'b1;
// Wait 100 ns for global reset to finish
#20;
// Add stimulus here
data = 4'b0001; #20;
data = 4'b0010; #20;
data = 4'b0011; #20;
data = 4'b0100; #20;
data = 4'b0101; #20;
data = 4'b0110; #20;
data = 4'b0111; #20;
data = 4'b1000; #20;
end
always #10 clock = ~clock;
endmodule
Я получил следующий результат. Кажется, произошел сдвиг. Подскажите, корректен ли мой код и можно ли его синтезировать в реальную схему на ПЛИС?
Было бы лучше переписать тестовый стенд следующим образом:
@( posedge clock );
data <= 4'b0001;
@( posedge clock );
data <= 4'b0010;
@( posedge clock );
data <= 4'b0011;
@( posedge clock );
Потому что, если вы одновременно используете '=', часы и данные, симулятор не сможет определить, какой из них будет первым. Если он сначала обрабатывает изменение данных, а затем тактовую частоту, вы увидите, что данные передаются в outRegA без задержки в 1 такт.
В реальной конструкции выходной сигнал D-триггера немного отстает от тактовой частоты. Поэтому поместите «@(часы posege)» в тестовый стенд, чтобы убедиться в этом.
Я внес это изменение, чтобы посмотреть, что произойдет. Вы про этот эффект? ibb.co/ZMNxmrH Еще я пытался посмотреть, отстает ли выход регистра от тактового импульса, но я этого не заметил.