-1

次のコードは、非同期カウンター用に記述されています。プログラムは正常にコンパイルされますが、 の後にカウンター値が増加しません1。私は何を間違っていますか?

コードは次のとおりです。

//TOP

module CounterWithDivider(clk,reset,temp,q);

input clk,reset;
output [3:0]q;
output reg [3:0]temp;

reg [3:0]clkDivider;

TFF a(clkDivider,clk,reset,q[0]);
TFF b(clkDivider,q[0],reset,q[1]);
TFF c(clkDivider,q[1],reset,q[2]);
TFF d(clkDivider,q[2],reset,q[3]);

always @(posedge clk or negedge reset)
begin

if(~reset || clkDivider==12)
  clkDivider<=0;

else

if(clk)
begin

 clkDivider<=clkDivider+1;
 temp<=clkDivider;

end

end

endmodule

// T フリップフロップ

module TFF(clkDivider,clk,reset,q);

input clk,reset;
input [3:0]clkDivider;
output reg q;

always @(posedge clk or negedge reset)
begin

if(~reset)
  q<=0;

else

if(clkDivider==11)
  q<=1;


end

endmodule
4

2 に答える 2

2

T-FlipFlop、またはトグルフロップは、有効になっているときに出力をトグルする必要があります。

if(clkDivider==11)
  q<=1;

に置き換え q<=1q<=~q、有効にしたときに切り替えます。

于 2013-03-03T17:37:37.730 に答える
0

おっしゃるとおり、これは非同期カウンターです。Verilog シミュレーションが意図したとおりに動作しない理由は、TFFインスタンスが別のクロック信号を使用して bデータ入力 ( ) をサンプリングしようとしているためです。は信号 によってクロックされていますが、別のクロック信号 ( ) を使用してサンプリングしようとしています。clkDividerclkDividerclkq[0]

clkDivider 信号を他の 3 つのクロック ドメインのそれぞれに同期させる方法を見つけるか、完全に同期したデザインを使用する必要があります。

于 2013-03-03T18:49:25.633 に答える