我想用verilog做一个单周期的方波 分别是20和10 下面是我写的代码 编译的时候没有问题 但是仿真的结果却不

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想用verilog做一个单周期的方波 分别是20和10 下面是我写的代码 编译的时候没有问题 但是仿真的结果却不相关的知识,希望对你有一定的参考价值。

always@(posedge F10MB)
if(! RESET)
begin
F500KB <= 0;
j <= 0;
end
else if(j==19)
begin
F500KB <= ~F500KB;
end
else if(j==29)
begin
j <= 0;
F500KB <= ~F500KB;
end
else
j <= j+1;

哪位高手帮我看看 谢谢了

第二个回答是正确的
你原来仿真的现象应该是当j==19时,F500KB发生翻转,以后就保持不变了。
原因就是j==19之后没有了加1操作。

下面是我的建议:
1.这个代码应该分成两段来写,代码清晰,而且可以提高工作频率。
2.对于多分支结构,一般采用case结构。这样可以提高工作频率,一般情况下也能节省逻辑资源。

reg[4:0]j;
always@(posedge F10MB)
if(! RESET)
j <= 5'd0;
else if(j==29)
j <= 5'd0;
else
j <= j+5'd1;

always@(posedge F10MB)
if(! RESET)
F500KB <= 0;
else
case(j)
5'd19:
F500KB <= ~F500KB;
5'd29:
F500KB <= ~F500KB;
default:;
endcase

另外不明白你的复位方式,是同步复位吗?建议看一下同步复位、异步复位及 异步复位、同步释放的区别
http://blog.ednchina.com/ilove314/201656/message.aspx
参考技术A module (clk,
clk2,
rst_2,
period);
input clk,clk2,rst_2;
output [9:0] period;

reg [9:0] period;

reg clk_1d;
reg cnt[9:0];

wire clk_pos;

always @ ( posedge clk2 or negedge rst_2 ) begin
if ( rst_2 == 1'b0 ) begin
clk_1d <= 1'b0;
end
else begin
clk_1d <= clk;
end
end

assign clk_pos = clk & (~clk_1d);

always @ ( posedge clk2 or negedge rst_2 ) begin
if ( rst_2 == 1'b0 ) begin
cnt[9:0] <= 10'd0;
end
else if ( clk_pos == 1'b1 ) begin
cnt[9:0] <= 10'd0;
end
else begin
cnt[9:0] <= cnt[9:0] + 10'd1;
end
end

always @ ( posedge clk2 or negedge rst_2 ) begin
if ( rst_2 == 1'b0 ) begin
period[9:0] <= 10'd0;
end
else if ( clk_pos == 1'b1 ) begin
period[9:0] <= cnt[9:0];
end
else begin
;
end
end

endmodule
补充说明:需要测量的时钟周期最多为追加的时钟频率的1024倍。

祝好,
Timothy
参考技术B always@(posedge F10MB)
if(! RESET)
begin
F500KB <= 0;
j <= 0;
end
else if(j==19)
begin
F500KB <= ~F500KB;
j <= j+1;
end
else if(j==29)
begin
j <= 0;
F500KB <= ~F500KB;
end
else
j <= j+1;

matlab实现可调节占空比的方波

我大概讲一下实现的原理:正弦波移相φ,当使得大于sin(φ)的值为1,其他值为-1,占空比就跟这个φ值之间有联系。

占空比原理图如下所示。

结果上图,可以实现调节占空比,方波频率,方波个数。

下面是函数的代码:

function y=squarewav(Vm,f,K,n)      %参数为幅度,频率,占空比,以及波形个数

% 正弦信号
% f = 1000;% 正弦波频率
w = 2*pi*f;% 正弦波角频率
% Vm = 2;% 正弦幅值
u = (0.5-K)*pi;% 相位
N = 4000;% 调节采样率,采样率越大,波形误差越小
M = n*N;
Fs = N*f;% 采样率:1/f_sameple为采样时间间隔,通常以N倍的信号源来表示
t = [0:M]/Fs;% 采样时间向量(始终采N个点,即刚好采信号源的一个周期)
y_sin = Vm*sin(w*t+u);

for i=1:M+1
    if(y_sin(i)>=y_sin(1))
        y_plus(i) = Vm;
    else
        y_plus(i) = -Vm;
    end
end

figure
subplot(2,1,1)
plot(t,y_sin,t,y_plus,\'r\',t,0,\'-\')
subplot(2,1,2)
ylim([-2.5 2.5])
plot(t,y_plus,\'r\',t,0,\'-\')
ylim([-2.5 2.5])

以上是关于我想用verilog做一个单周期的方波 分别是20和10 下面是我写的代码 编译的时候没有问题 但是仿真的结果却不的主要内容,如果未能解决你的问题,请参考以下文章

怎么把1K~10K的方波信号变换成三角波、锯齿波、正弦波?可以提供电路图的最好。

10-20k方波三角波生成器 50-100kPWM方波

10-20k方波三角波生成器 50-100kPWM方波

10-20k方波三角波生成器 50-100kPWM方波

10-20k方波三角波生成器 50-100kPWM方波

Verilog 二选一多路选择器 Modelsim设计。