NRZ
NRZ指的是不歸零碼(NRZ,Non-Return to Zero)
CMI
CMI(Coded Mark Inversion)碼是傳號反轉碼的簡稱,與雙相碼類似,它也是一種雙極性二電平碼。其編碼規則是“1”碼交替用“11”和“00”兩位碼表示;“0”碼固定地用“01”表示。

不確定代碼的正確性,只是提供一個思路
1 /////////////////////////////////////////////////////////// 2 // module test(clk,out1,out2,out3,clk_1,clk_2,clk_3); 3 module test(clk,out1,out2,out3); 4 input clk ;//聲明輸入硬件的時鍾信號 5 6 output out1,out2,out3;//聲明三個輸出 7 8 reg out1=1'b0,out2=1'b0,out3=1'b0;//三個輸出初始化 9 10 reg [4:0] counter1 =4'd0 ;//初始化學號輸出時序計數器 11 reg [4:0] counter2 =2'd0 ;//初始化cmi碼計數器 12 reg [4:0] counter3 =4'd0 ; 13 14 reg [1:0] t1= 2'b00; 15 reg t0 = 1'b0; //編碼中間量 16 reg r0 = 1'b0,r1 = 1'b0,r11 = 1'b0//譯碼中間量 17 18 reg clk_1= 1'b0; 19 reg clk_2= 1'b0; 20 //////////////////////////////////////////////////////////// 21 always @(posedge clk) //產生240k時鍾 22 if(counter1 == 3'd7 ) 23 begin 24 counter1 <= 3'd0; 25 clk_1 <= ~clk_1; 26 end 27 else 28 counter1 <= counter1 + 1'd1; 29 ////////////////////////////////////////////////////// 30 always @(posedge clk) //產生480k時鍾 31 if(counter2 == 2'd3 ) 32 begin 33 counter2 <= 2'd0; 34 clk_2 <= ~clk_2; 35 end 36 else 37 counter2 <= counter2 + 1'd1; 38 ///////////////////////////////////////////////////////// 39 always @(posedge clk_1) // 產生NRZ碼 , 學號0072 40 if(counter3 == 4'd14) 41 begin 42 counter3 <= 4'd0; 43 out1 <= 1'b0; 44 end 45 else 46 begin 47 casez (counter3) 48 4'd1011 : out1 <= 1'b1; 49 4'b1000 : out1 <= 1'b1; 50 default : out1 <= 1'b0; 51 endcase 52 counter3 <= counter3 + 1'd1; 53 end 54 ////////////////////////////////////////////////// 55 always @(posedge clk_2)// CMI編碼 56 if(out1 == 1'b0)//當學號輸出為0時 57 begin 58 if(t0 == 0)//因為cmi編碼0為01,為兩位,所以取一個標志位t0,當t0為0時,輸出01的第一位,t0為1時,輸出01的第二位。 59 out2 <= 0; 60 else 61 out2 <= 1; 62 t0 <=~t0; 63 end 64 else 65 begin 66 if(t1[1] == 0) 67 //這里與上面類似,因為1為00和11,交替變換,所以標志位t1為兩位,當學號為1時,一開始想輸出為11,輸出為1,后面00加01,為01,輸出為0, 68 //再后面學號再次為1時,01加01為10,這時輸出為1,后面10加01為11,輸出為1,之后再if結束后加01為00 69 out2 <= 1; 70 else 71 out2 <= 0; 72 t1 <= t1+2'b01; 73 end 74 /////////////////////////////////////////////////// 75 always @(posedge clk_2) // CMI譯碼 76 if(r11 == 1'b0)//將out2的輸出即cmi編碼的值賦給r0和r1,二者取與,結果為0則編碼結果為0,結果為1則編碼結果為1 77 begin 78 out3 <= (r0 ^ r1);//r11這里相當於一個分配out2的標志位,因為out2的輸出只能一位一位輸出,所以r11為0時,將out2的值給r0,r11為1時,將out2的值給r1 79 r0 <= out2; 80 r11 <= ~r11; 81 end 82 else 83 begin 84 r1 <= out2; 85 r11 <= ~r11; 86 end 87 88 endmodule
