Advertisement
alissonw

myuart1

May 24th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. INCLUDE "lpm_counter.inc";
  2. INCLUDE "majority.inc";
  3. INCLUDE "myshiftreg.inc";
  4.  
  5. SUBDESIGN uart_1
  6. (
  7. in_data, clk : INPUT;
  8. res[7..0], my_par : OUTPUT;
  9. )
  10. VARIABLE
  11. FSM: MACHINE
  12. WITH STATES (silence, start, read, parity, stop);
  13. pr_bit: DFF; %previous bit%
  14. count_read : lpm_counter WITH (LPM_WIDTH = 4); %ñ÷¸ò÷èê ÷àñòîòû; ÷èñëî áèòîâ â ñ÷¸òå(ðàçìåðíîñòü q[]) - 4%
  15. count_vol : lpm_counter WITH (LPM_WIDTH = 3); %ñ÷¸ò÷èê îáúåìà èíôîðìàöèè; ÷èñëî áèòîâ â ñ÷¸òå - 3%
  16. mj_sc : majority;
  17. reg : myshiftreg; %êîëè÷åñòâî òðèããåðîâ - 8%
  18. par : DFFE; %parity%
  19. cen : NODE; %ôëàæîê äëÿ ñ÷¸ò÷èêà%
  20.  
  21. BEGIN
  22. FSM.clk = clk;
  23. count_read.clock = clk;
  24. count_vol.clock = clk;
  25. count_read.cnt_en = cen; %cnt_en îòêëþ÷àåò ñ÷¸ò÷èê ïðè = 0%
  26. pr_bit.clk = clk;
  27. reg.clk = clk;
  28. mj_sc.clk = clk;
  29. par.clk = clk;
  30. my_par = par.q;
  31. res[] = reg.q[];
  32.  
  33. CASE fsm IS
  34.     WHEN silence =>
  35.         count_read.sclr = GND; %sclr îòâå÷àåò çà î÷èñòêó ñ÷¸ò÷èêà íà ñëåäóþùåì àêòèâíîì ôðîíòå òàêòà%
  36.         IF ((pr_bit.q == VCC) & (in_data == GND)) THEN %åñëè âñòðåòèëè ìîë÷àíèå ïåðåä ñòàðòîâûì áèòîì, òî ïåðåõîäèì íà ñîñòîÿíèå ñòàðòà%
  37.             cen = VCC;
  38.             pr_bit.d = in_data;
  39.             fsm = start;
  40.         ELSE   
  41.             pr_bit.d = in_data;
  42.             cen = GND; 
  43.         END IF;
  44.     WHEN start =>
  45.         count_read.cnt_en = VCC; %èçìåíÿåì ôëàæîê%
  46.         count_vol.sclr = VCC;
  47.         IF (count_read.q[] == 9) THEN
  48.             IF (in_data == VCC) THEN
  49.                 fsm = read;
  50.             ELSE
  51.                 fsm = silence;
  52.                 count_read.sclr = VCC;
  53.             END IF;
  54.         END IF;
  55.     WHEN read =>
  56.         count_read.cnt_en = VCC;
  57.         count_vol.sclr = GND;
  58.         %íåîáõîäèìî ïðîâåðèòü äàííûå ñ ïîìîùüþ ìàæîð. ñõåìû: ïðèìåðíî â ñåðåäèíå êàæäîãî âõîäíîãî òàêòà ïðîèñõîäèò 3 ñ÷èòûâàíèå è èõ ñîîòâ. ñðàâíåíèå%
  59.         IF (count_read.q[] == 7) THEN
  60.             mj_sc.sel[] = 0;
  61.             mj_sc.data0 = in_data;
  62.         ELSE
  63.             IF (count_read.q[] == 8) THEN
  64.                 mj_sc.sel[] = 1;
  65.                 mj_sc.data1 = in_data;
  66.             ELSE
  67.                 IF (count_read.q[] == 9) THEN
  68.                     mj_sc.sel[] = 2;
  69.                     mj_sc.data2 = in_data;
  70.                     reg.load = VCC;
  71.                     reg.data = mj_sc.q;
  72.                     IF (count_vol.q[] == 7) THEN
  73.                         fsm = parity;
  74.                     ELSE
  75.                         count_vol.cnt_en = VCC;
  76.                     END IF;
  77.                 ELSE
  78.                     reg.load = GND; % load ïðè 0 îòâå÷àåò çà àêòèâàöèþ ñäâèãà; 1 - load operation %
  79.                     count_vol.cnt_en = GND;
  80.                 END IF;
  81.             END IF;
  82.         END IF;
  83.     WHEN parity =>
  84.         count_read.cnt_en = VCC;
  85.         reg.load = GND;
  86.         IF (count_read.q[] == 8) THEN
  87.             par.d = in_data;
  88.             par.ena = VCC;
  89.             fsm = stop;
  90.         END IF;
  91.     WHEN stop =>
  92.         par.ena = GND;
  93.         count_read.cnt_en = VCC;
  94.         IF (count_read.q[] == 8) THEN
  95.             fsm = silence;
  96.             pr_bit.d = in_data;
  97.             count_vol.sclr = VCC;
  98.             count_read.sclr = VCC;
  99.             cen = GND;
  100.         END IF;
  101.     END CASE;
  102. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement