gpt4 book ai didi

c - 用 JK 触发器在 C 中编程纹波计数器

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:41 24 4
gpt4 key购买 nike

我决定尝试用 C 编写触发器。我尝试过 D 触发器和 JK 触发器(还没有预设和清除部分)。

我正在测试通过级联它们是否可以让它们产生一个简单的 4 位纹波计数器。在编写并运行我的代码后,它似乎以以下形式产生了一些非常奇怪的结果:

时钟:01010101010101010101

欧亚:01100110011001100110

单位:01000100010001000100

OUC: 01111000011110000111

OuD: 01010000010100000101

其中 Clk 是输入时钟,OuA 是输出 A、OuB、输出 B 等。如您所见,OuA 和 OuC 的开/关比例似乎可以接受,但 B 和 D 看起来很奇怪!

我的代码是:

#include <stdio.h>
#include <stdlib.h>

void DFF(int Clk, int D, int *Q, int *NQ)
{
if(Clk)
{
*Q = D;
*NQ = !*Q;
}
}

void JKF(int Clk, int J, int K, int *Q, int *NQ)
{
if(Clk&J&(!K))
{
*Q = 1;
*NQ = 0;
}
if(Clk&K&(!J))
{
*Q = 0;
*NQ = 1;
}
if(Clk&J&K)
{
*Q = *NQ;
*NQ = !*Q;
}
}

int main()
{
FILE *fptr;
const int Len = 20;
int Clk = 1, ClkA[Len];
int n, OA[Len], OB[Len], OC[Len], OD[Len];
int Q = 0, NQ = 1;
int Q2 = 0, NQ2 = 1;
int Q3 = 0, NQ3 = 1;
int Q4 = 0, NQ4 = 1;

for(n=0; n<Len; n++)
{
Clk^=1;

JKF(Clk, 1, 1, &Q, &NQ);
JKF(Q, 1, 1, &Q2, &NQ2);
JKF(Q2, 1, 1, &Q3, &NQ3);
JKF(Q3, 1, 1, &Q4, &NQ4);

ClkA[n] = Clk;
OA[n] = Q;
OB[n] = Q2;
OC[n] = Q3;
OD[n] = Q4;
}

fptr = fopen("c:/ff.txt", "w");

fprintf(fptr, "Clk: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", ClkA[n]);
fprintf(fptr, "\nOuA: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OA[n]);
fprintf(fptr, "\nOuB: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OB[n]);
fprintf(fptr, "\nOuC: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OC[n]);
fprintf(fptr, "\nOuD: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OD[n]);

fclose(fptr);

return 0;
}

对于清晰度,我深表歉意,我知道它可能不是特别有效,但有人可以弄清楚输出发生了什么吗?

干杯!

最佳答案

略有改进的版本....

#include <stdio.h>
#include <stdlib.h>

typedef struct _JKFF
{
int clk;
int q;
int nq;
}JKFF;


void JKFFn(int Clk, int J, int K, _JKFF * jkff)
{
if ((Clk != jkff->clk) && !Clk)
{ //Triggering FF on the falling edge
if(J& (!K))
{
jkff->q = 1;
}
if(K &(!J))
{
jkff->q = 0;
}
if(J & K)
{
jkff->q = !jkff->q;
}
jkff->nq = !jkff->q;
}
jkff->clk = Clk;
}


int main()
{
FILE *fptr;
const int Len = 80;
int Clk = 1, ClkA[Len];
int n, OA[Len], OB[Len], OC[Len], OD[Len];

_JKFF jkff[4];
memset(jkff, 0, sizeof(jkff));

for(n=0; n<Len; n++)
{
Clk^=1;

JKFFn(Clk, 1, 1, &jkff[0]);
JKFFn(jkff[0].q, 1, 1, &jkff[1]);
JKFFn(jkff[1].q, 1, 1, &jkff[2]);
JKFFn(jkff[2].q, 1, 1, &jkff[3]);

ClkA[n] = Clk;
OA[n] = jkff[0].q;
OB[n] = jkff[1].q;
OC[n] = jkff[2].q;
OD[n] = jkff[3].q;
}

fptr = fopen("ff.txt", "w");

fprintf(fptr, "Clk: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", ClkA[n]);
fprintf(fptr, "\nOuA: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OA[n]);
fprintf(fptr, "\nOuB: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OB[n]);
fprintf(fptr, "\nOuC: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OC[n]);
fprintf(fptr, "\nOuD: ");
for(n = 0; n<Len; n++) fprintf(fptr, "%d", OD[n]);

fclose(fptr);

return 0;
}

关于c - 用 JK 触发器在 C 中编程纹波计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20779097/

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