gpt4 book ai didi

slice - (System)从任意位置切出的Verilog位

转载 作者:行者123 更新时间:2023-12-05 05:37:42 25 4
gpt4 key购买 nike

我想通过从任意位置剪掉一点,使输出总线比输入短 1 位,如下所示:

module jdoodle;
integer i;
reg [8:0] in;
reg [7:0] out;
reg [3:0] idx;

always @*
begin
case(idx)
0: out = in[8:1];
1: out = {in[8:2], in[0]};
2: out = {in[8:3], in[1:0]};
3: out = {in[8:4], in[2:0]};
4: out = {in[8:5], in[3:0]};
5: out = {in[8:6], in[4:0]};
6: out = {in[8:7], in[5:0]};
7: out = {in[8], in[6:0]};
default: out = in[7:0];
endcase
end

initial begin
in = 9'b010101010;
for (i = 0; i < 9; i++)
begin
idx = i; #10;
$display ("%x - %08b", idx, out);
end
$finish;
end
endmodule

我找到了一种写成一行的方法:

module jdoodle;
integer i;
reg [8:0] in;
reg [3:0] idx;

wire [7:0] out;
assign out = ((in >> 1) & (16'h00ff << idx)) | (in & (16'hff00 >> (16-idx)));

initial begin
in = 9'b010101010;
for (i = 0; i < 9; i++)
begin
idx = i; #10;
$display ("%x - %08b", idx, out);
end
$finish;
end
endmodule

但它的可读性不如第一个,但第一个对于较大的公共(public)汽车来说是相当糟糕的。有更优雅的方法吗? verilog 是否也有标准库,比如 c++ 的 std,包含通用模块,如任意旋转?

谢谢

编辑:这是预期的输出:

0 - 01010101
1 - 01010100
2 - 01010110
3 - 01010010
4 - 01011010
5 - 01001010
6 - 01101010
7 - 00101010
8 - 10101010

最佳答案

您可以使用循环处理每一位:

module jdoodle #(parameter INW = 'd9)
(
input [INW-1:0] in,
output[INW-2:0] out,
input [$clog2(INW)-1:0] idx
);
always_comb begin
for(int i = 0; i<INW; i++) begin
if (i < idx) out[i] = in[i];
else if (i > idx) out[i-1] = in[i];
// do nothing if i == idx
end
end
endmodule

关于slice - (System)从任意位置切出的Verilog位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73083599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com