verilog代码求救
inputclk;
reg[3:0] state;
input [7:0] x_input;
output[7:0] ra0,rb0,rc0,rd0,ra1,rb1,rc1,rd1;
reg[7:0] va,vb,vc,vd;
reg[7:0] ra0,rb0,rc0,rd0,ra1,rb1,rc1,rd1;
parameter
IDLE0='d0,IDLE1='d1,IDLE2='d2,IDLE3='d3,A='d4,B='d5,C='d6,D='d7,E='d8;
always@(posedge clk)
casex(state)
IDLE0:begin
{va}={x_input};
state<=IDLE1;
end
IDLE1:begin
{vb}={x_input};
state<=IDLE2;
end
IDLE2:begin
{vc}={x_input};
state<=IDLE3;
end
IDLE3:begin
{vd}={x_input};
state<=A;
{ra0,rb0,rc0,rd0}={va,vb,vc,vd};
end
A:begin
sort2(va,vc);
state<=B;
end
B:begin
sort2(vb,vd);
state<=C;
end
C:begin
sort2(va,vb);
state<=D;
end
D:begin
sort2(vc,vd);
state<=E;
end
E:begin
sort2(vb,vc);
{ra1,rb1,rc1,rd1}={va,vb,vc,vd};
state<=IDLE0;
end
default:state<=IDLE0;
endcase
task sort2;
inout[7:0] x,y;
reg[7:0] tmp;
if(x>y)
begin
tmp=x;
x=y;
y=tmp;
end
endtask
endmodule
这是我在网络上看到的泡泡排序法程式码,但是身为新手的我实在看不懂,虽然我知道是用状态机写成但是他的写法跟书上看到的状态机写法不大相同。举个例来说
IDLE0:begin
{va}={x_input};
state<=IDLE1;
end
一般的状态机是用IF判断但是他并没有这么做
可以告诉我这段的意思是什么吗?
另外
A:begin
sort2(va,vc);
state<=B;
end
中的sort2(va,vc)是代表什么呢
sort2就是如果x>y,x,y交换位置。
不是说状态机一定要有if判断。
这个状态机前4个idle状态传进来4个数,a、b、c、d。
然后比较a、c,把两者之间小的数放在a里;比较b、d,把小的数放在b里;
第一轮比较完毕,a、b存放两个较小的数,b、d中存放两个较大的数,
然后a、b再比较大小,c、d再比较大小,这样就得到a、b、c、d依次变大的排列了
IDLE0:begin
{va}={x_input};
state<=IDLE1;
抱歉请问这个IDLE 0是在什么条件下会变成IDLE1的状态呢?
是 {va}={x_input};时IDLE 0变IDLE 1吗?
另外,请问为什么我在verilog书中都没找着sort这个指令呢
不严格的书写习惯很容易导致综合后的硬件功能与设计功能不一致。建议代码规范。
对于冒泡的方法: 一般采用找前导0或1的方法。 依次检出数据。采用流水线结构。很多仲裁逻辑采用。
这个代码可以综合吗?待会去试试
我用vivado是可以綜合的
所以你的意思是这段代码是不好的吗?
标题
这种是最简单的状态机,中间没有条件转移,也就是你说的if判断。
sort是自己定义的一个任务task ,和c里的函数调用类似,找本书看看函数和任务那一章,应该都有讲的。
还有这个不是冒泡排序法,也不推荐使用这种结构,数据输入完要等4个时钟周期才能输出排序的数据,一般都要立刻输出的。
这种没复位没使能信号的编码风格确实不好
该代码对于 Altera 或者 XILINX 的综合工具将是一个极大的挑战。很容易综合成错误的逻辑。 FPGA厂家都给出了应该如何书写规范的代码示例,以便于综合器很准确的实现设计者的意图。换句话说这代码写的相当的烂!
但是我用vivado 有综合成功且我已经用他提供的testbench验证是有排序成功的
It's possible to process just in a clock cycle.
Good luck.
这段代码写的很不符合规范,