【发布时间】:2022-01-22 06:33:23
【问题描述】:
编辑:仅通过屏幕截图(http://prntscr.com/lv3uqwhttp://prntscr.com/lv3yhf)和下面的代码,您仍然可以在这里理解我的目标,以防您不想阅读文本。
我正在尝试为通用移位寄存器编写 Verilog 代码。我原来的寄存器工作正常(没有LR_bar signal 的那个)。但是在这个我不知道如何使这种连接(与ff 的多路复用)发生http://prntscr.com/lv3uqw 和http://prntscr.com/lv3yhf.I 建议for 循环应该从-1 开始,但我仍然找不到解决方案。如果可能的话,我还想避免使用 h 信号(也许我们也在那里使用 w )。所以基本上当LR_bar=1 我想要移位寄存器到shift left 和当=0 到shift right 时。
截图提示:l_sh 中的 ser 代表左移的串行输入
(还发现在 Mano Morris 第 3 版(第 6 版更详细)书(计算机设计基础)上,在某种程度上,与我想要的有点接近。但我想要 2to1 多路复用器。但第 2 个截图是我想要实现的。 http://prntscr.com/lvb5bthttp://prntscr.com/lvb65f)
我觉得我描述得很好......有人可以解决这个问题吗?
我的新代码(如下)和一些值之后的测试......http://prntscr.com/lvhk63
我试图模仿那个(http://prntscr.com/lvgx31http://prntscr.com/lvgxgwhttp://prntscr.com/lvgxkw)但仅适用于串行输入部分(MSB,LSB)。请告诉我我哪里错了。谢谢
输出应该是寄存器的状态
-----------------------------------------------------------
module lr_shreg_n(in, out, clk, rst, LR_bar);
parameter n=4;
input in, rst, clk, LR_bar;
output [n-1:0] out;
wire [n+1:0] w;
wire [n-1:0] mux_out;
genvar i;
assign w[0]=in;
assign w[n+1]=in;
generate
for(i=0;i<n;i=i+1)
begin
mux2to1 MUX(.in({w[i],w[i+2]}),.sel(LR_bar),.out(mux_out[i]));
dff ff1(.d(mux_out[i]), .q(w[i+1]), .clk(clk),
.rst(rst));
end
endgenerate
assign out=w[n:1];
endmodule
------------------------------------------------------------
JUST AN ATTEMPT NOTHING TO LOOK
module lr_shreg_n(in, out, clk, rst, LR_bar);
parameter n=4;
input in, rst, clk, LR_bar;
output [n-1:0] out;
wire [n+1:0] w;
wire mux_out;
genvar i;
assign w[0]=in;
assign w[n+1]=in;
generate
for(i=-1;i<n-1;i=i+1)
begin
mux2to1 MUX(.in({w[i+1],w[3+i]}),.sel(LR_bar),.out(mux_out));
dff ff1(.d(mux_out), .q(out[i+1]), .clk(clk),
.rst(rst));
end
endgenerate
------------------------------------------------------------
module dff (d, q, clk, rst);
input d, clk, rst;
output reg q;
always @ (posedge clk) begin : dff_block
if (rst==1'b1)
q = 1'b0;
else
q = d;
end
endmodule
module mux2to1(in, sel, out) ;
input [1:0] in;
input sel;
output reg out;
always @(*)
case(sel)
1'b0: out=in[0];
1'b1: out=in[1];
endcase
endmodule
module shreg_n(in, out, clk, rst);
parameter n=4;
input in, rst, clk;
output [n-1:0] out;
wire [n:0] w;
genvar i;
assign w[0]=in;
generate
for(i=0;i<n;i=i+1)
dff ff1(.d(w[i]), .q(w[i+1]), .clk(clk),
.rst(rst));
endgenerate
assign out=w[n:1];
//assign out=w[n];
endmodule
【问题讨论】:
-
@Serge 我看到了评论,我再次告诉你,这是我的第一篇关于这个的帖子,你链接到我的用户帖子甚至与我描述的不接近。
-
我建议您查看另一个问题,因为您的代码片段实际上是从与另一个具有相同名称和错误的错误来源相同的错误来源中剪切并粘贴的。您乘以驱动线
w并且对阻塞分配的使用不正确,对生成块的使用效率低下。所以,先修复它们。在此之后,如果您仍然有问题,请添加“mux2one”的代码。谈论其余的没有意义,因为您的代码首先是错误的。 -
@Serge 这就是我寻求帮助的原因。我不知道如何在那里添加我的信号。我将添加代码,等待
-
@Serge 我还会附上我原来的移位寄存器代码。因为我的工作正常并且没有阻塞分配......
-
根据我的第一个截图,多路复用器的输出应该是我认为可以完成的翻转翻转的输入。但是当我们需要相同的信号时,触发器的输出怎么能成为多路复用器的输入呢?
标签: verilog