我正在尝试将FPGA用作带有pwm的某些LED的移位寄存器,但在尝试分配包含移入输出变量的值的寄存器时遇到错误。当我将它上传到FPGA(我使用嵌入式micro的mojo)时,它什么也没做。当我使用模拟器时,它报告所有输出变量从未被分配并且具有值X,而模块内部的所有其他变量都可以正常工作。这是我的换档模块的代码:
module shifting(
input clk,
input shiftingpin,//data to be shifted in
input rst,
output done,
output [3:0]data//pwm compare value output
);
reg [2: 0] ctr_d, ctr_q;
reg don;
reg [3:0]datas;
always @(*) begin
if(ctr_q == 3'b100) begin
ctr_d[2:0] = 3'b0;
don = 1'b1;
end else begin
ctr_d = ctr_q + 1'b1;
don = 1'b0;
end
end
always @(posedge clk) begin
datas[ctr_q] = shiftingpin;// assign value to the output
if (rst) begin
ctr_q <= 1'b0;
end else begin
ctr_q <= ctr_d;
end
end
assign data = datas;
assign done = don;
endmodule
done告诉包含模块何时更新并将值赋给pwm。
答案 0 :(得分:0)
如果我正确理解了这个问题,那么在尝试从always
块中驱动端口时会出现语法错误。
声明端口时,默认情况下它们通常是有线的,只能由端口驱动或分配。导致下面的代码
module shifting(
input clk,
input shiftingpin,
input rst,
output done,
output [3:0] data
);
reg don;
reg [3:0] datas;
assign done = don;
assign data = datas;
解决方案是将端口定义为reg
,如果您可以支持System Verilog,则首选逻辑。
logic
将根据需要在wire和reg之间有效切换,以使重构代码更容易。
module shifting(
input clk,
input shiftingpin,
input rst,
output reg done,
output reg [3:0] data
);
always @(posedge clk) begin
data[ctr_q] <= shiftingpin; // <-- data port used directly
//...
注意:移位寄存器只需
即可完成always @(posedge clk) begin
datas[3:0] <= {datas[2:0], shiftingpin};