verilog写得m序列不知道周期为什么不对?
M序列的周期应该是2^n-1,我参照网上的m序列程序写了一个10阶的m序列,但是仿真了一下发现周期并不是计算的1023,测了一个大概是60.不知道为什么?附代码,求解释!module msequ(clk,m_out,rst);
input clk;
input rst;
output m_out;
reg register;
assign m_out=register;
always @(posedge clk)
begin
if(rst==1)
register<=10'b1000000000;
else
register<={register+register,register};
end
endmodule
修改成这样试试看if(rst==1) register<=10'b1111111111; 试试楼上的方法看看 always @(posedge clk, posedge rst)
常见错误~ Borden 发表于 2014-4-8 18:25
always @(posedge clk, posedge rst)
常见错误~
这个不能算错误吧,他写的是同步复位,你写的是异步复位。 haley 发表于 2014-4-8 20:09
这个不能算错误吧,他写的是同步复位,你写的是异步复位。
其实我也不大懂~{:lol:} 我只知道如果用if,触发列表里面一定要有。如果列表里面没有,那么就只能用冒号结构写到赋值里面,否则综合出来肯定有问题~ register<={register^register,register}; 一位二进制加法和异或是一样的结果。 haley 发表于 2014-4-8 16:32
修改成这样试试看if(rst==1) register
还是不行,周期是2480ns我的仿真时钟周期是40ns,所以m序列的周期是2480/40=62个时钟周期。下面是仿真图~~ 你按照这张图上的电路修改一下代码测试一下周期是多少,这个是9位,这个图肯定没有问题,复位的时候都置一。 本帖最后由 Mortimer 于 2014-4-9 15:56 编辑
haley 发表于 2014-4-9 11:23
你按照这张图上的电路修改一下代码测试一下周期是多少,这个是9位,这个图肯定没有问题,复位的时候都置一 ...
经过测试,你给我的这个图示正确的,周期是20440/40=511=2^9-1。
我之前的反馈弄错了,看本原多项式的时候顺序反了,导致了错误,正确的程序应该是:
module msequ(clk,m_out,rst);
input clk;
input rst;
output m_out;
reg register;
assign m_out=register;
always @(posedge clk)
begin
if(rst==1)
register<=10'b1111111111;
else
register<={register^register,register};
end
endmodule
经过实测,周期也正确了,是1023。
非常谢谢你的回答! Mortimer 发表于 2014-4-9 15:31
经过测试,你给我的这个图示正确的,周期是20440/40=511=2^9-1。
我之前的反馈弄错了,看本原多项式的时 ...
LZ 做的是高斯白噪声?网上很多方法都是用映射的方法将均匀分布转化为高斯分布,请问为什么可以这样转换?求赐教 Borden 发表于 2014-4-8 20:31
其实我也不大懂~ 我只知道如果用if,触发列表里面一定要有。如果列表里面没有,那么就只能用冒号 ...
你是来搞笑的吧?故意误导人家? sungngai 发表于 2014-4-24 11:32
LZ 做的是高斯白噪声?网上很多方法都是用映射的方法将均匀分布转化为高斯分布,请问为什么可以这样转换 ...
我使用Matlab产生白噪声存到ROM中,用M序列产生地址去读取 Borden 发表于 2014-4-8 18:25
always @(posedge clk, posedge rst)
常见错误~
这是systemverilog支持的,好像新版的verilog也支持
页:
[1]