这似乎是一个非常天真的问题,但我刚开始使用Verilog(我使用Xilinx ISE,如果有帮助的话)。
我正在尝试实现一个移位寄存器,它将输入PI
移动shft
端口中指定的值。当我在RTL文件中包含移位逻辑时,移位不起作用,但是当我移动对应于移位到测试平台的always块时,它可以工作。请帮帮我!
module shift (PI, shft, clk, PO);
input [7:0] PI;
input clk;
input [7:0] shft;
output reg [13:0] PO;
reg [7:0] shft_reg;
always @(posedge clk) begin
if (shft_reg[0]||shft_reg[1]||shft_reg[2]||shft_reg[3]||shft_reg[4]||shft_reg[5]||shft_reg[6]||shft_reg[7]) begin
PO <= {PO, 0};
shft_reg <= shft_reg-1;
end
end
endmodule
答案 0 :(得分:1)
module shift (
input wire clk;
input wire load; // load shift register from input
input wire [7:0] PI;
input wire [7:0] shft; // this might need less bits
output wire [13:0] PO;
);
reg [7:0] shft_reg;
reg [13:0] value;
assign PO = value; // PO follows value
always @(posedge clk) begin
if (load) begin // initialize shift register and counter
shft_reg <= shft;
value <= {6'b0,PI};
end
else if (shft_reg) begin // if counter not reached end...
shft_reg <= shft_reg - 1; // decrement, and
value <= {value[13:1],1'b0}; // shift left value 1 bit
end
end
end
endmodule
回想一下,Verilog支持>>
和<<
运算符。对于非常数的多位操作数,这可能是浪费多路复用器,但是:
module shiftcomb (
input wire [7:0] PI; // this value is left shifted
input wire [2:0] shft; // 0 to 7 bits positions
output wire [14:0] PO; // and is outputted to PO
);
assign PO = PI<<shft; // this will generate 15 mutlplexers:
// each one with 8 inputs, 3 bit select,
// and 1 output.
endmodule
答案 1 :(得分:0)
请注意,||
是合乎逻辑的,或者理想情况下应与(shft_reg[0] == 1'b1 ) || ( shft_reg[1] == 1'b1)
等逻辑规则一起使用。
你的if语句实际上是按位ORing所有位,即
shft_reg[0] | shft_reg[1] | shft_reg[2] | ...
您可以使用OR Reduction运算符:
|shft_reg
您提供的代码中包含了错误的P&P PI。
always @(posedge clk) begin
if (|shft_reg) begin
PO <= {PI, 0}; //PI input
shft_reg <= shft_reg-1;
end
end